2010-04-20 92 views
5

我见过很多人试图编写自己的图像转换技术。它通常看起来非常复杂,并最终使用GDI +函​​数调用,并操纵图像的位。这让我想知道如果我在保存图像时错过了.NET的图像转换调用的简单性。这里是我的代码:是否足够使用.NET Image Conversion?

Bitmap tempBmp = new Bitmap("c:\temp\img.jpg"); 
Bitmap bmp = new Bitmap(tempBmp, 800, 600); 
bmp.Save(c:\temp\img.bmp, //extension depends on format 
    ImageFormat.Bmp) //These are all the ImageFormats I allow conversion to within the program. Ignore the syntax for a second ;) 
    ImageFormat.Gif) //or 
    ImageFormat.Jpeg) //or 
    ImageFormat.Png) //or 
    ImageFormat.Tiff) //or 
    ImageFormat.Wmf) //or 
    ImageFormat.Bmp)//or 
    ); 

这就是我在图像转换中所做的一切。只需设置图像保存位置,并将其传递给ImageFormat类型即可。我已经测试了它的最佳效果,但是我想知道如果我在这个简单的格式转换中丢失了什么,或者如果这足够了?

回答

5

System.Drawing.Imaging确实为您提供了对图像压缩的额外控制,如果您通过JPEG编码解码器并为质量设置编码器参数(实质上为百分比保留)。

下面是我使用参数"image/jpeg"获取JPEG编解码器的功能。 (这是不相关的压缩本身,但Image.Save重载接受EncoderParameters需要ImageCodecInfo而不是ImageFormat。)

// assumes an encoder for "image/jpeg" will be available. 
public static ImageCodecInfo GetCodec(string mimeType) 
{ 
    ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders(); 

    for(int i = 0; i < encoders.Length; i++) 
     if(encoders[i].MimeType == mimeType) 
      return encoders[i]; 

    return null; 
} 

然后,你可以保存图像之前设置编码器参数。

EncoderParameters ep = new EncoderParameters(2); 
ep.Param[0] = new EncoderParameter(Encoder.Quality, percentRetention); // 1-100 
ep.Param[1] = new EncoderParameter(Encoder.ColorDepth, colorDepth); // e.g. 24L 

(还有其他编码器参数—请参阅文档。

所以,把它放在一起,你可以说

image.Save(outFile, GetCodec("image/jpeg"), ep); 

(我存储在静态值的编解码器和参数,因为它们被用来一遍又一遍,但我想在这里简化的例子)

希望这有助于!

编辑:如果你缩放图像,你也有一些质量控制。是的,这是非常“黑匣子”,但我发现它运作良好。以下是“好&慢”的设置(你需要调用的DrawImage之前设置的,但你可以看一下“快速&脏”的版本。

// good & slow 
graphics.SmoothingMode  = SmoothingMode.HighQuality; 
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; 
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; 
graphics.CompositingQuality = CompositingQuality.HighQuality; 
+0

+1回答。只是想指出的是,SmoothingMode不会影响图像缩放,它会影响draigwng基元如线条,椭圆等。 – 2010-04-20 19:33:23

0

我认为通过传递imageformat .NET为您制作与ImageFormat相关的压缩。

但是,当涉及到图形压缩时,可能会比这更多(请参阅Photoshop或图形程序另存为对话框作为示例)。

JPEG例如只是一个标准......对于大量的网页图形,您仍然可以通过模糊或减少更多的颜色来减少尺寸,而不会造成明显的质量损失。

将由您决定使用哪种技术,或者如果您对Standard有问题可以使用。

0

你在做什么可以工作,但是迄今为止效率并不高,也不会产生最经济的文件大小。

您在处理成像时看到复杂的GDI代码的原因是,在使用默认的一尺寸适合所有方法和甚至最适度的微调之间没有合理的中间基础。

The .net < - > gdi interop与黑魔法的边界,其中隐约的错误比比皆是。幸运的是,谷歌拥有所有你需要浏览这个雷区的信息。

(做我画一个可怕的画面不够?;-))

认真不过,你可以用GDI互操作做的相当好,但它绝不是一个明显的任务。如果你愿意做研究并花时间去解决这些问题,那么你可以用一些好的代码来结束。

否则找到一个图像库,为你做这些事情。