Convertir un png en jpeg Delphi XE [Résolu]

Signaler
Messages postés
4
Date d'inscription
samedi 17 septembre 2011
Statut
Membre
Dernière intervention
3 février 2012
-
Messages postés
4
Date d'inscription
samedi 17 septembre 2011
Statut
Membre
Dernière intervention
3 février 2012
-
Bonjour,

J'ai un problème pour convertir une image png en jpeg que je ne m'explique pas vraiment, quand j'essaye d'assigner mon TPngImage à mon TJpegImage je lève le message d'erreur: "Impossible d'assigner TPngImage à TJpegImage".

Voilà la procédure que j'utilise:

procedure ConvertPNGToJPG(Source: String);
var
   png: TPNGImage;
   jpg: TJPEGImage;
begin
   png := TPNGImage.Create;
   jpg := TJPEGImage.Create;
   try
     png.LoadFromFile(Source);
     jpg.Assign(png);
     jpg.SaveToFile(ExtractFilePath(Application.ExeName)+'\pic.jpg');
   finally
     png.Free;
     jpg.Free;
   end;
end;


Si quelqu'un pouvait m'expliquer pourquoi ça ne marche pas ça serait d'une aide plus que précieuse.
Merci par avance.

5 réponses


Salut

"Impossible d'assigner TPngImage à TJpegImage"
Ben le compilo il te dit simplement que ce que tu veux faire (
 jpg.Assign(png);
) est impossible.

Transformer un type en un autre, ça ne se fait pas comme ça (Transformer une pizza toi en tarte aux concombres)
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
44
oui c'est tout à fait ça

voici une variante qui donne un meilleur résultat un pgn transparent et semi-transparent:

procedure ConvertPNGToJPG(Source: String);
var
   png: TPNGImage;
   bmp: TBitmap;
   jpg: TJPEGImage;
begin
   png := TPNGImage.Create;
   bmp := TBitmap.Create;
   jpg := TJPEGImage.Create;
   try
     png.LoadFromFile(Source);

     bmp.Width := png.Width;
     bmp.Height := png.Height;
     png.Draw(bmp.Canvas, bmp.Canvas.ClipRect);

     jpg.Assign(bmp);
     jpg.SaveToFile(ExtractFilePath(Application.ExeName)+'\pic.jpg');
   finally
     png.Free;
     bmp.Free;
     jpg.Free;
   end;
end;



[hr]@+Cirec
[hr]
Messages postés
4
Date d'inscription
samedi 17 septembre 2011
Statut
Membre
Dernière intervention
3 février 2012

Merci pour la précision, j'ai jamais été très bon en pâtisserie ^^
J'imagine que j'ai péché par optimisme, c'est une procédure que j'ai trouvée sur un forum j'avais donc présumé quelle était censé marcher... J'imagine que je vais devoir passer par une librairie du style RxliB (qui apparemment a quelques soucis avec XE) ? Ou XE peut-il gérer ça sans passer par une lib tierce ? J'avoue ne pas avoir trouvé beaucoup d'infos là-dessus.
Messages postés
4
Date d'inscription
samedi 17 septembre 2011
Statut
Membre
Dernière intervention
3 février 2012

Bon je me répond à moi-même ça pourra toujours servir, il faut passer par un TBitmap et ça marche parfaitement (cf: http://stackoverflow.com/questions/7337889/save-picture-to-a-variety-of-file-formats).

procedure ConvertPNGToJPG(Source: String);
var
   png: TPNGImage;
   jpg: TJPEGImage;
   Bmp: TBitmap;
begin
   png := TPNGImage.Create;
   jpg := TJPEGImage.Create;
   bmp := TBitmap.Create;
   try
     png.LoadFromFile(ExtractFilePath(Application.ExeName)+'pic.png');
     bmp.Assign(png);
     jpg.Assign(bmp);
     jpg.SaveToFile(ExtractFilePath(Application.ExeName)+'pic.jpg');
   finally
     png.Free;
     jpg.Free;
     bmp.Free;
   end;
end;


Merci encore pour l'aiguillage.
Messages postés
4
Date d'inscription
samedi 17 septembre 2011
Statut
Membre
Dernière intervention
3 février 2012

Merci pour la précision et l'optimisation, j'up mon code.