[英]Does resizing jpeg images affect their compression?
我正在使用Graphics.DrawImage方法调整jpeg的大小(请参见下面的代码片段)。 谁能确认这不会影响新图像的压缩? 我已经看到了这个线程 ,但是我专门谈论的是jpeg的压缩。
private byte[] getResizedImage(String url, int newWidth)
{
Bitmap bmpOut = null;
System.IO.MemoryStream outStream = new System.IO.MemoryStream();
//input image is disposable
using (Bitmap inputImage = LoadImageFromURL(url))
{
ImageFormat format = inputImage.RawFormat;
decimal ratio; //ratio old width:new width
int newHeight = 0;
//*** If the image is smaller than a thumbnail just return it
if (inputImage.Width < newWidth)
return null;
ratio = (decimal)newWidth / inputImage.Width;
decimal h = inputImage.Height * ratio;
newHeight = (int)h;
bmpOut = new Bitmap(newWidth, newHeight);
Graphics g = Graphics.FromImage(bmpOut);
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
// try testing with following options:
//g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
//g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
//g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
//g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
g.FillRectangle(Brushes.White, 0, 0, newWidth, newHeight);
g.DrawImage(inputImage, 0, 0, newWidth, newHeight);
bmpOut.Save(outStream, getImageFormat(url));
}
return outStream.ToArray();
}
JPEG中没有保存“压缩”值。 调整大小并保存它们时,它们会使用您告诉保存函数使用的任何值进行压缩。 由于您没有传递值,它将只使用库的默认值。
调整图像大小会影响压缩,如果通过“压缩”来指代可以在多少像素中容纳多少细节。
JPEG压缩算法支持具有梯度和平坦色块的模糊或均匀图像。 因此,图像尺寸与生成的文件大小之间没有直接关联。 最重要的是图像中的细节量(所有图像均以80%的损耗因子保存为JPEG):
原始的SO徽标:
原始http://magnetiq.com/exports/sologo/original.jpg
File size: 4,483 bytes
保留尺寸并应用高斯模糊:
模糊的http://magnetiq.com/exports/sologo/blurred.jpg
File size: 1,578 bytes
将原始尺寸调整为1/4:
缩小http://magnetiq.com/exports/sologo/shrunk.jpg
File size: 2,063 bytes
请注意,模糊的图像(2)即使是缩小的图像(3)的4倍,其文件大小也比(1)和(2)都小。 模糊添加了不错的渐变,使JPEG压缩令人满意。
小图像(3)尽管仅具有原始图像(1)的1/4像素,但并不是文件大小的1/4。 这是因为缩小图像会产生更好的细节,而JPEG压缩则不是如此。
当您调用“ bmpOut.Save”时,您必须传递一些EncoderParameters来告诉该方法您希望使用哪种质量级别进行保存。
http://msdn.microsoft.com/zh-cn/library/system.drawing.imaging.encoderparameters(VS.80).aspx
在您的代码中,“ HighQualityBicubic
”是您正在使用的压缩方式。 调整为较小的尺寸确实会删除细节,但这与压缩无关,它只与较少的像素有关。
不要将存储格式(JPEG)与使用Graphics
对象进行操作的格式混淆。 存储格式已压缩, Graphics
对象使用解压缩的数据。
LoadImageFromURL
方法解压缩JPEG中存储的信息,对解压缩后的数据执行调整大小操作,然后将其保存到JPEG文件时,它将再次被压缩。
由于JPEG压缩并非无损,因此每次执行以下过程都会降低图像质量: 解压缩,变异,重新压缩 。
如果我误解了您的问题:用于保存代码中图像inot集的压缩因子,那么它将是某个默认值。 如果要通过使用较小的压缩系数进行保存来减少质量损失,则需要对其进行显式设置。
与您已经找到的相同,但是这里是Circumventing GDI +默认图像压缩的VB.NET版本。
我个人建议JPEG质量设置为90L。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.