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

时间:2014-04-02 18:27:16

标签: c# image-processing

我正在使用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;
    }

我的图像按预期缩小了尺寸。

这个特殊的形象&#39;看起来&#39;高质量和压缩返回20818字节。但是对于相同分辨率(即宽度+高度)的其他图像,但是看起来&#39;较差的图像返回的字节大小要少得多 - 例如9000字节(例如)。

我可以得到一个一致的过程,大致回归&#39;相同数量的字节?图像中影响压缩大小的因素是什么?

2 个答案:

答案 0 :(得分:1)

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

但是还有更多。先前/现有压缩实际上是无关紧要的。 JPEG是一个有损的&#39;格式...所以没有涉及减压。奇怪的是:以最高质量(最低压缩率)保存图像,并且您经常会获得比原来更大的文件大小。通常,更大。

答案 1 :(得分:1)

首先,“质量”是JPEG中无意义的术语。各种编码器使用质量值作为指定压缩中使用的量化表的简化方法。

量化表的效果取决于图像本身。没有办法让特定的设置能够以JPEG合理的输出格式提供相同大小的文件。

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

  1. 图像本身的本质。
  2. 使用的采样。通常使用比Y组分更少的Cr和Cr组分样品。如果对4个Y值的矩形取1 Cb和1 Cr值,则已将数据量减少了一半。
  3. 使用的量化表。
  4. 第三,如果你然后进入图像内部,那意味着图像被划分为8x8块,产生接近零的高阶DCT值压缩得更好。我知道除非你知道JPEG的内部,否则这种方法毫无意义。

    一些明显的因素:

    大的实心区域压缩得很好。所有一种颜色的8x8块产生一组8x8的DCT值,除了一个之外全部为零。此外,在这些区域中对Cb和Cb进行二次采样对输出没有负面影响。

    清洁过渡不能很好地压缩,同时产生良好的输出。

    像素级的颜色剧烈,来回变化不能很好地压缩。