Delphi 使用TJpegImage组件将bmp转换为jpg时出现问题

Delphi 使用TJpegImage组件将bmp转换为jpg时出现问题,delphi,Delphi,我有一个bmp文件,正在尝试将其转换为jpeg格式。使用以下代码创建的jpeg会丢失很多清晰度。我尝试过调整许多设置,但都没有效果 是否有人拥有将bmp文件转换为jpeg的功能 var Bmp: TBitmap; Jpg: TJPEGImage; begin Bmp := TBitmap.Create; Jpg := TJPEGImage.Create; try Bmp.LoadFromFile(BmpFileName); Jpg.Assign(Bmp);

我有一个bmp文件,正在尝试将其转换为jpeg格式。使用以下代码创建的jpeg会丢失很多清晰度。我尝试过调整许多设置,但都没有效果

是否有人拥有将bmp文件转换为jpeg的功能

var
  Bmp: TBitmap;
  Jpg: TJPEGImage;
begin
  Bmp := TBitmap.Create;
  Jpg := TJPEGImage.Create;
  try
    Bmp.LoadFromFile(BmpFileName);
    Jpg.Assign(Bmp);
    jpg.PixelFormat    :=jf24bit;  // or jf8bit
    Jpg.CompressionQuality := 100;
    Jpg.ProgressiveDisplay := False;
    Jpg.ProgressiveEncoding := False;

    Jpg.SaveToFile(JpgFileName);
  finally
    Jpg.Free;
    Bmp.Free;
  end;
end;

更新II很多人回应说,在这种情况下,jpeg不是使用的图形类型。理解。这不是为了打败一匹死马,但我已经能够使用其他程序(如Photoshop)并将其转换为好看的jpeg。我用来创建图表的工具(fusioncharts)也可以将其导出为一个好看的jpeg格式(见下文)。区别是什么?

如果您希望尽可能少地降低质量,则应尽可能少地压缩,即设置
压缩质量:=100

更新

JPG图像格式设计用于照片和类似光栅图片。JPG采用破坏性压缩来减小文件大小。但是,对于较大的质量值(>80),这种压缩的视觉效果可以忽略不计,因为照片不包含相同颜色的大区域、非常规则的形状等

JPG格式不得用于照片以外的任何内容。例如,当JPG压缩时,包含完全相同颜色的大区域、非常规则的形状等的图表、屏幕截图等将显示清晰的人工制品。对于这种类型的光栅图像,请使用PNG。PNG也是一种压缩格式(也是一种非常非常好的格式!),但压缩是无损的


因此,请不要在您的图表中使用JPG!使用PNG

正如安德烈亚斯所说,将压缩质量提升到100。如果您想尝试另一个例子,Bob博士(频繁的SO投稿人)在这里有一个很好的写作:

他有使用流方法的代码。我也希望得到同样的结果,但你永远不知道。代码如下:

正如其他人所说,JPEG格式对于这种图像来说根本是错误的,而且由于高频色度边缘,JPEG图像可能是最糟糕的图像之一

我建议您获取图像的副本,并尝试以不同的格式(PNG、JPEG、GIF、BMP等)保存/预览图像,并亲自体验图像大小、质量和性能之间的权衡

我已经试着用Paint.net将您的测试图像保存为JPEG格式,并获得与Delphi提供的完全相同的质量,因此您(或Delphi)所做的工作没有错

更新:

有一个可选的无损模式 在JPEG标准中定义;然而, 这种模式在中国没有得到广泛支持 产品

我猜FusionCharts和Photoshop有办法指定这种模式。它通常不被使用,因为JPEG通常被认为是有损压缩的同义词


总之,虽然JPEG文件可以支持无损压缩,但JPEG并不是一种理想的压缩格式,因为它没有得到广泛的支持。如果你想要无损,PNG仍然是一个更好的选择。您的图像的PNG压缩版本比无损压缩的JPEG压缩版本(71K对101K)小30%

我认为仅设置jpg.CompressionQuality是不够的。 之后还应该调用jpg.Compress()来实际压缩图像

比如:

jpg:=TJPEGImage.Create(); LoadFromFile('foo.jpg'); jpg.dib(); 压缩质量:=25; jpg.Compress(); SaveToFile('bar.jpg'); jpg.Free()

嗯,,
德扬

我和你有同样的问题。这是我的解决办法

1) 使用来自的TsdJpegGraphic类代替Delphi的TJPEGImage。它是免费的,开源的

2) 守则:

var
  Bmp: TBitmap;
  Jpg: TsdJpegGraphic;
begin
  Bmp := TBitmap.Create;
  Jpg := TsdJpegGraphic.Create;
  try
    Bmp.LoadFromFile(BmpFileName);
    Jpg.CompressionQuality := 100; // !!!
    Jpg.Assign(Bmp);
    Jpg.SaveToFile(JpgFileName);
  finally
    Jpg.Free;
    Bmp.Free;
  end;
end;

在将位图指定给Jpg之前,设置CompressionQuality属性非常重要!如果将此命令置于赋值之后,则库将使用压缩质量的默认值(=80%)。

赋值后只需调用Compress方法bmp to jpeg。这是压缩质量参数生效所必需的。当Delphi执行Jpg.Assign(Bmp)时,它只分配TJPEGImage.FBitmap字段

var
  Bmp: TBitmap;
  Jpg: TJPEGImage;
begin
  Bmp := TBitmap.Create;
  Jpg := TJPEGImage.Create;
  try
    Bmp.LoadFromFile(BmpFileName);
    Jpg.Assign(Bmp);
    
    Jpg.CompressionQuality := 100;
    Jpg.Compress; //!!!

    Jpg.SaveToFile(JpgFileName);
  finally
    Jpg.Free;
    Bmp.Free;
  end;
end;

我不知道这是否是问题所在。在将BMP分配给Jpg之前,您可能需要设置质量设置。转换可能发生在赋值处,而不是保存到文件中。@gbrandt:不,语句的位置非常好。我做了一些后续工作。据我所知,在savetofile调用期间,它似乎失去了清晰性。在我的项目中,我添加了一个图像并将jpeg分配给它。很好,是的。。。如果可能的话,JPG格式不适合这种格式。尝试过-结果相同。你能保证jpeg与bmp获得相同的结果吗?@MSchenkel-不,jpeg是一种有损算法,不会给出与bmp相同的结果。使用GIF或PNG以获得最佳效果。Jpeg对于照片来说是令人满意的,但是你会看到屏幕截图、文本、线条图等的“蚊子”伪影。更改压缩质量不会影响它(我已经在我的原始帖子中更新了该值)。好的,谢谢。“大画面”的答案似乎是jpeg不是适用的图形类型。但是,请阅读上面我的更新II。看起来它实际上可以被转换成一个体面的jpeg。为什么会这样?谢谢你的详细回复。所以“大”图片的答案是不要使用jpeg。但我不明白的是,有些程序如何能够将它保存为jpeg格式,并且仍然让它看起来很漂亮。我在上面添加了一个新的jpeg文件。这个jpeg如何能够很好地渲染?