2008-12-02 11 views
8

ich einige C# -Code haben, die Bilder die Größe, die ich denke, ist ziemlich typisch:Bild in .Net mit Anti-Aliasing-Größe ändern

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); 

Das Problem besteht darin, dass die resultierenden Bilder sind klar aliased und Änderungen an der InterpolationMode und SmoothingMode-Eigenschaften scheinen keinen Unterschied zu machen.

Irgendwelche Zeiger?

Antwort

0

Das Problem ein anderer Ort sein könnte. Ich benutze einen ähnlichen Code, um die Größe von Bildern, und es funktioniert ok, aber der größte Unterschied ist, dass, wenn Sie das Bild speichern Sie müssen Qualität (jpeg) angeben:

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

Anti-Aliasing hat nichts zu tun mit Rastergrafiken. Es ist nur für Vektorgrafiken anwendbar. Offensichtlich ist ein Bild eine Rastergrafik.

Sie müssen sich den Interpolationsmodus ansehen.

+0

Hallo, imho Ihre Definition von Anti-Aliasing ist nicht völlig korrekt. Es ist keine Raster-Vektor-Grafik-Sache. –

+0

Aus Wikipedia: "In der digitalen Signalverarbeitung ist Anti-Aliasing die Technik zur Minimierung der Verzerrungsartefakte, die als Aliasing bezeichnet werden, wenn ein hochauflösendes Signal mit einer niedrigeren Auflösung dargestellt wird." –

+1

Sorry, ich habe mich im Falle von .Net Graphics.SmoothingMode geirrt. Diese Eigenschaft ist nur für Vektorgrafiken relevant. –

18

Es dreht sich der Code war einfach falsch. Bei der Größenänderung des Bilds ohne Interpolation im Bitmap-Konstruktor wurde versucht, die Größe dieser Version problemlos auf die Größe zu ändern, die sie bereits hatte. Hier ist der geänderte Code:

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)); 

Soweit Anti-Aliasing geht, der wichtigste Parameter ist graph.InterpolationMode.

Danke.