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 :

Recopie d'images [Lazarus]


Sujet :

Lazarus Pascal

  1. #21
    Membre Expert

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Par défaut
    Salut Jipété,

    J'ai l'impression que tu n'as pas lu mon post concernant un test dans Photoshop
    Dans le code que j'ai fourni pour faire une réduction de l'image avec anti-aliasing, ce n'est pas la couleur des pixels qui a changé, mais bien leur opacité.
    Je parle ici pour une image png avec fond transparent ! Car si on place en dessous un fond blanc et qu'on aplatit l'image, évidemment le mix des 2 calques donne du gris pour les pixels semi-transparents.
    Pour retrouver le noir, il faut ré-augmenter l'opacité des pixels.

    Dans l'image,
    le premier 39 est l'original en 60/60,
    le deuxième 39 est obtenu par resampling (bgrabitmap): il y a du gris
    le troisième est obtenu en modifiant le canal alpha avec le petit code ci-après. J'ai appliqué un facteur 3. C'est plus noir, mais on retrouve un peu l'effet d'escalier. Ce qui est normal, puisqu'on détruit ce que l'antialiasing avait fait.

    Nom : Test reduction.png
Affichages : 244
Taille : 2,2 Ko


    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 ChangeAlpha(ABitmap: TBGRABitmap; AFactor: double);
    var
       pix: PBGRAPixel;
       i: integer;
       A: integer;
    begin
         pix:= ABitmap.Data;
         for i := ABitmap.NbPixels -1  downto 0 do
         begin
              A:= Round(pix^.alpha * AFactor);
              if A > 255 then A:= 255;
              if A < 0 then A:= 0;
              pix^.alpha:= A;
              inc(pix);
         end;
         ABitmap.InvalidateBitmap;
    end;
    Cordialement
    Thierry

  2. #22
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Citation Envoyé par gvasseur58 Voir le message
    Là, je suis fatigué, mais je regarderai demain ta page teutonne : il me reste quelques souvenirs de Goethe...

    Gilles
    Trop bien ! On va peut-être y voir un peu plus clair

    Yop, Thierry,
    Citation Envoyé par ThWilliam Voir le message
    Salut Jipété,

    J'ai l'impression que tu n'as pas lu mon post concernant un test dans Photoshop
    Si si, mais je ne voyais pas comment le mettre en œuvre sans une ligne de code... Là tu me combles, je vais creuser ça, d'autant plus que cet après-midi j'ai commencé à regarder l'accès direct aux pixels...
    En gros, l'idée ça serait que tout ce qui est par exemple situé entre 35 (gris très foncé presque noir) et 127 soit étiré entre 0 (tout noir) et 127, et pour les hautes lumières on verra après

  3. #23
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Citation Envoyé par ThWilliam Voir le message
    le troisième est obtenu en modifiant le canal alpha avec le petit code ci-après. J'ai appliqué un facteur 3. C'est plus noir, mais on retrouve un peu l'effet d'escalier. Ce qui est normal, puisqu'on détruit ce que l'antialiasing avait fait.
    Merci pour ton code. Avec un facteur 2, je pense que c'est un bon compromis. Tiens, regarde, en haut ce qu'on voit en bas zoomé à 400 %, à gauche l'original, à droite avec ta procédure et un facteur 2

    Nom : facteur_2.png
Affichages : 236
Taille : 3,8 Ko

    Là il est tard et j'en ai un peu marre, mais demain je testerai 1,5 ou par là...

    Grand merci à toi, Thierry

  4. #24
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 221
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 221
    Par défaut
    hello,
    dans fpc (dans la 2.6.4 par exemple) normalement il y a l'interfaçage avec imagemagick qui est inclus ce qui permet d'utiliser imagemagick avec lazarus. Il faut bien sûr que imagemagick soit installé mais aussi libmagickwand-dev .
    voici un exemple d'utilisation qui retaille une image png avec transparence de 256x256 en 64x64 et qui l'affiche dans un 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
    unit Unit1;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
      StdCtrls,  magick_wand, ImageMagick;
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        Button1: TButton;
        Image1: TImage;
        procedure Button1Click(Sender: TObject);
        procedure Image1Click(Sender: TObject);
      private
        { private declarations }
      public
        { public declarations }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}
    procedure ThrowWandException(wand: PMagickWand);
    var
      description: PChar;
      severity: ExceptionType;
    begin
      description := MagickGetException(wand, @severity);
      WriteLn(Format('An error ocurred. Description: %s', [description]));
      description := MagickRelinquishMemory(description);
      Abort;
    end;
     
    { TForm1 }
     
    procedure TForm1.Button1Click(Sender: TObject);
      var
      status: MagickBooleanType;
      wand: PMagickWand;
    begin
      { Read an image. }
      MagickWandGenesis;
      wand := NewMagickWand;
      try
        status := MagickReadImage(wand, 'bb.png');
        if (status = MagickFalse) then ThrowWandException(wand);
        { Turn the images into a thumbnail sequence. }
        MagickResetIterator(wand);
        while (MagickNextImage(wand) <> MagickFalse) do
         MagickResizeImage(wand, 64, 64, LanczosFilter, 1.0);
        { Write the image as MIFF and destroy it. }
        status := MagickWriteImages(wand, 'bbx_64.png', MagickTrue);
        if (status = MagickFalse) then ThrowWandException(wand);
        Image1.Picture.LoadFromFile('bbx_64.png');
      finally
        wand := DestroyMagickWand(wand);  
        MagickWandTerminus;
      end;
     
    end;
     
    end.
    Ce code fonctionne sous Ubuntu 14.04 64 bits Lazarus 1.2.6 ImageMagick libmagick5

    Ami calmant, J.P

  5. #25
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Salut, J.P.,

    Citation Envoyé par jurassic pork Voir le message
    Il faut bien sûr que imagemagick soit installé mais aussi libmagickwand-dev .
    Ça tombe bien, j'avais tout ça, suite à de vieilles manip's...

    Mais je suis moyennement satisfait par un comportement que je ne m'explique pas : je suis parti d'une image 60x60 que j'ai convertie en 32x32, et voilà le résultat, à gauche dans le TImage posé sur la form, à droite dans l'explorateur de fichier...

    Nom : with_imgmagic.png
