Eviter la fenêtre erreur jpeg #41 si chargement d'image jpg invalide

Description

Si un jpg invalide ne peut être chargé dans notre TImage, l'erreur sera traitée sans l'apparition de cette maudite fenêtre.

Le problème a été soulevé récemment par Gordo Cabron.

Si l'on veut charger une image au format jpg dans une TImage, il semblerait suffisant de protéger son code dans un bloc try...except...end.
Cela fonctionne dans le cas d'un fichier inexistant.
Mais en cas de fichier corrompu ou invalide, une fenêtre "Erreur JPEG #41" apparaît et empêche de traiter l'erreur de manière silencieuse ou autre...

Or, dans un programme de visualisation d'images auquel je travaille depuis un certain temps, je ne me rappelais pas avoir eu cette difficulté, ce qui m'a intrigué.

Après analyse, j'ai trouvé pourquoi :
dans mon code, je passe par un TBitmap, etc..., que j'assigne à un TJpegImage, avant affichage dans une TImage.
Du coup l'erreur se produit à un autre niveau, ce qui permet de la gérer sans l'apparition de cette fichue fenêtre, ce dont l'utilisateur de notre programme n'a que faire !

J'ai donc bossé un peu, et voici le résultat sous forme d'une fonction.

function LoadImageJpeg(FromFile: String; ToImage: TImage): Boolean;

Les arguments à passer sont : le chemin + nom du fichier jpg, le TImage où doit s'afficher l'image.
La valeur retournée est True si l'image est valide, False dans le cas contraire.

Je joins un exemple d'application de cette fonction dans le zip.

Et... petit clin d'oeil à Mauricio (va savoir pourquoi ?) ;)

ATTENTION : Mise à jour majeure, le code précédent était erronné !

Source / Exemple :


uses jpeg;

function LoadImageJpeg(FromFile: String; ToImage: TImage): Boolean;
var Bmp: TBitmap;
    Jpg: TJpegImage;
begin
  Result := True;
  try
    Bmp := TBitmap.Create;
    Jpg := TJpegImage.Create;
    try
      Jpg.LoadFromFile(FromFile);
      Bmp.Assign(Jpg);
      ToImage.Picture.Assign(Bmp);
    except
      Result := False;
    end;
  finally
    Jpg.Free;
    Bmp.Free;
  end;
end;

Conclusion :


Désolé pour les 9 ko de l'image dans le zip, mais j'ai pas eu le coeur de réduire davantage la qualité...

Codes Sources

A voir également

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.