2008-12-02 49 views
8

Tôi đã có một số mã C# mà thay đổi kích thước hình ảnh mà tôi nghĩ là khá điển hình:hình ảnh thay đổi kích thước trong Net với Antialiasing

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

Vấn đề là những hình ảnh kết quả được aliased rõ ràng và thay đổi đối với InterpolationMode và Thuộc tính SmoothingMode dường như không tạo ra sự khác biệt nào.

Mọi con trỏ?

Trả lời

0

Vấn đề có thể là một nơi khác. Tôi sử dụng mã tương tự để thay đổi kích thước hình ảnh và nó hoạt động ok, nhưng sự khác biệt lớn nhất là khi bạn lưu hình ảnh bạn phải xác định chất lượng (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 có gì để làm với đồ họa raster. Nó chỉ áp dụng cho đồ họa vector. Rõ ràng, một hình ảnh là một hình ảnh raster.

Bạn cần xem xét InterpolationMode.

+0

Xin chào, Imho định nghĩa của bạn về chống răng cưa không hoàn toàn chính xác. Nó không phải là một đồ họa raster vs vector đồ họa. –

+0

Từ Wikipedia: "Trong xử lý tín hiệu kỹ thuật số, chống răng cưa là kỹ thuật giảm thiểu hiện vật biến dạng được gọi là răng cưa khi biểu diễn tín hiệu có độ phân giải cao ở độ phân giải thấp hơn". –

+1

Xin lỗi, tôi đã sai trong trường hợp của .Net Graphics.SmoothingMode. Thuộc tính đó chỉ phù hợp với đồ họa vector. –

18

Nó biến mã đã sai. Nó đã thực sự thay đổi kích cỡ hình ảnh mà không cần nội suy trong hàm tạo bitmap, và sau đó cố gắng thay đổi kích thước phiên bản đó thành kích thước mà nó đã có. Đây là mã được sửa đổi:

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

Theo như chống răng cưa, thông số quan trọng nhất là graph.InterpolationMode.

Cảm ơn.

Các vấn đề liên quan