Affichages : 253
Taille : 8,5 Ko

    Quand on lit que la seule action est le chargement avec Image1.Picture.LoadFromFile(PChar(fileutil.ProgramDirectory + 'wp32.png'));, on est en droit de s'interroger, nan ?
    Qui me trafique l'image ? Le chargement avec LoadFromFile, ou l'affichage dans l'explorateur (pcmanfm) qui fait ce qu'il veut, ou ?...

    Tout ce que je peux dire, c'est qu'avec un analyseur de pixels, dans l'explorateur la bande gris foncé du bas a une valeur de 68 alors que l'image affichée sur la form a une valeur de 2, quasiment noir.
    Comment des choses pareilles sont-elles possibles ?
    Gilles, au secours, c'est magique, encore une fois

    Sinon, merci pour la piste, et bonne journée.

    Un dernier mot : j'ai bien trouvé les options possibles pour le filtrage,
    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
    type
     FilterTypes = (
      UndefinedFilter,
      PointFilter,
      BoxFilter,
      TriangleFilter,
      HermiteFilter,
      HanningFilter,
      HammingFilter,
      BlackmanFilter,
      GaussianFilter,
      QuadraticFilter,
      CubicFilter,
      CatromFilter,
      MitchellFilter,
      LanczosFilter,
      BesselFilter,
      SincFilter
     );
    mais où puis-je trouver quelque chose qui va me dire qui fait quoi, et à quelle valeur régler l'option que tu avais positionnée à 1.0 ?

  6. #26
    Membre Expert

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Par défaut
    Voici peut-être une explication à ce que tu trouves magique.

    Pour afficher (sur une form ou dans explorateur de fichier...) une image png qui joue avec la transparence, il faut faire un blending avec l'arrière-plan.
    Or, d'après ton printscreen, le fond de ta form est gris, alors qu'il est blanc dans l'explorateur. Le blending va donc donner un résultat différent.

    Un pixel noir (0) avec une opacité de 80% :
    sur un fond gris(192), cela va donner comme couleur résultante : 0 + 192(1-0.8) = 38
    sur un fond blanc(255) : 0 + 255(1-0.8) = 51
    donc, couleur résultante plus claire sur fond blanc.

    Cela dit, l'écart entre 2 et 68 me parait énorme.
    A croire que, soit ton explorateur ou soit Larazus ne respectent pas les formules du blending.
    http://fr.wikipedia.org/wiki/Alpha_blending

    Cordialement
    Thierry

  7. #27
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Merci de te pencher sur tout ça.
    En fin de post, une surprise...

    Citation Envoyé par ThWilliam Voir le message
    [...] Cela dit, l'écart entre 2 et 68 me parait énorme.
    A croire que, soit ton explorateur ou soit Larazus ne respectent pas les formules du blending.
    http://fr.wikipedia.org/wiki/Alpha_blending

    Cordialement
    Thierry
    Comment savoir qui ne respecte pas les normes ? (et merci pour l'article, mais désolé, je n'y ai rien compris J'ai bien dit que le graphisme n'était pas ma tasse de thé...)

    Bon, la surprise, c'est que j'en rajoute une couche dans les déviations, avec un autre comportement, et peut-être le plus beau de tous : l'affichage du fichier de ce matin dans l'Aperçu des images et des télécopies Windows dans une machine virtuelle XP SP2 ; j'ai beaucoup zoomé, directement dans l'appli, pour qu'on voie bien :

    Nom : pion24zoomé_dans_xp.png
Affichages : 224
Taille : 13,3 Ko

    Affiché en taille normale, c'est parfait, et le noir de la bande inférieure est à 50.
    Tes calculs donnaient 51 sur un fond blanc, et là, le fond est à 238 242 251 (RGB), on n'est pas au blanc (moyenne = 243,6 mais on tire sur le bleu)...

  8. #28
    Membre Expert

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Par défaut
    Allez hop, encore un petit test...

    Création d'une image png avec pinceau noir à différents niveaux d'opacité.
    Avec Lazarus (sous Windows 7) : un TImage placé sur fond blanc, puis sur fond gris.
    Printscreen puis contrôle des niveaux de gris.
    Résultat : 100% conforme à la formule du blending.
    Donc Lazarus hors de cause.
    Et... Windows aussi (pour une fois qu'on ne peut rien lui reprocher... )

    Thierry

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Protéger la recopie d'une image
    Par laura001 dans le forum Sécurité
    Réponses: 0
    Dernier message: 29/08/2011, 16h27
  2. Recopier des images plusieurs fois
    Par wyzer dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/10/2010, 11h57
  3. recopier une zone d'image.
    Par flo291288 dans le forum C++Builder
    Réponses: 11
    Dernier message: 28/05/2009, 20h26
  4. Resize d'une image
    Par Anonymous dans le forum C
    Réponses: 6
    Dernier message: 13/07/2008, 22h23
  5. lire une image au format RAW
    Par Anonymous dans le forum OpenGL
    Réponses: 5
    Dernier message: 20/05/2002, 00h11

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