我见过很多人尝试编写自己的图像转换技术。它通常看起来非常复杂,最终使用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类型。我已经尽我所能测试了它,但我想知道我是否在这种简单的格式转换中遗漏了什么,或者这是否足够?
答案 0 :(得分:5)
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做得很好,但这绝不是一个明显的任务。如果你愿意做研究并花时间解决问题,你可以得到一些好的代码。
否则找一个为你完成大部分工作的成像库。