【问题标题】:How to Compress Jpeg file to a limited size (e.g 200KB) without losing much image quality如何在不损失太多图像质量的情况下将 Jpeg 文件压缩到有限的大小(例如 200KB)
【发布时间】:2014-08-28 21:08:08
【问题描述】:

我希望在保存到数据库之前减少大约 200KB 的图像大小。假设我有一个 39MB 左右的位图文件,我需要将位图转换为 Jpeg,然后减少 Jpeg 文件

    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),同时质量不会下降太多。

感谢您的回答。

【问题讨论】:

  • 您可能想尝试 jpg 2000 或 JBIG,它们与 JPG 相比提供更好的压缩。
  • 为什么要将图像存储在数据库中?
  • 用户能够将每个库存商品的图像存储到数据库中
  • 哦,来吧!将图像存储为 BLOB 并没有什么不好。它甚至比文件系统工作得更快(空间受到影响)。

标签: image delphi bitmap jpeg lightroom


【解决方案1】:

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

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

TJpegImage 依赖于标准 libjpeg 库,而我认为 Adob​​e 有自己的调整实现。您可以尝试其他实现,例如 GDI+a pure pascal implementation 甚至 old Intel's library 中包含的实现。

【讨论】:

  • 注: 1) Delphi 的 libjpeg 版本比较老。 2) 是的,Adobe 的实现实际上与 IJG 不同(参见fotoforensics.com/tutorial-ela.php#Rainbowing) 3) 无法预测 DCT 在压缩任意图像时会丢弃多少图像信息而无需编写自己的实现或诉诸试错法方法。
【解决方案2】:

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

这种技术称为chroma subsampling。 不幸的是,德尔福的股票TJpegImage 包装了 IJG 实现版本。 6b 没有公开此功能并将编码器上下文初始化为对应于 4:2:0 的所有默认值。如果您愿意,请参考TJPEGImage.Compress 方法代码、libjpeg 文档和pasjpeg 包中的jpeglib.hJPEGLIB.PAS(后者只是将IJG 实现版本6a 直接转换为Pascal)。

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

【讨论】:

  • 不幸的是,Delphi 的 libjpeg 包装器将我们与此隔离开来。见docwiki.embarcadero.com/Libraries/XE2/en/…
  • 这里有一些用 Delphi 编写的旧 JPEG 源代码:
  • 您的链接因某种原因被吃掉了。这可能是一个有价值的补充。
  • 很好,从来不知道这个,谢谢!我冒昧地将其编辑为您的答案。
猜你喜欢
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
  • 2011-11-12
  • 2019-12-13
  • 2016-02-04
相关资源
最近更新 更多