InterpolationMode HighQualityBicubic представляет артефакты на краю измененных размеров изображений - PullRequest
10 голосов
/ 23 января 2011

Использование некоторого стандартного стандартного кода C # для изменения размера изображения и размещения его на цветном фоне

Image imgToResize = Image.FromFile(@"Dejeuner.jpg");
Size size = new Size(768, 1024);
Bitmap b = new Bitmap(size.Width, size.Height);

Graphics g = Graphics.FromImage((Image)b);
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.FillRectangle(Brushes.Green, 0, 0, size.Width, size.Height);

g.DrawImage(imgToResize, new Rectangle(0,150,768, 570));
b.Save("sized_HighQualityBicubic.jpg");

Результат имеет забавный артефакт в 0-м и 1-м столбцахпиксели.Похоже, что 0-й столбец смешан с цветом фона, а 1-й столбец стал светлее.

См. Увеличенный верхний левый угол для высококачественных бикубических и бикубических.

HighQualityBicubic

Bicubic

.. и HighQualityBilinear

HighQualityBilinear

В этом сообщении на форуме, похоже, возникла та же проблема: DrawImage сострые края

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

Обновление: очень похожий разговор происходит в комментариях здесь: GDI + InterpolationMode

Ответы [ 3 ]

14 голосов
/ 29 ноября 2011

Бесстыдно поднимая ответ с на этот вопрос , я нашел это исправляет:

using (ImageAttributes wrapMode = new ImageAttributes())
{
    wrapMode.SetWrapMode(WrapMode.TileFlipXY);
    g.DrawImage(input, rect, 0, 0, input.Width, input.Height, GraphicsUnit.Pixel, wrapMode);
}
5 голосов
/ 23 января 2011

Ниже приводится результирующее изображение типичного HighQualityBicubic изменения размера (нарисовано на белом фоне).

Хостинг imgur.com

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

1) Запретить сглаживание.

...
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
// add below line
g.CompositingMode = CompositingMode.SourceCopy;
...

С помощью CompositingMode.SourceCopy результирующего изображения будет отображаться видимый контур, но не сглаживание с пикселями фона.

2) Полупрозрачная область кадрирования

Вы можете полностью игнорировать эти полупрозрачные пиксели.

Image imgToResize = Image.FromFile(@"Dejeuner.jpg");
Size size = new Size(768, 1024);
Bitmap b = new Bitmap(size.Width, size.Height);

Graphics g = Graphics.FromImage((Image)b);
g.FillRectangle(Brushes.Green, 0, 0, size.Width, size.Height);

Bitmap b2 = new Bitmap(768 + 8, 570 + 8);
{
    Graphics g2 = Graphics.FromImage((Image)b2);
    g2.Clear(Color.White);
    g2.InterpolationMode = InterpolationMode.HighQualityBicubic;
    g2.DrawImage(imgToResize, new Rectangle(2, 2, 768 + 4, 570 + 4));
}

g.CompositingMode = CompositingMode.SourceCopy;
g.DrawImage(b2, 0, 150, new Rectangle(4, 4, 768, 570), GraphicsUnit.Pixel);
b.Save("sized_HighQualityBicubic.jpg");
3 голосов
/ 23 января 2011

Установите для свойства PixelOffsetMode значение HighQuality, чтобы лучше сочетаться с фоном по краям.

...