[英]How to compress image size before saving to database without losing quality
[英]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),而質量卻不會下降太多。
感謝並感謝您的回答。
查看您的編碼器是否支持采樣。 如果以比Y分量低的速率對Cb和Cr分量進行采樣,則通常可以獲得更好的壓縮效果而沒有很多質量損失。 如果執行4:1:1,則將壓縮的數據量減少了近三分之一。 2:1:1將其削減一半。
此技術稱為色度二次采樣 。 不幸的是,Delphi的股票TJpegImage
包裝器圍繞IJG實現版本。 6b沒有展示此功能,而是將編碼器上下文初始化為對應於4:2:0的全默認值。 如果願意,請參考來自pasjpeg
包的TJPEGImage.Compress
方法代碼, libjpeg
文檔和jpeglib.h
或JPEGLIB.PAS
(后者只是將IJG實現版本6a轉換為Pascal的直接翻譯)。
另外,您可以遷移到其他實現之一。 除了@Arnaud Bouchez列表之外,值得一提的還有另一個可重用的Pascal實現: http : //www.colosseumbuilders.com/sourcecode
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.