Изменение размера изображения в .Net с сглаживанием - PullRequest
8 голосов
/ 02 декабря 2008

У меня есть некоторый код C #, который изменяет размеры изображений, которые я считаю довольно типичными:

Bitmap bmp = new Bitmap(image, new Size(width, height));
Graphics graphics = Graphics.FromImage(bmp);
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.SmoothingMode = SmoothingMode.AntiAlias;
graphics.DrawImage(bmp, width, height);

Проблема заключается в том, что результирующие изображения четко совмещены, и изменения свойств InterpolationMode и SmoothingMode, похоже, не имеют значения.

Есть указатели?

Ответы [ 5 ]

18 голосов
/ 02 декабря 2008

Оказывается, код был просто неверным. Фактически он изменял размер изображения без интерполяции в конструкторе Bitmap, а затем пытался плавно изменить размер этой версии до того размера, который уже был. Вот исправленный код:

Bitmap bmp = new Bitmap(width, height);
Graphics graph = Graphics.FromImage(bmp);
graph.InterpolationMode = InterpolationMode.High;
graph.CompositingQuality = CompositingQuality.HighQuality;
graph.SmoothingMode = SmoothingMode.AntiAlias;
graph.DrawImage(image, new Rectangle(0, 0, width, height));

Что касается сглаживания, то наиболее важным параметром является graph.InterpolationMode.

Спасибо.

2 голосов
/ 02 декабря 2008

Сглаживание не имеет ничего общего с растровой графикой. Это применимо только к векторной графике. Очевидно, что изображение является растровой графикой.

Вам нужно взглянуть на InterpolationMode.

2 голосов
/ 02 декабря 2008

Попробуйте graphics.DrawImage (bmp, 0, 0, width, height); Также проверьте это MSDN Статья об интерполяции .

0 голосов
/ 02 декабря 2008

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

ImageCodecInfo[] codecs=ImageCodecInfo.GetImageEncoders();
ImageCodecInfo codec = null;
for (int i = 0; i<codecs.Length;i++)
{
  if(codecs[i].MimeType.Equals("image/jpeg"))
    codec = codecs[i];
}

EncoderParameters encoderParametersInstance = null;

if (codec!=null)
{
  Encoder encoderInstance=Encoder.Quality;
  encoderParametersInstance = new EncoderParameters(2);
  //100% quality, try different values, around 80-90 gives good results.
  EncoderParameter encoderParameterInstance=new EncoderParameter(encoderInstance, 100L);
  encoderParametersInstance.Param[0]=encoderParameterInstance;
  encoderInstance=Encoder.ColorDepth;
  encoderParameterInstance=new EncoderParameter(encoderInstance, 24L);
  encoderParametersInstance.Param[1]=encoderParameterInstance;
}

MemoryStream ms = new MemoryStream();
resizedImage.Save(ms, codec, encoderParametersInstance);
0 голосов
/ 02 декабря 2008

В CodeProject есть статья, описывающая улучшенный метод сглаживания:

http://www.codeproject.com/KB/GDI-plus/AntiAliasingIssues.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...