是否足够使用.NET Image Conversion?

时间:2010-04-20 04:42:14

标签: c# .net image-processing image-conversion

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

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类型。我已经尽我所能测试了它,但我想知道我是否在这种简单的格式转换中遗漏了什么,或者这是否足够?

3 个答案:

答案 0 :(得分:5)

如果您传入JPEG编解码器并为质量设置编码器参数,

System.Drawing.Imaging确实为您提供了对图像压缩的额外控制,这实际上是保留百分比。

这是我使用参数"image/jpeg"来获取JPEG编解码器的函数。 (这与压缩本身无关,但接受Image.Save的{​​{1}}重载需要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

(我将编解码器和参数存储在静态值中,因为它们被反复使用,但我想在这里简化示例。)

希望这有帮助!

编辑:如果要缩放图像,您还可以控制质量。是的,这是非常“黑匣子”,但我发现它运作良好。以下是“良好和慢速”设置(您需要在调用DrawImage之前设置它,但是您可以查找“快速和肮脏”版本。

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

答案 1 :(得分:0)

我认为通过传递imageformat .NET会为您执行与ImageFormat关联的压缩。

但是当谈到图形压缩时,可能会有更多(例如,请参阅Photoshop或图形程序保存为对话框)。

JPEG例如只是一个标准...而且对于很多网页图形,你仍然可以通过模糊或消除更多颜色来减小尺寸,而不会有明显的质量损失。

将取决于您将使用哪种技术,或者您对标准是否合适。

答案 2 :(得分:0)

您正在做的事情会起作用,但到目前为止效率最高,也不会产生最经济的文件大小。

您在处理成像时看到复杂GDI代码的原因是,在使用默认的“一刀切”方法与最微小程度的微调之间没有合理的中间立场。

.net&lt; - &gt; gdi interop与黑魔法接壤,其中比较模糊的错误比比皆是。幸运的是,谷歌拥有了导航这个雷区所需的一切。

(我画的画面真实吗?; - ))

说真的,你可以用gdi interop做得很好,但这绝不是一个明显的任务。如果你愿意做研究并花时间解决问题,你可以得到一些好的代码。

否则找一个为你完成大部分工作的成像库。

相关问题