5

前几天问了这个问题,得到了答案: 如何在图片中添加相框并插入文字?

现在,当我将 TPanel(1x 形状、1x TImage、2x TLabel)中的内容保存为 JPG 文件时,
该 JPG 文件的大小从 20kb(即 TImage 中图片的大小)增加到 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;
4

4 回答 4

16

您保存的不是 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;
于 2012-11-06T20:57:04.463 回答
4

该文件被保存为位图,而不是JPEG。

即使“质量非常好”,JPEG 也不会那么大。

但是,32 位位图(无 RLE)将为- 361 * 440 * 4(字节/像素)~ 640k

于 2012-11-06T20:57:30.370 回答
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;
于 2012-11-06T21:00:38.467 回答
-2

尝试使用 Kernel Bulk image resizer 工具一次调整单个或多个图像的大小。

于 2012-12-20T07:39:56.213 回答