con*_*att 5 .net c# 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
);
Run Code Online (Sandbox Code Playgroud)
这就是我在图像转换中所做的一切.只需设置应保存图像的位置,并将其传递给ImageFormat类型.我已经尽我所能测试了它,但是我想知道在这种简单的格式转换中我是否遗漏了什么,或者这是否足够?
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;
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以在保存图像之前设置编码器参数.
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
Run Code Online (Sandbox Code Playgroud)
(还有其他编码器参数 - 请参阅文档.
所以,把它们放在一起,你可以说
image.Save( outFile, GetCodec("image/jpeg"), ep );
Run Code Online (Sandbox Code Playgroud)
(我将编解码器和参数存储在静态值中,因为它们被反复使用,但我想在这里简化示例.)
希望这可以帮助!
编辑:如果您正在缩放图像,您也可以控制质量.是的,这是非常"黑匣子",但我发现它运作良好.以下是"良好和慢速"设置(在调用DrawImage之前需要设置,但您可以查找"快速和脏"版本.
// good & slow
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
graphics.CompositingQuality = CompositingQuality.HighQuality;
Run Code Online (Sandbox Code Playgroud)