2008-12-02 15 views
8

Mam trochę kodu C#, który zmienia rozmiar obrazów, które moim zdaniem jest dość typowe:Obraz zmiana rozmiaru w .NET z antyaliasingu

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

Problemem jest to, że powstałe obrazy są wyraźnie aliasem i zmiany w InterpolationMode i Właściwości SmoothingMode wydają się nie mieć znaczenia.

Jakieś wskazówki?

Odpowiedz

0

Problem może być kolejnym miejscem. Używam podobny kod do zmiany rozmiaru obrazów i działa ok, ale największą różnicą jest to, że podczas zapisywania obrazu trzeba określić jakość (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

Anti-aliasing nie ma nic wspólnego z grafiki rastrowej. Dotyczy tylko grafiki wektorowej. Oczywiście obraz jest grafiką rastrową.

Musisz spojrzeć na InterpolationMode.

+0

Witam, twoja definicja wygładzania nie jest całkowicie poprawna. To nie jest grafika rastrowa a wektorowa. –

+0

Z Wikipedii: "W obróbce sygnału cyfrowego antyaliasing jest techniką minimalizacji artefaktów zniekształceń zwanych aliasingiem, gdy reprezentują sygnał o wysokiej rozdzielczości w niższej rozdzielczości." –

+1

Niestety, myliłem się w przypadku .Net Graphics.SmoothingMode. Ta właściwość dotyczy tylko grafiki wektorowej. –

18

Okazało się, że kod był po prostu nieprawidłowy. W rzeczywistości zmienił rozmiar obrazu bez interpolacji w konstruktorze Bitmap, a następnie próbował płynnie zmienić rozmiar tej wersji do rozmiaru, w jakim już był. Oto zmieniony kod:

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

Jeśli chodzi o anty-aliasing idzie, najważniejszym parametrem jest graph.InterpolationMode.

Dzięki.