Compresseur jpeg

Soyez le premier à donner votre avis sur cette source.

Vue 15 925 fois - Téléchargée 2 722 fois

Description

Ce code permet de compresser des images selon l'algorithme utilisé pour le format jpeg (DCT, RLE, Huffman...)

Conclusion :


Il doit surement avoir moyen d'aller plus vite, surtout dans l'implementation de l'algo d'Huffman, merci de vos eventuelles suggestions.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Les objets TJpegImage embarquent une propriété CompressionQuality.
En modifiant simplement sa valeur et en appelant Compress(), tu peux (en dexu lignes !!) changer la compression.
Et, en plus, c'est quasi-immédiat.

++
cs_Gimli Messages postés 21 Date d'inscription mardi 31 décembre 2002 Statut Membre Dernière intervention 5 janvier 2008
14 avril 2006 à 18:44
certes, mais c'est pas le but du code, qui est de montrer les étapes de l'algo de compression jpeg!
@+
Ah mais je suis tout à fait d'accord avec toi. Il m'arrive aussi de re-coder des choses déjà faites automatiquement par Delphi (ou des composants additionnels) pour :
- Mieux les comprendre
- Donc mieux les utiliser
- Progresser

Bref, je n'enlève pas du tout le mérite de ton code.
Je te signalais juste une méthode simple au cas où tu ne la connaitrais pas.
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 37
16 avril 2006 à 17:29
procedure TForm1.OuvrirFichier(Name: String);
var
F : File of byte;
begin
Image1.Picture.LoadFromFile(Name);
AssignFile(F, Name);
Reset(F);
SizeDebut := FileSize(F);
CloseFile(F);

Longueur := Image1.Picture.Width;
Largeur := Image1.Picture.Height;

Lbl_Taille_Initiale.Caption := format('Taille initiale : %.2f Ko',[SizeDebut/1024]);
Lbl_Taille_Finale.Caption := 'Taille finale : ';
Lbl_Gain.Caption := 'Gain : ';
Lbl_TauxCompression.Caption := 'Taux de compression : ';
Lbl_TempsCompression.Caption := 'Temps de compression : ';
Lbl_TempsDecompression.Caption := 'Temps de dcompression : ';

Image2.Canvas.Pen.Color := clBtnFace;
Image2.Canvas.Brush.Color := clBtnFace;
Image2.Canvas.Rectangle(0, 0, Image2.Width, Image2.Height);
end;

___________________________________________


procedure TForm1.Button2Click(Sender: TObject);
begin
if Image1.Picture.Width = 0 then Exit;
Time := GetTickCount;
StatusBar1.Panels[0].Text := 'Compression...';
Application.ProcessMessages;

SaveTableauPixels; //Enregistre l'image initiale dans un tableau
ConvertRGBToYCrCb; //Convertit les couleurs de RGB vers YCrCb
DownSample; //Sous-chantillonne la chrominance
LevelShift; //Dcale toutes les valeurs de -128
ApplyDCT; //Applique la DCT
ApplyCoeffs; //Quantifie la matrice (seule tape de perte de l'algorithme)
CodageRLE; //Codage avec le systme RLE
CodageHuffman; //Codage avec le systme Huffman
SafeToFile; //Enregistre le fichier final

StatusBar1.Panels[0].Text := '';
Lbl_TempsCompression.Caption := format('Temps de compression : %.1f s', [(GetTickCount-Time)/1000]);
end;

____________________________________________


procedure TForm1.SaveTableauPixels;
var
I, J : Integer;
Ligne : ^TRGBArray;
begin
SetLength(TableauPixels, Longueur, Largeur, 3);
Image1.Picture.Bitmap.PixelFormat := pf32bit;
for J := 0 to Largeur - 1 do begin
Ligne := Image1.Picture.Bitmap.ScanLine[J];
for I := 0 to Longueur - 1 do begin
with Ligne[I] do begin
TableauPixels[I, J, 0] := rgbRed;
TableauPixels[I, J, 1] := rgbGreen;
TableauPixels[I, J, 2] := rgbBlue;
end;
end;
end;
end;

____________________________________________


if R < 0 then R := 0 else if R > 255 then R := 255;
if G < 0 then G := 0 else if G > 255 then G := 255;
if B < 0 then B := 0 else if B > 255 then B := 255;

>> uses Math;

R := Max( Min(R, 255), 0);
G := Max( Min(G, 255), 0);
B := Max( Min(B, 255), 0);
inkognitodz Messages postés 13 Date d'inscription mardi 19 mai 2009 Statut Membre Dernière intervention 26 juin 2012
19 mai 2009 à 12:45
PUIS-JE AVOIR LE MEME CODE ECRIT SOUS BUILDER C++

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.