簡體   English   中英

調整jpeg圖像的大小會影響其壓縮嗎?

[英]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):

  1. 原始的SO徽標:

    原始http://magnetiq.com/exports/sologo/original.jpg

    File size: 4,483 bytes

  2. 保留尺寸並應用高斯模糊:

    模糊的http://magnetiq.com/exports/sologo/blurred.jpg

    File size: 1,578 bytes

  3. 將原始尺寸調整為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壓縮是有損的 -並非所有原始數據都實際存儲准確。 如果將圖像壓縮為JPEG並解壓縮,則不會獲得確切的原始圖像。 每次壓縮和解壓縮都會損失一點質量。

對於一些簡單的轉換,例如旋轉JPEG,您可以使用jpegtran等程序無損地進行轉換

但是,要調整圖像大小,就不能無損地做到這一點。 當您這樣做時,您肯定會降低質量,盡管可能不會很大。 如果可能,請嘗試使用原始的無損圖像作為調整大小操作的源,以獲取盡可能高的質量,並且如果您將多個調整大小操作串聯在一起,則只需對原始大小進行一次調整即可。

不要將存儲格式(JPEG)與使用Graphics對象進行操作的格式混淆。 存儲格式已壓縮, Graphics對象使用解壓縮的數據。

LoadImageFromURL方法解壓縮JPEG中存儲的信息,對解壓縮后的數據執行調整大小操作,然后將其保存到JPEG文件時,它將再次被壓縮。

由於JPEG壓縮並非無損,因此每次執行以下過程都會降低圖像質量: 解壓縮,變異,重新壓縮

如果我誤解了您的問題:用於保存代碼中圖像inot集的壓縮因子,那么它將是某個默認值。 如果要通過使用較小的壓縮系數進行保存來減少質量損失,則需要對其進行顯式設置。

與您已經找到的相同,但是這里是Circumventing GDI +默認圖像壓縮的VB.NET版本。

我個人建議JPEG質量設置為90L。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM