如何在压缩前测量图像质量

本文关键字:测量 图像质量 压缩 | 更新日期: 2023-09-27 17:56:09

我正在使用C#。

我有一个 jpeg 图像。

我通过降低图像的质量来压缩它,所以:

byte[] data = SaveJpeg(myJPEG, 60);
public byte[] SaveJpeg(Image img, int quality)
{
    byte[] data = null;
    // Encoder parameter for image quality 
    EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
    // Jpeg image codec 
    ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg");
    EncoderParameters encoderParams = new EncoderParameters(1);
    encoderParams.Param[0] = qualityParam;
    using (MemoryStream ms = new MemoryStream())
    {
        img.Save(ms, jpegCodec, encoderParams);
        data = ms.ToArray();
        img.Dispose();
    }
    return data;
  }
  private ImageCodecInfo GetEncoderInfo(string mimeType)
  {
      // Get image codecs for all image formats 
      ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
      // Find the correct image codec 
      for (int i = 0; i < codecs.Length; i++)
         if (codecs[i].MimeType == mimeType)
             return codecs[i];
      return null;
    }

我的图像大小按预期减小。

此特定图像"看起来"质量很高,压缩返回 20818 字节。但是对于具有相同分辨率(即宽度+高度)但"看起来"较差的图像的其他图像,返回的字节大小要小得多 - 例如9000字节。

我可以得到一个一致的进程来"大致"返回相同数量的字节吗?图像中影响压缩大小的因素有哪些?

如何在压缩前测量图像质量

首先,"质量"在JPEG中是一个毫无意义的术语。各种编码器我们质量值是指定压缩中使用的量化表的简化方法。

量化表的效果取决于图像本身。没有办法有一个特定的设置,该设置将为文件提供大致相同大小的文件,并以 JPEG 格式提供合理的输出。

其次,影响图像外部压缩的因素是:

  1. 图像本身的性质。
  2. 使用的采样。通常使用比 Y 分量更少的 Cr 和 Cr 分量样本。如果对 4 Y 值的矩形取 1 Cb 和 1 Cr 值,则数据量已经减少了一半。
  3. 使用的量化表。

第三,如果你进入图像内部,这意味着图像,划分的int 8x8块,产生接近零的高阶DCT值更好地压缩。我知道这毫无意义,除非你知道JPEG的内部。

一些可见因素:

大面积的固体区域可以很好地压缩。所有一种颜色的 8x8 块都会生成一组 8x8 的 DCT 值,这些值除一种颜色外全部为零。此外,这些区域中的Cb和Cb子采样对输出没有负面影响。

干净的过渡在产生良好输出时不能很好地压缩。

像素级别颜色的戏剧性来回变化不能很好地压缩。

除了原始图像的分辨率和文件大小之外,还有更多涉及的内容。图像中的内容会影响它可以压缩的程度;所以你真的不能这样做。

但还有更多,甚至。以前/现有的压缩实际上是无关紧要的。JPEG是一种"有损"格式...所以不涉及减压。奇怪的是:以最高质量(最低压缩)保存图像,您通常会获得比原始更大的文件大小。通常,要大得多。