如何将Jpeg文件压缩到有限的大小(例如200KB)而不会损失太多的图像质量

时间:2014-07-08 08:03:01

标签: image delphi bitmap jpeg lightroom

我希望在保存到数据库之前将图像大小减小到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),而质量不会下降太多。

感谢并感谢您的回答。

2 个答案:

答案 0 :(得分:1)

如果您的目标是缩小文件内容,则可以先调整位图,然后应用更好的CompressionQuality费率。

因此,图像的全局质量可能会更好。

TJpegImage依赖于标准的 libjpeg 库,而我认为Adobe有自己的调优实现。您可以尝试其他实施,例如GDI+a pure pascal implementationold 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.hJPEGLIB.PAS pasjpeg包含(后者仅仅是IJG实施版的直接翻译版本) .6a到Pascal)。

此外,您可以迁移到其他实现之一。除了@Arnaud Bouchez列表之外,值得一提的是可以重用的另一个Pascal实现:http://www.colosseumbuilders.com/sourcecode