Почему мне нужно указать разрешение для обрезки? - PullRequest
0 голосов
/ 30 июля 2009

Я написал метод обрезки изображений в 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;
}

Ответы [ 2 ]

1 голос
/ 30 июля 2009

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

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

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

0 голосов
/ 30 июля 2009

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

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

привет

...