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 :

Redimensionnement d'une image et perte de qualité [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 14
    Points : 15
    Points
    15
    Par défaut Redimensionnement d'une image et perte de qualité
    Bonjour,
    Je me décide à créer un post car je me trouve régulièrement confronté au même problème :
    Quand j'utilise un TImage que je veux redimensionner je m'y prend de la sorte.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    mon_image.stretch:= true;
    mon_image.height:= mon_image.picture.height div 2;
    mon_image.width:= mon_image.picture.width div 2;
    Les dimensions de mon_image correspondent à ce que je souhaite mais la perte de qualité est énorme !
    Y a-t-il un moyen d'obtenir une qualité correcte ?
    J'ai téléchargé la bibilothèque bgrabitmap en espérant trouver une réponse dans les exemples fournis mais cela n'a rien donné.

  2. #2
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 951
    Points : 9 280
    Points
    9 280
    Par défaut
    hello zaary,
    Qu'entends-tu par énorme ? Peux-tu nous mettre une image originale et l'image redimensionnée ? c'est normal que tu perdes de la qualité en réduisant l'image.

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    Bonjour et merci de votre réponse, voici un aperçu de ce que j’obtiens.

    Nom : exemple.jpg
Affichages : 584
Taille : 55,6 Ko

    Même avec des changements de taille moins importants ou d'autres types d'images (je fonctionne généralement avec du png) j'ai toujours cet effet pixélisé...

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 124
    Points
    15 124
    Par défaut
    Salut,

    Je suppose que ta "mon_image" descend de TImage ?
    Il faut faire tout un tas de trucs intermédiaires avant de lui balancer l'image redimensionnée à afficher, et surtout utiliser les bonnes librairies.

    Dans un vieux projet, je fais afficher une image (provenant d'un fichier .jpg) dans un TImage posé sur un panel lui-même posé sur une form, et lorsque je redimensionne (en agrandissement ou en réduction) la form, l'image se redimensionne sans perte de qualité.

    Essaye ça ('tention, je suis sous Linux, y a p'têt' des choses qu'il faudra adapter un poil) :
    TfrmBigDisplay c'est la form d'affichage, pnlSupportImg c'est le panel et imgBigDisplay c'est le TImage.

    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
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    uses
      FPReadJPEG, // pour AfficheJpeg
      LCLtype, IntfGraphics;
     
    const
      IMGMARGINS = 10;
     
    var
      ImgBigHeight,ImgBigWidth: integer;
      FileWidth, FileHeight: integer;
     
    procedure TfrmBigDisplay.SetupWindow(img: string); // img : nom du fichier jpg avec chemin
      function AfficheJPEG: Boolean;
      var
        InStream: TFileStream;
        function DisplayJpeg(const InFileName: TFileStream; Width, Height: Integer): Boolean;
        var
          JpegImage: TJpegImage;
          Bitmap: TBitmap;
          AHeight,AWidth : Integer;
        begin
          Result := False;
          JpegImage := TJpegImage.Create;
          JpegImage.PixelFormat := pf24Bit;
          //JpegImage.Performance:= jpBestQuality; // /!\
          JpegImage.Performance:= jpBestSpeed; // /!\
          try
            //  Load the image
            JpegImage.LoadFromStream(InFileName);
            JpegImage.GetSize(FileWidth, FileHeight);
            // Create bitmap, and calculate parameters
            Bitmap := TBitmap.Create;
            try
              SetupImgForDisplay;
              imgBigDisplay.Picture.Assign(JpegImage);
              Result := True;
            finally
              Bitmap.Free;
              JpegImage.Free;
            end;
          except
            on E: Exception do
              MessageDlg('Erreur','Erreur: '+E.Message,mtError,[mbOk],0);
          end;
        end;
      begin
        InStream := TFileStream.Create(img, fmOpenRead);
        Result := DisplayJpeg(InStream, ImgBigWidth, ImgBigHeight);
        InStream.Free;
      end;
    begin
      imgBigDisplay.Picture.Bitmap := nil; // effacement avant nouveau traitement
      AfficheJPEG;
    end;
     
     
    procedure TfrmBigDisplay.SetupImgForDisplay; // appelé par FormResize
    var
      Ratio1, Ratio2: Double;
      ImagePos: TPoint;
    begin
      Ratio1 := FileWidth/FileHeight;
      Ratio2 := ImgBigWidth/ImgBigHeight;
     
      if ((FileWidth > imgBigWidth) or (FileHeight > imgBigHeight)) then
      begin
        if Ratio1 > Ratio2 then
        begin
          imgBigDisplay.Width := imgBigWidth;
          imgBigDisplay.Height:= round(imgBigDisplay.Width / Ratio1);
        end
        else
        begin
          imgBigDisplay.Height:= imgBigHeight;
          imgBigDisplay.Width := round(imgBigDisplay.Height * Ratio1);
        end;
      end
      else // petites images
      begin
        imgBigDisplay.Width  := FileWidth;
        imgBigDisplay.Height := FileHeight;
      end;
     
      // Centrer image dans container
      ImagePos := Point( (pnlSupportImg.Width  - imgBigDisplay.Width ) div 2,
                         (pnlSupportImg.Height - imgBigDisplay.Height) div 2 );
      // test si la position est négative (si image > à container)
      if ImagePos.X < 0 then ImagePos.X := 0;
      if ImagePos.Y < 0 then ImagePos.Y := 0;
      imgBigDisplay.Left:= ImagePos.X;
      imgBigDisplay.Top := ImagePos.Y;
    end;
     
    procedure TfrmBigDisplay.FormResize(Sender: TObject);
    begin
      SetupContainer;
      if imgBigDisplay.Picture.Bitmap <> nil then SetupImgForDisplay;
    end;
     
    procedure TfrmBigDisplay.SetupContainer; // appelé par FormCreate et FormResize
    begin
      // taille du compo container :
      imgBigWidth := pnlSupportImg.Width -IMGMARGINS;
      imgBigHeight:= pnlSupportImg.Height-IMGMARGINS;
    end;
    Ah, je lis au dernier moment que tu bosses surtout avec du png : je te laisse adapter le code ci-dessus, ça ne devrait pas être trop compliqué à partir du moment où tu utilises la bonne librairie.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  5. #5
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 951
    Points : 9 280
    Points
    9 280
    Par défaut
    hello,
    je ne sais pas comment tu as utilisé la bibliothèque bgrabitmap mais en utilisant le code bestial (grouik !) suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //uses  bgrabitmap,BGRABitmapTypes; 
    procedure TForm1.FormCreate(Sender: TObject);
    var bitmap: TbGrabitmap;
    begin
      bitmap := TbGrabitmap.Create('D:\users\tmp\piece.png');
      BGrareplace(bitmap,bitmap.Resample(50,50,rmSimpleStretch));
      Image2.Picture.Bitmap.Assign(bitmap);
      bitmap.free;
      bitmap := TbGrabitmap.Create('D:\users\tmp\piece.png');
      bitmap.ResampleFilter := rfMitchell;
      BGrareplace(bitmap,bitmap.Resample(50,50,rmFineResample));
      Image3.Picture.Bitmap.Assign(bitmap);
      bitmap.free;
    end;
    j'obtiens le résultat suivant :
    Nom : JP_bgrabitmap.png
Affichages : 642
Taille : 124,7 Ko

    La grande image (image1) est un Timage avec le fichier original png chargé dedans. Image2 et Image3 sont des TImage (image2 en haut pas de filtre élaboré).

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    Avant d'essayer de comprendre votre code, je me suis dis que j’allais le recopier tel quel...

    J'ai pris comme image la pièce de 50 centimes (format jpg et taille de 264x264 donc).
    J'ai mis le panel pnlsupportImg en Alclient sur ma form et placé l'image ImgBigDisplay dessus.

    L'unique ajout à votre code est l'évènement OnCreate de ma form que voici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     SetupContainer;
     SetupWindow(extractfilepath(application.exename)+'piece.jpg');
    end;
    Quand je lance le programme

    Si ImgBigDisplay.Stretch est à false

    Rien ne se produit lors du redimensionnement de ma form.
    (l'image est centrée mais se retrouve simplement rognée lorsque la form rétrécie).


    Si ImgBigDisplay.Stretch est à true
    Quand j'augmente la taille de ma fenêtre, l'image est centrée mais reste à sa taille originale.
    Quand je diminue la taille de ma fenêtre, l'image se redimensionne correctement mais avec la même perte de qualité qu’auparavant.

    Ai-je raté quelque chose dans le peu de code que j'ai ajouté ?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    Merci J.P, c'est parfait !

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

Discussions similaires

  1. Sauvegarde une image jpeg avec la qualité
    Par morgan47 dans le forum VB.NET
    Réponses: 1
    Dernier message: 19/02/2007, 10h48
  2. Réponses: 2
    Dernier message: 27/11/2006, 14h16
  3. [JDesktopPane] Redimensionner d'une image
    Par GLDavid dans le forum Composants
    Réponses: 17
    Dernier message: 05/07/2006, 10h03
  4. [IMAGE][RESIZE] perte de qualité
    Par jlbinfo dans le forum 2D
    Réponses: 4
    Dernier message: 06/08/2005, 11h13
  5. probleme redimensionnement d'une image
    Par meteor4 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 29/11/2004, 13h58

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