前几天我问了这个问题并得到了答案: How to add a picture frame and insert the text in the image?
现在,当我将TPanel(1x形状,1x TImage,2x TLabel)的内容保存为JPG文件时, JPG文件的大小从20kb增加到TIk的图片大小,达到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;
答案 0 :(得分:14)
您保存的内容不是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;
答案 1 :(得分:4)
文件保存为位图,不为JPEG。
即使是“非常好的质量”,JPEG也不会那么大。
然而,32位位图(没有RLE)将 - 361 * 440 * 4(字节/像素)~640k
答案 2 :(得分: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;
答案 3 :(得分:-2)
尝试使用内核批量图像缩放器工具,一次调整单个或多个图像的大小。