当我加载JPG文件并以100的质量转身并保存它时,我只是感到非常惊讶,而原始的尺寸几乎是4倍。为了进一步调查,我打开并保存而没有明确设置质量,文件大小完全相同。我认为这是因为什么都没有改变,所以它只是将完全相同的位写回文件。为了测试这个假设,我在图像上对角线划出了一条大脂肪线,然后再次保存而没有设置质量(这次我希望该文件跳起来,因为它会“脏”),但它降低了〜10KB!

在这一点上,我真的不明白当我简单地调用image.save()w/out指定压缩质量时发生了什么。当我将质量设置为100(基本上没有压缩)时,文件大小如何接近(修改图像后)到原始大小时,文件大小比原始大小大几倍?

我已经阅读了image.save()上的文档,并且缺少有关幕后发生的事情的任何细节。我已经搜索了我能想到的各种方式,但是找不到任何其他可以解释我看到的信息。我已经连续工作了31个小时,所以也许我缺少一些明显的东西; 0)

当我实施一些库方法以将图像保存到数据库时,所有这些都发生了。我已经超载了我们的“保存图”方法,以明确设置质量,在测试期间,我遇到了上面解释的奇数(对我来说)。您可以抛出的任何光线都将不胜感激。

这是一些代码,可以说明我的经历:

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;
    });
}
有帮助吗?

解决方案

使用反射器,事实证明 Image.Save() 归结为GDI+功能 gdipsaveimagetofile, ,与 encoderParams 无效的。所以我认为问题是jpeg编码器得出空的作用 encoderParams. 。这里建议75%的人,但找不到任何可靠的参考。

编辑 您可能可以通过在上面运行程序以获得1..100的质量值并将其与默认质量保存的JPG进行比较(使用,例如fc.exe /b)来为自己找出答案。

其他提示

IIRC,是75%,但我不记得在哪里阅读。

我对image.save方法了解不多,但是我可以告诉您,添加脂肪线会逻辑地减少JPG图像的大小。这是由于JPG保存(和编码)的方式。

厚的黑线使一个非常简单且较小的编码(如果我没记错的话,这主要是在离散余弦变换之后与之相关的),因此可以使用更少的数据(字节)来存储修改的图像。

JPG编码步骤

关于大小的变化(没有添加行),我不确定您重新打开哪个图像并重新保存

为了进一步调查,我打开并保存而不明确设置质量,文件大小完全相同

如果您打开了旧的(原始正常大小)图像并将其重新保存,则可能是默认压缩和原始图像压缩相同。如果您打开了新的(4倍更大)图像并重新保存,则可能是从图像派生的保存方法的默认压缩(就像加载时一样)。

同样,我不知道保存方法,所以我只是在提出想法(也许他们会给您带来领先)。

当您将图像保存为质量<100%的JPEG文件时,您将文物引入保存的图像中,这是压缩过程的副作用。这就是为什么将图像以100%重新保存图像实际上正在增加文件的大小以外的原始图像 - 具有讽刺意味的是,位图中存在更多信息。

这也是为什么如果您打算以后打算对文件进行任何编辑,则应始终尝试以非糟糕格式(例如PNG)保存,否则您将通过多个有损转换来影响输出的质量。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top