2008-12-02 2 views
8

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

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, похоже, не имеют никакого значения.

Любые указатели?

ответ

0

Проблема может быть в другом месте. Я использую подобный код, чтобы изменить размер изображения, и он работает нормально, но самая большая разница в том, что при сохранении изображения вы должны указать качество (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); 
2

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

Вы должны посмотреть InterpolationMode.

+0

Здравствуйте, imho Ваше определение сглаживания не совсем правильно. Это не растровая и векторная графика. – 2008-12-02 11:22:28

18

Это код, который был просто неправильным. Фактически это изменение размера изображения без интерполяции в конструкторе 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.

Спасибо.