【问题标题】:Difference between bitmap.save overloadsbitmap.save 重载的区别
【发布时间】:2014-03-14 02:55:00
【问题描述】:

我正在研究将位图对象保存到内存流的不同方法,但我不确定应该选择哪种方法。

让我特别感兴趣的两个是:

1)

Bitmap.Save(Stream, ImageFormat)

2)

Bitmap.Save(Stream, ImageCodecInfo, EncoderParameters)

场景如下:

我有一个方法可以接收 .bmp 格式的图像,在执行调整大小逻辑后,我将这个新调整大小的位图对象以 jpg 格式保存回内存流。我已经使用了这两种方法,它们都给了我编码的 jpg 等价物。

方法 1) 的逻辑

Bitmap srcBitmap = new Bitmap(m_testImage);
//perform resize
var imageStream = new MemoryStream();
srcBitmap.Save(imageStream, ImageFormat.Jpeg);
imageStream.Position = 0L;

方法 2) 的逻辑

Bitmap srcBitmap = new Bitmap(m_testImage);
myjpegEncoder = ImageCodecInfo.GetImageDecoders().FirstOrDefault(codec => codec.FormatID == ImageFormat.Jpeg.Guid);
encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 80L);
var imageStream = new MemoryStream();
srcBitmap.Save(imageStream, myjpegEncoder, encoderParams);
imageStream.Position = 0L;

这两种方法的主要区别是什么?

msdn:http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.save(v=vs.110).aspx

【问题讨论】:

    标签: c# .net bitmap


    【解决方案1】:

    使用方法2保存时,您可以更改质量、颜色深度或压缩等。

    【讨论】:

    • @Matthew:它们几乎完全相同。您的所有第一个(两个参数)重载都是通过调用ImageFormat.FindEncoder 为您获取ImageCodecInfo。然后它实际上使用它来调用第二个重载(三个参数),将null 传递给EncoderParameters 参数。
    • 只是为了澄清可能不明显的事情:在 .NET 方面,传递参数时唯一(非常轻微的)性能差异是必须对这些参数进行编组才能将它们传递给 GDI+。在 GDI+ 方面,默认参数下的编码器可能比您碰巧指定的参数更快(或更慢)。例如,一些报告(尚未检查)说,使用默认参数保存 JPEG 并且不进行任何更改会使编码器简单地保存原始图像而无需重新编码 - 这显然比重新编码要快。跨度>
    【解决方案2】:

    第一个是 JPEG 的预定义方法。 另一个是更通用的版本。例如对于像第一个示例中那样尚未直接可用的未来图像格式

    【讨论】:

    • 在第二种形式的情况下,您可能可以指定参数来控制对图像应用多少压缩
    • 是的,但是在查看代码时这很明显
    • 再次投反对票。伙计们......在投票之前考虑一下。为什么必须为编码器指定 GUID?正是因为未来的图像格式还没有在 .net 中实现。在检查反编译的代码时,它显示它正是以这种方式工作的。参见 GdipGetImageEncoders()
    猜你喜欢
    • 1970-01-01
    • 2016-06-07
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    相关资源
    最近更新 更多