如何减小JPG文件的大小?

5
几天前我提出了这个问题,并得到了答案:如何为图片添加框架并插入文字? 现在,当我将 TPanel(1x 形状、1x TImage、2x TLabel)中的内容保存为 JPG 文件时,这个 JPG 文件的大小从 TImage 中的 20kb 增加到了 620kb。
尺寸几乎相同。原始的 JPG 文件为 320x320,新的 JPG 图片为 361x440。
那么,如何减小文件大小呢?
这是来自 @iPath 的第一个问题的答案,所以这就是新的 JPG 文件的创建方式:
procedure TForm1.SavePanelAsImage;
var
 img: TBitmap;
begin
 img := TBitmap.Create;
 try
  img.Width := fpPanel.Width;
  img.Height := fpPanel.Height;
  fpPanel.PaintTo(img.Canvas, 0, 0);
  img.SaveToFile(fpFileName);
 finally
  img.Free;
end;
end;

正在创建一个位图文件!在我的答案的注释部分中,我提到您必须使用TJPEGImage将位图转换为Jpeg。正如@David-Heffernan澄清的那样,我的示例保存了一个位图 ;) - iPath ツ
5
顺便提醒一下,JPEG是一种有损压缩算法,这意味着如果你保存并重新加载图像,就不会得到完全相同的图像。因此,如果你多次编辑它并每次都保存为JPEG格式,你的图像将会遭受多次世代损失。 - Mason Wheeler
4个回答

18
你保存的不是JPEG图像,而是Windows位图。它没有任何压缩。它恰好有 .jpg 扩展名,但这并不意味着文件本身是JPEG格式。
您需要使用 TJPEGImage 来保存文件。通过使用 CompressionQuality 属性来控制压缩。一旦您将图像转换为位图,就可以将其转移到JPEG中。
uses
  jpeg;

procedure TForm1.SavePanelAsImage;
var
  img: TBitmap;
  JpegImage: TJPEGImage;
begin
  img := TBitmap.Create;
  try
    img.Width := fpPanel.Width;
    img.Height := fpPanel.Height;
    fpPanel.PaintTo(img.Canvas, 0, 0);
    JpegImage := TJPEGImage.Create;
    try
      JpegImage.CompressionQuality := ...;//you decide the value
      JpegImage.Assign(img);
      JpegImage.SaveToFile(fpFileName);
    finally
      JpegImage.Free;
    end;
  finally
    img.Free;
  end;
end;

4
implementation
uses Jpeg;


procedure SaveBMPasJPG(bmp:TBitmap; const FileName:String;Quality:Integer=90);
var
  jpg:TJpegImage;
begin
   jpg:=TJpegImage.Create;
   try
     jpg.CompressionQuality := Quality;
     jpg.Assign(bmp);
     jpg.SaveToFile(FileName);
   finally
     jpg.Free;
   end;

end;

4
文件正在保存为位图,而 不是 JPEG。
即使以“极好的质量”保存 JPEG,也不会达到这样的大小。
然而,一个 32 位位图(不使用 RLE)确实会 - 361 * 440 * 4(字节/像素)〜 640k。

-2

尝试使用Kernel批量图像调整工具,可以一次调整单个或多个图像。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接