Зачем мне нужно указывать разрешение для обрезки?

StackOverflow https://stackoverflow.com/questions/1204846

Вопрос

Я написал метод обрезки изображений на C #.Он делает это, создавая новое растровое изображение и рисуя на нем указанный прямоугольник (область, подлежащую обрезке) из исходного изображения.

Для изображений, которые я пробовал использовать, это приводило к неправильным результатам.Размер получившегося изображения был правильным, но содержание было таким же.Это было похоже на то, как если бы изображение было увеличено в 2 раза, а затем обрезано.В конце концов, добавление этой строки исправило это:

result.setResolution(72, 72)

Но зачем мне нужно разрешение?Я просто работаю с пикселями, никогда с дюймами или сантиметрами.Кроме того, каким тогда было бы правильное разрешение?

Полный код - это метод расширения:

public static Bitmap Crop(this Image image, int x, int y, int width, int height) {
    Bitmap result = new Bitmap(width, height);
    result.SetResolution(72, 72);

    // Use a graphics object to draw the resized image into the bitmap.
    using (Graphics graphics = Graphics.FromImage(result)) {
        // High quality.
        graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
        graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
        graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
        // Draw the image into the target bitmap.
        graphics.DrawImage(image, 0, 0, new Rectangle(x, y, width, height), GraphicsUnit.Pixel);
    }

    return result;
}
Это было полезно?

Решение

Вы используете неправильную перегрузку DrawImage. Вы должны использовать тот, где вы указываете Src и Dest ректы.

graphics.DrawImage(image, new Rectangle(0, 0, width, height), new Rectangle(x, y, width, height), GraphicsUnit.Pixel);

Попробуйте и дайте мне знать в комментариях, если это не сработает.

Другие советы

я подозреваю, что ответ кроется в том, как библиотека на самом деле вносит изменения.он просто копирует и вставляет вокруг некоторых блоков памяти.разрешение определяет количество бит/ байт, используемых на пиксель.чтобы знать, сколько байт ему нужно скопировать, ему нужно знать, сколько бит / байт используется на пиксель.

поэтому я думаю, что это простое умножение, за которым следует memcopy.

с уважением

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top