我成功更改了图片的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}}不应该改变图像的字节。
答案 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具有可变压缩功能,可以根据原始设备的保真度进行压缩。影响规模的因素包括:
特定的JPEG格式:顺序或渐进式。在单次扫描中对组件的所有数据进行顺序编码。逐行编码多个扫描中的组件。渐进式通常可以产生更大的压缩。但是,有许多适用于渐进式的设置。
采样。 Jpeg允许以低于Y分量的速率对Cb和Cb分量进行采样。如果每两个Y(垂直和水平)采用一个Cb和Cr样本,则每4个样本得到1个Cb和CR样本。这会将要压缩的数据量从12减少到6。
量化表。量化表选择是JPEG压缩设置的主要形式。许多编码器将其隐藏在"质量"设置。
霍夫曼表。某些编码器使用预定义的霍夫曼表。如果编码器生成针对特定图像优化的霍夫曼表(更慢且更多工作),则可以获得更好的压缩。
除非您使用原始设置使用相同的设置重新压缩,否则您将获得不同的输出尺寸。即使您使用相同的设置,由于四舍五入,您通常会得到不同的值:JPEG使用浮点计算来舍入为整数。