我希望在保存到数据库之前将图像大小减小约 200KB。假设我有一个大约 39MB 的位图文件,我需要将位图转换为 Jpeg,然后缩小 Jpeg 文件<= 200KB (all type of graphics file are possible to convert (e.g bmp, jpg, png), but final graphic type will be Jpeg lesser than 200KB). I'm writing the following code try to convert (in this case i set the jpg quality to 10 since i want the file size to be 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 的全默认值。如果您愿意,请参阅
TJPEGImage.Compress
方法代码、libjpeg
文档以及
jpeglib.h
包中的 JPEGLIB.PAS
或 pasjpeg
(后者只是将 IJG 实现版本 6a 直接转换为 Pascal)。此外,您还可以迁移到其他实现之一。除了 @Arnaud Bouchez 列表之外,值得一提的是另一个可重用的 Pascal 实现:http://www.colosseumbuilders.com/sourcecode