1

我希望在保存到数据库之前减少大约 200KB 的图像大小。假设我有一个 39MB 左右的位图文件,我需要将位图转换为 Jpeg,然后减少 Jpeg 文件 <= 200KB(所有类型的图形文件都可以转换(例如 bmp、jpg、png),但最终的图形类型将是小于 200KB 的 Jpeg)。我正在编写以下代码尝试转换(在这种情况下,我将 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;

我在导出对话框中使用相同的图像文件在 Adob​​e Lightroom 程序中进行转换,将大小限制为 200KB,并与上述函数 BMPtoJPG 转换的图像进行比较。Adobe Lightroom 的图像质量比函数方法好得多(文件大小都在 200KB 左右)

谁能告诉我如何编写代码来减小图像大小(限制大小为 200KB),同时质量不会下降太多。

感谢并感谢您的回答。

4

2 回答 2

1

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

结果,图像的全局质量可能会更好。

TJpegImage依赖于标准的libjpeg库,而我认为 Adob​​e 有自己的调整实现。您可以尝试其他实现,例如GDI+中包含的实现,或者纯帕斯卡实现,甚至旧 Intel 的库

于 2014-07-08T09:49:11.750 回答
1

看看你的编码器是否支持采样。如果您以低于 Y 分量的速率对 Cb 和 Cr 分量进行采样,则通常可以获得更好的压缩效果而不会造成大量质量损失。如果您执行 4:1:1,您可以将要压缩的数据量减少近三分之一。2:1:1 减半。

这种技术称为色度二次采样。不幸的是,德尔福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

于 2014-07-09T05:41:18.383 回答