Зачем мне нужно указывать разрешение для обрезки?
-
05-07-2019 - |
Вопрос
Я написал метод обрезки изображений на 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.
с уважением