簡體   English   中英

如何將Jpeg文件壓縮到有限大小(例如200KB)而又不損失很多圖像質量

[英]How to Compress Jpeg file to a limited size (e.g 200KB) without losing much image quality

在保存到數據庫之前,我希望將圖像大小減小200KB左右。 假設我有一個約39MB的位圖文件,我需要將位圖轉換為Jpeg,然后減小Jpeg文件<= 200KB(所有類型的圖形文件都可以轉換(例如bmp,jpg,png),但是最終的圖形類型可以小於200KB)。 我正在編寫以下代碼嘗試進行轉換(在這種情況下,我將jpg品質設置為10,因為我希望文件大小為200KB):

    function BMPtoJPG(var BMPpic, JPGpic: string):boolean;
    var Bitmap: TBitmap;
        JpegImg: TJpegImage;
    begin
      Result:= False;
      Bitmap := TBitmap.Create;
      try
        Bitmap.LoadFromFile(BMPpic) ;
        JpegImg := TJpegImage.Create;
        try
          JpegImg.CompressionQuality := 10; //in this case i set the quality to 10 so the file size will be around 200KB)
          JpegImg.Assign(Bitmap);
          JpegImg.Compress;
          JpegImg.SaveToFile(JPGpic) ;
          Result:=True;
        finally
          JpegImg.Free
        end;
      finally
        Bitmap.Free;
      end;
    end;

我使用相同的圖像文件在導出對話框的Adobe Lightroom程序中進行轉換,將大小限制為200KB,並與通過上述功能BMPtoJPG轉換的圖像進行比較。 Adobe Lightroom提供的高質量圖像比功能方法要好得多(兩個文件大小均在200KB左右)

任何人都可以向我展示如何編寫代碼來減少圖像大小(將大小限制為200KB),而質量卻不會下降太多。

感謝並感謝您的回答。

如果您的目標是縮小文件內容,則可以先調整位圖的大小 ,然后再應用更好的CompressionQuality率。

結果,圖像的整體質量可能會更好。

TJpegImage依賴於標准的libjpeg庫,而我認為Adobe具有自己的優化實現。 您可以嘗試其他實現,例如GDI +中包含的實現,或者純Pascal實現 ,甚至是舊的Intel庫

查看您的編碼器是否支持采樣。 如果以比Y分量低的速率對Cb和Cr分量進行采樣,則通常可以獲得更好的壓縮效果而沒有很多質量損失。 如果執行4:1:1,則將壓縮的數據量減少了近三分之一。 2:1:1將其削減一半。

此技術稱為色度二次采樣 不幸的是,Delphi的股票TJpegImage包裝器圍繞IJG實現版本。 6b沒有展示此功能,而是將編碼器上下文初始化為對應於4:2:0的全默認值。 如果願意,請參考來自pasjpeg包的TJPEGImage.Compress方法代碼, libjpeg文檔和jpeglib.hJPEGLIB.PAS (后者只是將IJG實現版本6a轉換為Pascal的直接翻譯)。

另外,您可以遷移到其他實現之一。 除了@Arnaud Bouchez列表之外,值得一提的還有另一個可重用的Pascal實現: http : //www.colosseumbuilders.com/sourcecode

暫無
暫無

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

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