如何在压缩前测量图像质量
本文关键字:测量 图像质量 压缩 | 更新日期: 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 格式提供合理的输出。
其次,影响图像外部压缩的因素是:
- 图像本身的性质。
- 使用的采样。通常使用比 Y 分量更少的 Cr 和 Cr 分量样本。如果对 4 Y 值的矩形取 1 Cb 和 1 Cr 值,则数据量已经减少了一半。
- 使用的量化表。
第三,如果你进入图像内部,这意味着图像,划分的int 8x8块,产生接近零的高阶DCT值更好地压缩。我知道这毫无意义,除非你知道JPEG的内部。
一些可见因素:
大面积的固体区域可以很好地压缩。所有一种颜色的 8x8 块都会生成一组 8x8 的 DCT 值,这些值除一种颜色外全部为零。此外,这些区域中的Cb和Cb子采样对输出没有负面影响。
干净的过渡在产生良好输出时不能很好地压缩。
像素级别颜色的戏剧性来回变化不能很好地压缩。
除了原始图像的分辨率和文件大小之外,还有更多涉及的内容。图像中的内容会影响它可以压缩的程度;所以你真的不能这样做。
但还有更多,甚至。以前/现有的压缩实际上是无关紧要的。JPEG是一种"有损"格式...所以不涉及减压。奇怪的是:以最高质量(最低压缩)保存图像,您通常会获得比原始更大的文件大小。通常,要大得多。