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

时间:2015-06-16 04:36:01

标签: c# image bitmap jpeg

我成功更改了图片的Matlab属性。但是,在重新保存图像后,其尺寸发生了变化。我查看using (var image = new Bitmap(@"C:\Temp\1.jpg")) { image.Save(@"C:\Temp\2.jpg"); } ,两个图像的字节都相同。

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

1.jpg

但是,规模仍然有所改变。原始jpeg图片1.88 MB (1,975,162 bytes)的尺寸为2.jpg。将其重新保存到1.86 MB (1,960,824 bytes)后,图片的大小会更改为Bitmap.Save

可能是什么问题?虽然Matlab确保我没有更改图像的字节,但我想听到你{{1}}不应该改变图像的字节。

2 个答案:

答案 0 :(得分:1)

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);

}

答案 1 :(得分:0)

JPEG具有可变压缩功能,可以根据原始设备的保真度进行压缩。影响规模的因素包括:

  1. 特定的JPEG格式:顺序或渐进式。在单次扫描中对组件的所有数据进行顺序编码。逐行编码多个扫描中的组件。渐进式通常可以产生更大的压缩。但是,有许多适用于渐进式的设置。

  2. 采样。 Jpeg允许以低于Y分量的速率对Cb和Cb分量进行采样。如果每两个Y(垂直和水平)采用一个Cb和Cr样本,则每4个样本得到1个Cb和CR样本。这会将要压缩的数据量从12减少到6。

  3. 量化表。量化表选择是JPEG压缩设置的主要形式。许多编码器将其隐藏在"质量"设置。

  4. 霍夫曼表。某些编码器使用预定义的霍夫曼表。如果编码器生成针对特定图像优化的霍夫曼表(更慢且更多工作),则可以获得更好的压缩。

  5. 除非您使用原始设置使用相同的设置重新压缩,否则您将获得不同的输出尺寸。即使您使用相同的设置,由于四舍五入,您通常会得到不同的值:JPEG使用浮点计算来舍入为整数。