c# - 为什么 Bitmap.Save 会改变图像的大小?

标签 c# image bitmap jpeg

我成功地更改了图像的 DateTaken 属性。但是,在重新保存图像后,它的大小发生了变化。我检查了 Matlab,两个图像的字节是相同的。

为了检查更改属性是否会改变大小,我决定只打开文件并保存它而不更改任何属性。代码如下:

using (var image = new Bitmap(@"C:\Temp\1.jpg"))
{  
    image.Save(@"C:\Temp\2.jpg");
}

但是,尺寸还是变了。原始 jpeg 图像 1.jpg 的大小为 1.88 MB(1,975,162 字节)。将其重新保存为 2.jpg 后,图像的大小变为 1.86 MB(1,960,824 字节)

可能是什么问题?虽然 Matlab 向我保证图像的字节没有改变,但我想听听你说 Bitmap.Save 不应该改变图像的字节。

最佳答案

Jpeg 是一种压缩格式。它能够以不同的质量和不同的压缩格式保存。我的猜测是,两个图像的压缩级别设置不同。因为字节在读取时被解压缩(无论压缩格式如何),所以字节将是相同的,即使它们的压缩方式不同。

想想如果你拿一个文件并用 ZIP 格式压缩它,然后你拿同一个文件用 RAR 格式压缩它。这两个文件大小不同,但解压后,里面的文件是一样的。

您可以阅读有关如何设置图像压缩级别的信息 here

我正在从链接中复制代码以便于引用:

private void VaryQualityLevel()
{
    // Get a bitmap.
    Bitmap bmp1 = new Bitmap(@"c:\TestPhoto.jpg");
    ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);

    // Create an Encoder object based on the GUID 
    // for the Quality parameter category.
    System.Drawing.Imaging.Encoder myEncoder =
        System.Drawing.Imaging.Encoder.Quality;

    // Create an EncoderParameters object. 
    // An EncoderParameters object has an array of EncoderParameter 
    // objects. In this case, there is only one 
    // EncoderParameter object in the array.
    EncoderParameters myEncoderParameters = new EncoderParameters(1);

    EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 50L);
    myEncoderParameters.Param[0] = myEncoderParameter;
    bmp1.Save(@"c:\TestPhotoQualityFifty.jpg", jpgEncoder, myEncoderParameters);

    myEncoderParameter = new EncoderParameter(myEncoder, 100L);
    myEncoderParameters.Param[0] = myEncoderParameter;
    bmp1.Save(@"c:\TestPhotoQualityHundred.jpg", jpgEncoder, myEncoderParameters);

    // Save the bitmap as a JPG file with zero quality level compression.
    myEncoderParameter = new EncoderParameter(myEncoder, 0L);
    myEncoderParameters.Param[0] = myEncoderParameter;
    bmp1.Save(@"c:\TestPhotoQualityZero.jpg", jpgEncoder, myEncoderParameters);

}

关于c# - 为什么 Bitmap.Save 会改变图像的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30858883/

相关文章:

c# - MVC 3 到 MVC 4 Razor 编译器错误

c# - 通过包含字母搜索列表 C#

javascript - 需要运行 javascript 后从 php 加载的动态图像

android - 如何在 Android 中加载大图像并避免内存不足错误?

java - Android 处理 GIF 文件

android - SurfaceView 到位图

c# - 将 WPF 绑定(bind)错误转换为运行时异常。不适用于已发布的已发布应用程序

c# - 使用反射分配 Func<Product, object> 属性的值

image - 为什么 IE8 不显示包含在 <h1> 和 <a> 标记中的 <img>?

css - 如何使用 animated.css 放大此图像