我希望在保存到数据库之前将图像大小减小到200KB左右。假设我有一个大约39MB的位图文件,我需要将Bitmap转换为Jpeg,然后减少Jpeg文件< = 200KB(所有类型的图形文件都可以转换(例如bmp,jpg,png),但最终的图形类型将是Jpeg小于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),而质量不会下降太多。
感谢并感谢您的回答。
答案 0 :(得分:1)
如果您的目标是缩小文件内容,则可以先调整位图,然后应用更好的CompressionQuality
费率。
因此,图像的全局质量可能会更好。
TJpegImage
依赖于标准的 libjpeg 库,而我认为Adobe有自己的调优实现。您可以尝试其他实施,例如GDI+,a pure pascal implementation或old Intel's library中包含的实施。
答案 1 :(得分:1)
查看您的编码器是否支持采样。如果以低于Y组分的速率对Cb和Cr组分进行采样,通常可以获得更好的压缩效果,同时降低质量损失。如果按4:1:1进行操作,则会将要压缩的数据量减少近三分之一。 2:1:1减半。
此技术称为chroma subsampling。
不幸的是,Delphi的股票TJpegImage
包装了IJG实施版。 6b不公开此功能并将编码器上下文初始化为对应于4:2:0的所有默认值。如果您愿意,请参阅TJPEGImage.Compress
方法代码,libjpeg
文档以及jpeglib.h
或JPEGLIB.PAS
pasjpeg
包含(后者仅仅是IJG实施版的直接翻译版本) .6a到Pascal)。
此外,您可以迁移到其他实现之一。除了@Arnaud Bouchez列表之外,值得一提的是可以重用的另一个Pascal实现:http://www.colosseumbuilders.com/sourcecode