是否足够使用.NET Image Conversion?

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

har*_*rpo 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; 
}
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)