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

ьзование некоторого стандартного стандартного кода 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-й столбец стал светлее.

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

..и HighQualityBilinear

Это сообщение на форуме, кажется, кто-то с той же проблемой:DrawImage с острыми краями

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

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

 russau24 янв. 2011 г., 07:09
Мой вопрос является дубликатом этого:stackoverflow.com/questions/1890605/..., Я рад, что мой вопрос был удален / закрыт
 Cody Gray♦23 янв. 2011 г., 05:32
Это сглаживание фона вместе с изображением. Идея состоит в том, чтобы получить как можно более качественное гладкое покрытие. Некоторые называют это ошибкой, другие - особенностью. В любом случае, похоже, что на ваш вопрос уже был дан ответ в ветке форума, на которую вы ссылались. Ты пробовалаHighQualityBilinear?
 russau23 янв. 2011 г., 06:52
обновил вопрос с помощью HighQualityBilinear. В ветке форума упоминается только неуправляемое исправление, и один из авторов соглашается, что это «давняя ошибка в GDI +, вызванная, я полагаю, каким-то ленивым разработчиком, который не справляется должным образом с граничной ситуацией».

Ответы на вопрос(3)

Решение Вопроса

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

using (ImageAttributes wrapMode = new ImageAttributes())
{
    wrapMode.SetWrapMode(WrapMode.TileFlipXY);
    g.DrawImage(input, rect, 0, 0, input.Width, input.Height, GraphicsUnit.Pixel, wrapMode);
}
 NightElfik14 сент. 2014 г., 03:41
Это на самом деле работает! Спасибо!

HighQualityBicubic изменение размера (нарисовано на белом фоне).

Вы можете видеть полупрозрачные пиксели на краях линий. Вы можете назвать это ошибкой. Я думаю, что это просто техническая деталь 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");
 russau26 янв. 2011 г., 23:46
Кстати, вот хороший подход для удаления прозрачных пикселей:stackoverflow.com/questions/1890605/...
 russau23 янв. 2011 г., 23:57
мое понимание шага 2 -Bitmap b2 получает исходное изображение @ 2,2. Финальная ничьяDrawImage вырезки из b2 @ 4,4. Будут ли потеряны 2 пикселя по верхнему и левому краям? Я понимаю, что это были «живые» прозрачные пиксели, но то, что я делаю, не сработает, если какое-либо оригинальное изображение будет потеряно.
 9dan24 янв. 2011 г., 03:23
@ Руссау, тебе решать, я думаю. Вы могли бы сохранитьb2 растровое изображение в файл и сравнить с оригиналом. Поскольку он был интерполирован, не ясно, что эти полупрозрачные пиксели принадлежат нашему предполагаемому целевому изображению.
 russau23 янв. 2011 г., 10:23
Сглаживание имеет смысл, когда вы рисуете изображение на большом фоне. Это спорно, если это имеет смысл, когда край изображения находится на край фона - или фоне такой же размер, как изображение.
 Cody Gray♦23 янв. 2011 г., 09:49
+1 Microsoft явно рекомендует ваше первое решение в следующей статье:Как: использовать режим композитинга для управления альфа-смешиванием, В этой статье также объясняется, что это ни ошибка, ни «технический артефакт». Сглаживание изображения с фоном - это поведение по умолчаниюпо дизайну, Если вы хотите что-то еще, вы должны попросить об этом.

чтобы лучше сочетаться с фоном по краям.

Ваш ответ на вопрос