我刚用100%的品质保存了一张JPG图片,结果惊奇地发现文件大小几乎是原文件的4倍。为了进一步调查,我试着打开这张图片并在没有明确设置品质的情况下保存它,结果文件大小和原文件完全相同。我猜这是因为什么都没变,所以直接将原来的位元组写回到了文件中。为了测试我的假设,我在图片上画了一条粗大的对角线,然后再次保存了图片,这次也没有设置品质(我预计文件会变大因为它变“脏”了),但它的大小却减小了约10KB!
目前我真的不懂当我简单地调用Image.Save()方法时,如果未指定压缩品质,到底发生了什么。为什么在修改图像后,即使没有设置品质,文件大小与原始大小如此接近,而当我将品质设置为100(基本不压缩)时,文件大小却比原始文件大好几倍?
我已经阅读了关于Image.Save()方法的文档,但没有任何关于其背后发生的事情的详细说明。我已经尽力通过各种方式进行谷歌搜索,但找不到可以解释我所看到的情况的其他信息。我已经连续工作了31个小时,可能错过了一些显而易见的东西;0)
所有这些都是在我实现一些库方法以将图像保存到数据库时发生的。我已经重载了我们的“SaveImage”方法,以允许明确设置品质,在测试期间,我遇到了上述奇怪的结果。如果你能提供任何帮助,我将不胜感激。
以下是一些代码,可以说明我的经验:
目前我真的不懂当我简单地调用Image.Save()方法时,如果未指定压缩品质,到底发生了什么。为什么在修改图像后,即使没有设置品质,文件大小与原始大小如此接近,而当我将品质设置为100(基本不压缩)时,文件大小却比原始文件大好几倍?
我已经阅读了关于Image.Save()方法的文档,但没有任何关于其背后发生的事情的详细说明。我已经尽力通过各种方式进行谷歌搜索,但找不到可以解释我所看到的情况的其他信息。我已经连续工作了31个小时,可能错过了一些显而易见的东西;0)
所有这些都是在我实现一些库方法以将图像保存到数据库时发生的。我已经重载了我们的“SaveImage”方法,以允许明确设置品质,在测试期间,我遇到了上述奇怪的结果。如果你能提供任何帮助,我将不胜感激。
以下是一些代码,可以说明我的经验:
string filename = @"C:\temp\image testing\hh.jpg";
string destPath = @"C:\temp\image testing\";
using(Image image = Image.FromFile(filename))
{
ImageCodecInfo codecInfo = ImageUtils.GetEncoderInfo(ImageFormat.Jpeg);
// Set the quality
EncoderParameters parameters = new EncoderParameters(1);
// Quality: 10
parameters.Param[0] = new EncoderParameter(
System.Drawing.Imaging.Encoder.Quality, 10L);
image.Save(destPath + "10.jpg", codecInfo, parameters);
// Quality: 75
parameters.Param[0] = new EncoderParameter(
System.Drawing.Imaging.Encoder.Quality, 75L);
image.Save(destPath + "75.jpg", codecInfo, parameters);
// Quality: 100
parameters.Param[0] = new EncoderParameter(
System.Drawing.Imaging.Encoder.Quality, 100L);
image.Save(destPath + "100.jpg", codecInfo, parameters);
// default
image.Save(destPath + "default.jpg", ImageFormat.Jpeg);
// Big line across image
using (Graphics g = Graphics.FromImage(image))
{
using(Pen pen = new Pen(Color.Red, 50F))
{
g.DrawLine(pen, 0, 0, image.Width, image.Height);
}
}
image.Save(destPath + "big red line.jpg", ImageFormat.Jpeg);
}
public static ImageCodecInfo GetEncoderInfo(ImageFormat format)
{
return ImageCodecInfo.GetImageEncoders().ToList().Find(delegate(ImageCodecInfo codec)
{
return codec.FormatID == format.Guid;
});
}