2012-11-06 7 views
3

Il y a quelques jours, j'ai posé cette question et a obtenu la réponse: How to add a picture frame and insert the text in the image?Comment réduire la taille de fichier JPG?

Maintenant, quand je sauve le contenu de TPanel (1x forme, 1x TImage, 2x TLabel) sous forme de fichier JPG,
taille de ce fichier JPG est augmenté de 20kb, qui est la taille de l'image dans TImage, à 620kb.

Les dimensions sont presque identiques. Fichier JPG original 320x320, nouvelle image JPG 361x440.

Alors, comment réduire cette taille?

C'est la réponse pour la première question, de @iPath, de sorte comment nouveau fichier JPG est créé:

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

Un fichier Bitmap est en cours de création! Dans la section Notes de ma réponse, j'ai mentionné que vous devez utiliser TJPEGImage pour convertir le bitmap en Jpeg. Mon exemple enregistre un bitmap, comme @ David-Heffernan a clarifié;) –

+5

Soyez prudent avec ceci, BTW. JPEG est un algorithme de compression avec perte, ce qui signifie que si vous enregistrez une image et la chargez à nouveau, vous ne récupérez pas exactement la même image. Ainsi, si vous l'éditez plusieurs fois, en enregistrant au format JPEG à chaque fois, votre image subira plusieurs pertes générationnelles. –

Répondre

13

Qu'est-ce que vous avez enregistré est pas une image JPEG. Vous avez enregistré un bitmap Windows. Cela n'a aucune compression du tout. Il arrive d'avoir l'extension .jpg, mais cela ne rend pas le fichier lui-même un fichier JPEG.

Vous devez utiliser TJPEGImage pour enregistrer le fichier. Contrôlez la compression en utilisant la propriété CompressionQuality. Une fois que vous avez votre image dans un bitmap, le transférer à un 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

Le fichier est enregistré en tant que Bitmap, et pas comme JPEG.

Même avec une qualité "extrêmement bonne", un JPEG ne sera pas de cette taille.

Cependant, un Bitmap 32 bits (sans RLE) sera-361 * 440 * 4 (octets/pixel) ~ 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

Essayez Kernel image en vrac outil Resizer pour redimensionner votre image unique ou multiple à la fois.

Questions connexes