2012-11-06 162 views
3

前几天我问了这个问题,并得到了答案: How to add a picture frame and insert the text in the image?如何缩小JPG文件的大小?

现在,当我保存从TPanel(1X形状,1个的TImage,2倍的TLabel)为JPG文件内容,
大小的JPG文件是从TIkb中的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; 
+0

正在创建位图文件!在我的答案的注释部分我提到你必须使用TJPEGImage将位图转换为Jpeg。我的例子保存了一张位图,就像@David Heffernan澄清的那样;) –

+5

小心这个,顺便说一句。 JPEG是一种有损压缩算法,这意味着如果您保存图像并重新加载图像,则无法得到完全相同的图像。所以如果你多次编辑它,每次保存为JPEG,你的图像将遭受多代的损失。 –

回答

13

你救的不是一个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

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

即使在“质量非常好”的情况下,JPEG也不会那么大。

然而,一个32位的位图(不带RLE) - 361 * 440 * 4(字节/像素)〜640K

3
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; 
-2

尝试内核散装图像缩放工具用于调整图像单或一次多个。