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

 Delphi Discussion :

Perte de qualité d'image CopyToClipboard & TPicture


Sujet :

Delphi

  1. #1
    Membre actif Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 303
    Points : 269
    Points
    269
    Par défaut Perte de qualité d'image CopyToClipboard & TPicture
    Bonjour a tous,

    Comment peut-on perdre de la qualité d'une image en passant par TPicture ?

    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
    procedure...
    var
      Picture: TPicture;
    begin
      Clipboard.Clear;
      RichEdit.CopyToClipboard; // TLMDRichEdit
     
      if Clipboard.HasFormat(CF_PICTURE) then
      begin
        Picture := TPicture.Create;
        Picture.Assign(Clipboard);
        Clipboard.Clear;
     
        Image1.Picture.Assign(Picture);
        FreeAndNil(Picture);
      end;
    end;
    Image d'origine

    Nom : Capture1.PNG
Affichages : 137
Taille : 29,9 Ko

    Image du ClipBoard

    Nom : Capture2.PNG
Affichages : 131
Taille : 36,3 Ko

    À mon avis, le problème provient du TPicture. Par exemple, si je copie l'image et que je la colle dans le Wordpad de Windows, l'image est de même qualité que l'origine.

    Merci beaucoup.
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.
    Ce n’est pas un bogue - c’est une fonctionnalité non documentée.

  2. #2
    Membre actif Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 303
    Points : 269
    Points
    269
    Par défaut
    J'ai testé de passer directement par le TMetaFile en redessinant le graphique sur Tbitmap.
    Envain, j'ai toujours une perte de qualité.

    Il y a quelque chose que je ne saisis pas.

    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
    var
      MetaFile: TMetaFile;
      Bitmap: TBitmap;
    begin
      Clipboard.Clear;
      RichEdit.CopyToClipboard; // TLMDRichEdit
     
      if Clipboard.HasFormat(CF_METAFILEPICT) then
      begin
        MetaFile := TMetaFile.Create;
        MetaFile.Assign(Clipboard);
     
        Bitmap := TBitmap.Create;
        Bitmap.PixelFormat := pf32bit;
        Bitmap.SetSize(MetaFile.Width, MetaFile.Height);
        Bitmap.Canvas.StretchDraw(Rect(0, 0, MetaFile.Width, MetaFile.Height), MetaFile);
     
        Clipboard.Clear;
        Image1.Picture.Bitmap.Assign(Bitmap);
     
        FreeAndNil(Bitmap);
        FreeAndNil(MetaFile);
      end;
    end;
    Nom : Video_2024_07_28-1_edit_0.gif
Affichages : 89
Taille : 1,96 Mo

    En y jetant un coup d'œil plus attentif, on remarque un léger zoom sur le graphique collée dans la TImage, Il est possible que cette perte de qualité soit due au fait que les dimensions du TMetaFile ne sont pas correctes.

    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
    var
      MetaFile: TMetaFile;
      Bitmap: TBitmap;
      ImageOG: TPicture;
    begin
      Clipboard.Clear;
      RichEdit.CopyToClipboard; // TLMDRichEdit
     
      if Clipboard.HasFormat(CF_METAFILEPICT) then
      begin
        MetaFile := TMetaFile.Create;
        MetaFile.Assign(Clipboard);
     
        ImageOG := TPicture.Create;
        ImageOG.LoadFromFile('Graph.bmp');
     
        ShowMessage('Image OG : Width = ' + IntToStr(ImageOG.Width) + ', Height = ' +
          IntToStr(ImageOG.Height) + #13 + 'Image MetaFile Clipboard : Width = ' +
          IntToStr(MetaFile.Width) + ', Height = ' + IntToStr(MetaFile.Height));
     
        ImageOG.Free;
     
        Bitmap := TBitmap.Create;
        Bitmap.PixelFormat := pf32bit;
        Bitmap.SetSize(MetaFile.Width, MetaFile.Height);
        Bitmap.Canvas.StretchDraw(Rect(0, 0, MetaFile.Width, MetaFile.Height), MetaFile);
     
        Clipboard.Clear;
        Image1.Picture.Bitmap.Assign(Bitmap);
     
        FreeAndNil(Bitmap);
        FreeAndNil(MetaFile);
      end;
    end;
    Nom : Capture3.PNG
Affichages : 88
Taille : 5,6 Ko

    Il y a quelque chose qui me rajoute des pixels supplémentaires lors de la copie (CopyToClipboard).
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.
    Ce n’est pas un bogue - c’est une fonctionnalité non documentée.

  3. #3
    Membre actif Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 303
    Points : 269
    Points
    269
    Par défaut
    Je crois avoir résolu le problème en passant par TMemoryStream & Picture.LoadFromStream(Stream)

    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
    var
      Metafile: TMetafile;
      Stream : TMemoryStream;
    begin
      Clipboard.Clear;
      RichEdit.CopyToClipboard; // TLMDRichEdit
     
      if Clipboard.HasFormat(CF_METAFILEPICT) then
      begin
        Metafile := TMetafile.Create;
        Metafile.Assign(Clipboard);
     
        Metafile.Enhanced := False;
        Stream := TMemoryStream.Create;
        Metafile.SaveToStream(Stream);
        Stream.Position := 0;
     
        Clipboard.Clear;
        Image1.Picture.LoadFromStream(Stream);
     
        FreeAndNil(Stream);
        FreeAndNil(Metafile);
      end;
    end;
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.
    Ce n’est pas un bogue - c’est une fonctionnalité non documentée.

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

Discussions similaires

  1. [AC-2007] Perte de qualité d'image liée
    Par DamKre dans le forum IHM
    Réponses: 11
    Dernier message: 22/04/2024, 19h24
  2. [WD-2013] Perte de qualité d'images .png dans word 2013
    Par bendesarts dans le forum Word
    Réponses: 8
    Dernier message: 22/03/2014, 23h10
  3. [Images] Perte de qualité en aplliquant un fond transparent !
    Par Thiouzz dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 25/11/2007, 19h47
  4. Réponses: 2
    Dernier message: 13/03/2006, 16h03
  5. [IMAGE][RESIZE] perte de qualité
    Par jlbinfo dans le forum 2D
    Réponses: 4
    Dernier message: 06/08/2005, 11h13

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