IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Les Image, Picture, bitmap, je n'y comprendrai jamais rien [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 094
    Points : 1 058
    Points
    1 058
    Par défaut Les Image, Picture, bitmap, je n'y comprendrai jamais rien
    Bonjour à toutes et à tous,

    Il y a quelques temps, j'avais créé une petite application qui permettait d'ouvrir deux images, de les mettre côte à côte et d'enregistrer le résultat.

    J'étais persuadé que j'avais essayé cette application avec de images *.jpg, mais j'ai dû me tromper, car elle ne fonctionne qu'avec des images *.bmp. Encore que si à l'ouverture, ça ne fonctionne qu'avec des *.bmp, à l'enregistrement, ça fonctionne avec des *.jpg, des *.png ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    unit Base;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Buttons,
      ExtCtrls;
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        btnAssembler: TBitBtn;
        btnDst: TBitBtn;
        btnSrc: TBitBtn;
        OpenDialog: TOpenDialog;
        SaveDialog: TSaveDialog;
        procedure btnAssemblerClick(Sender: TObject);
        procedure btnDstClick(Sender: TObject);
        procedure btnSrcClick(Sender: TObject);
      private
        { private declarations }
        ImgDst: TBitMap;
        ImgSrc: TBitMap;
      public
        { public declarations }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}
     
    { TForm1 }
     
    procedure TForm1.btnDstClick(Sender: TObject);
    begin
      if OpenDialog.Execute then
      begin
        Screen.Cursor:= crHourGlass;
        ImgDst:= TBitMap.Create;
        ImgDst.LoadFromFile(OpenDialog.FileName);
        Screen.Cursor:= crDefault;
        btnSrc.Enabled:= True;
      end;
    end;
     
    procedure TForm1.btnSrcClick(Sender: TObject);
    begin
      if OpenDialog.Execute then
      begin
        Screen.Cursor:= crHourGlass;
        ImgSrc:= TBitMap.Create;
        ImgSrc.LoadFromFile(OpenDialog.FileName);
        Screen.Cursor:= crDefault;;
        btnAssembler.Enabled:= True;
      end;
    end;
     
    procedure TForm1.btnAssemblerClick(Sender: TObject);
    var
      RctSrc, RctDst: TRect;
    begin
      Screen.Cursor:= crHourGlass;
      RctDst:= Rect(ImgDst.Width, 0, ImgDst.Width+ImgSrc.Width, ImgDst.Height); // Rectangle pour le positionnement de l'image de droite
      ImgDst.Width:= ImgDst.Width+ImgSrc.Width; // On agrandit le Bitmap
      RctSrc:= Rect(0, 0, ImgSrc.Width, ImgSrc.Height); // Dimensions de l'image de droite
      ImgDst.Canvas.CopyRect(RctDst, ImgSrc.Canvas, RctSrc);
      ImgSrc.Free;
      if SaveDialog.Execute then
      begin
        Screen.Cursor:= crHourGlass;
        Application.ProcessMessages;
        ImgDst.SaveToFile(SaveDialog.FileName);
      end;
      ImgDst.Free;
      btnSrc.Enabled:= False;
      btnAssembler.Enabled:= False;
      Screen.Cursor:= crDefault;
    end;
     
    end.
    Que faire pour que mon application puisse ouvrir des images au format *. jpg ?

    Cordialement.

    Pierre.

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 879
    Points : 11 373
    Points
    11 373
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    Pour autant que je comprenne, un TImage se charge d'afficher une image contenue dans un TPicture dont il reconnaît le format grâce à RegisterFormat en produisant un TBitmap.
    Un TImage/TPicture doit pouvoir charger un jpeg et tu peux recopier leurs Bitmap comme tu le fais dans ta procédure d'assemblage.

  3. #3
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 094
    Points : 1 058
    Points
    1 058
    Par défaut
    Merci "tourlourou" pour cette solution.

    Pour autant, j'aurais bien aimé comprendre pourquoi un TBitmap.SaveToFile accepte de sauvegarder aux formats *.bmp, *.jpg, *.png alors que le TBitmap. LoadFromFile n'accepte que les fichiers *.bmp ?

    Cordialement.

    Pierre.

  4. #4
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 464
    Points : 4 644
    Points
    4 644
    Par défaut
    Bonjour,

    Les formats images dits bitmap gèrent des points (pixels). A ce titre, JPEG, PNG, BMP, GIF etc. sont tous des formats bitmaps que Lazarus chargera légitimement dans un TBitmap. Le fait qu'il y ait ou pas une compression (destructive ou non), des métadonnées ou pas, une vignette etc. ne change rien au fait qu'ils gèrent des points. Pour en détecter la nature, il suffit de zoomer fortement pour voire apparaître les pixels sous forme de carrés d'autant plus gros que le zoom est fort.

    Il existe d'autres formats images dont la grande famille des vectoriels : svg, eps, odt, wmf, eps, etc. Les images n'y sont pas des collections de points mais des objets dont la position, la taille, le tracé du bord, le remplissage, la forme et d'autres caractéristiques permettent de les dessiner en tenant compte des caractéristiques d'affichage.

    Une droite qui va de (0,0) à (100,100) sera peut être tracée de (0,0) à (10,10) ou (0,0) à (1000,1000) selon que le zoom d'affichage est 1/10 ou 10. Le nombre de points tracés n'est donc pas défini a priori mais dépendra des caractéristiques de l'objet appliquées selon celles de l'espace de tracé (zoom, monochrome ou polychrome, etc.). Là où cela se complique est que certains objets vectoriels peuvent accueillir des images bitmap qui viennent avec leur limitation.

    Pour revenir à un TImage, c'est essentiellement l'association entre un TBitmap qui stocke l'image (et donc garantit sa pérennité) et un espace d'affichage sur l'écran (TCanvas dont les images sont non pérennes). Le TBitmap peut gérer le chargement et la sauvegarde de la plupart des formats bitmaps précités sans intermédiaires mais c'est TPicture qui prépare l'adaptation au format si différent de bmp.
    Code Pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          imgSrc.Picture.LoadFromFile(dlgOpenImg.FileName);
       //  Et non  imgSrc.Picture.Bitmap.LoadFromFile(dlgOpenImg.FileName);

    Le Canvas auquel on accède normalement est celui du TBitmap. Il permet de modifier et lire l'image stockée. L'accès au Canvas de l'espace d'affichage du TImage se fait seulemnt durant l'événement OnPaint. Il permet d'afficher des informations non pérennes, par exemple les valeurs RGB du point du bitmap sous le curseur de la souris.

    En fait, On pourrait simuler un TImage en mariant un TBitmap avec une TPaintBox (qui se compose essentiellement d'un TCanvas). Mais il faudrait gérer toutes les interrelations ce que fait déjà le TImage.

    Salutations

  5. #5
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 094
    Points : 1 058
    Points
    1 058
    Par défaut
    Citation Envoyé par Guesset Voir le message
    Bonjour,

    Les formats images dits bitmap gèrent des points (pixels). A ce titre, JPEG, PNG, BMP, GIF etc. sont tous des formats bitmaps que Lazarus chargera légitimement dans un TBitmap. ...
    Ben chez moi, non, et c'est bien pourquoi je pose la question. Dans le sens sauvegarde, ça fonctionne, mais dans le sens chargement : non. J'ai un message qui me dit que ce n'est pas le bon format si je charge autre chose qu'un *.bmp.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Le projet Assemble_Img a levé une classe d'exception "FPImageException" avec le message : Wrong image format
    Cordialement.

    Pierre.

  6. #6
    Expert confirmé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 464
    Points : 4 644
    Points
    4 644
    Par défaut
    Bonsoir Pierre,

    Citation Envoyé par ChPr Voir le message
    ...Ben chez moi, non, et c'est bien pourquoi je pose la question. Dans le sens sauvegarde, ça fonctionne, mais dans le sens chargement : non. J'ai un message qui me dit que ce n'est pas le bon format si je charge autre chose qu'un *.bmp...
    Regarde le petit extrait que j'ai mis, le chargement du bitmap est préparé par le TPicture ce qui le rend plus versatile.

    Avec un TImage, il n'est pas nécessaire de passer par un objet temporaire.

    Salut

  7. #7
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 930
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 930
    Points : 15 375
    Points
    15 375
    Par défaut
    Bonsoir,

    il y a 3 exemples à aller étudier, ils sont dans /usr/share/lazarus/2.2.6/examples/ (pour Linux, à adapter au cas par cas), il s'agit de
    • imgviewer
    • jpeg
    • jpeg_more

    Enjoy,

  8. #8
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 094
    Points : 1 058
    Points
    1 058
    Par défaut
    Reprenons calmement.

    J'ai bien compris qu'il fallait que je passe par un TPicture pour que je puisse charger / sauvegarder différents formats tels que *.bmp, *.jpg, *.png, *.gif, ... puisque, d'après ce que j'ai compris, c'est cet élément qui fait tout le boulot de transformer les différents formats en format bmp avant de le placer dans son bitmap à lui et non pas dans un TBitmap indépendant.

    Un TBitmap indépendant, tout seul, ne gère que du bmp. Et ce qui m'interpelle, c'est, d'après mes essais, qu'un TBitmap indépendant est capable de sauvegarder son bitmap dans les différents formats évoqués ci-avant. C'est ce manque de cohérence chargement / enregistrement qui m'a perturbé.

    Je ne vais pas polémiquer plus longtemps et je vais passer systématiquement par un TPicture.

    NOTA : par ailleurs, le TImage n'est nécessaire que si on veut afficher les images. Comme ce n'est pas ce que je fais, je me passe du TImage et utilise directement un TPicture soit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Pict : TPicture
    ...
    Pict:= TPicture.Create;
    ...
    Pict. LoadFromFile('Mon fichier');
    ...
    Traitements du Pict.Bitmap ...
    ...
    Cordialement.

    Pierre.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/02/2019, 16h04
  2. [Lazarus] Différence entre Image.Canvas et Image.Picture.BitMap.Canvas
    Par ChPr dans le forum Lazarus
    Réponses: 17
    Dernier message: 15/09/2011, 07h27
  3. []filtre sepia pour les images
    Par nabil dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 27/01/2004, 20h41
  4. Des fonctions OGL pour les images de format usuel ?
    Par jamal24 dans le forum OpenGL
    Réponses: 3
    Dernier message: 31/05/2003, 21h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo