2012-11-06 229 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

嘗試內核散裝圖像縮放工具用於調整圖像單或一次多個。