[英]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.