5

我见过很多人尝试编写自己的图像转换技术。它通常看起来很复杂,最终使用 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 类型。我已经尽我所能对其进行了测试,但我想知道我是否在这种简单的格式转换中遗漏了任何东西,或者这是否足够?

4

3 回答 3

5

System.Drawing.Imaging如果您传入 JPEG 编解码器并将编码器参数设置为质量(本质上是保留百分比),则确实可以对图像压缩进行额外控制。

这是我与参数一起使用"image/jpeg"以获取 JPEG 编解码器的函数。(这与压缩本身无关,但Image.Save接受EncoderParametersrequireImageCodecInfo而不是的重载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;
于 2010-04-20T05:05:16.730 回答
0

我认为通过传递 imageformat .NET 会为您完成与 ImageFormat 相关的压缩。

但是当涉及到图形压缩时,可能远不止这些(参见 Photoshop 或图形程序另存为对话框作为示例)。

例如,JPEG 只是一个标准……对于许多网络图形,您仍然可以通过模糊或去除更多颜色来缩小尺寸,而不会造成明显的质量损失。

将取决于您将使用哪些技术,或者您是否可以使用标准。

于 2010-04-20T04:51:51.287 回答
0

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

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

.net<->gdi 互操作与黑魔法接壤,其中隐藏的错误比比皆是。幸运的是,谷歌拥有导航这个雷区所需的一切。

(我画的画面够可怕吗?;-))

不过说真的,您可以使用 gdi interop 做得相当好,但这绝不是一项显而易见的任务。如果您愿意进行研究并花时间解决问题,您最终可以得到一些好的代码。

否则,请找到为您完成大部分工作的图像库。

于 2010-04-20T05:04:26.420 回答