Как решить проблему с сероватой рамкой при масштабировании растрового изображения с помощью GDI + - PullRequest
1 голос
/ 08 января 2010

Я пытаюсь уменьшить растровое изображение с помощью GDI +, выполнив следующие действия:

Bitmap newImage = new Bitmap(NewWidth, NewHeight, Im.PixelFormat);           
Graphics g = Graphics.FromImage(newImage);

g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

g.ScaleTransform(0.1, 0.1); // 10%
g.DrawImage(Im, 0, 0, Im.Width, Im.Height);

Im - исходное изображение, NewWidth и NewHeight - 10% или исходное изображение. Я проверил это на изображении 1000x1000 (уменьшив его до 100x100)

Масштабирование выполняется правильно с высоким качеством, как и было обещано, но по какой-то причине слева, справа и сверху есть серая рамка (внизу нет).

Полагаю, это связано с тем, что все границы изображения являются белыми, а цвет "снаружи" растрового изображения по умолчанию черный, поэтому часть черного по умолчанию смешивается с масштабной интерполяцией.

Я искал способ установить цвет фона по умолчанию на белый (белый подойдет хорошо), но не смог его найти нигде ..

Моя альтернатива - заполнить границу белой рамкой, уменьшить масштаб изображения и обрезать его, но мне было интересно, есть ли более простой и менее ресурсоемкий способ?

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 08 января 2010

Хорошо. После еще нескольких копаний я нашел это ..

System.Drawing.Imaging.ImageAttributes Att = new System.Drawing.Imaging.ImageAttributes();
Att.SetWrapMode(System.Drawing.Drawing2D.WrapMode.Clamp, System.Drawing.Color.White); 
g.DrawImage(Im, new Rectangle(0,0,Im.Width,Im.Height), 0, 0, Im.Width, Im.Height, GraphicsUnit.Pixel, Att);
0 голосов
/ 08 января 2010

Попробуйте добавить альфа-оверлей с дополнительным прозрачным пикселем или двумя со всех сторон.Это должно дать лучший результат, чем использование явной или подразумеваемой сплошной цветовой рамки.Хотя преобразование в RGBA и добавление фрейма сопряжено с более высокими затратами на выполнение, если вы действительно заинтересованы в высоком качестве и не хотите переключать графические библиотеки, это может быть правильным решением.

...