我正在使用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;相同数量的字节?图像中影响压缩大小的因素是什么?
答案 0 :(得分:1)
除了原始图像的分辨率和文件大小之外,还有更多内容。图像中的内容会影响它的压缩程度;所以你不能真的这样做。
但是还有更多。先前/现有压缩实际上是无关紧要的。 JPEG是一个有损的&#39;格式...所以没有涉及减压。奇怪的是:以最高质量(最低压缩率)保存图像,并且您经常会获得比原来更大的文件大小。通常,更大。
答案 1 :(得分:1)
首先,“质量”是JPEG中无意义的术语。各种编码器使用质量值作为指定压缩中使用的量化表的简化方法。
量化表的效果取决于图像本身。没有办法让特定的设置能够以JPEG合理的输出格式提供相同大小的文件。
其次,影响图像外部压缩的因素是:
第三,如果你然后进入图像内部,那意味着图像被划分为8x8块,产生接近零的高阶DCT值压缩得更好。我知道除非你知道JPEG的内部,否则这种方法毫无意义。
一些明显的因素:
大的实心区域压缩得很好。所有一种颜色的8x8块产生一组8x8的DCT值,除了一个之外全部为零。此外,在这些区域中对Cb和Cb进行二次采样对输出没有负面影响。
清洁过渡不能很好地压缩,同时产生良好的输出。
像素级的颜色剧烈,来回变化不能很好地压缩。