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

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 381
    Points : 11 918
    Points
    11 918

    Par défaut ScreenScanlineResize (de chez efg), la galère -- et la solution !

    Bonjour,

    J'ai cru devenir fou avec ce projet très simple de chez efg, qui fait deux choses :
    - afficher une grille dessinée sur le canvas d'un bitmap ou charger un fichier .bmp puis
    - réduire la taille de l'image affichée.

    Nom : scanlineresize.jpg
Affichages : 81
Taille : 59,5 Ko
    (les boutons et cases à cocher à droite sont des ajouts perso pour tests, suite lecture, voir tt en bas)

    Il m'a fallu blinder le code de ShowMessage pour comprendre :
    au run (l'image est créée au FormCreate) -->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    create -- PixelFormat = 24 Bits <--- BitmapOriginal est examiné
    resize -- PixelFormat = 24 Bits <--- bmp de travail
    image ok (présentée un peu réduite ci-dessus)

    si bouton load pour choisir un fichier 24 bits -->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    load   -- PixelFormat = 24 Bits <--- BitmapOriginal est examiné
    resize -- PixelFormat = 24 Bits <--- bmp de travail
    image en vrac (couleurs fausses, les traits verticaux, )


    Au final et après pas mal de tests dans la procédure ScanlineResize, voilà ce que j'ai noté en commentaires dans le FormCreate :

    pour que la grille soit correctement affichée, IL FAUT utiliser pRGBQuad pour la source et la destination dans la procédure de resize.

    MAIS pour qu'un fichier chargé par le bouton "load" soit bien affiché, IL FAUT y mettre pRGBTriple pour la source et pRGBQuad pour la destination.

    Je vous laisse imaginer le plaisir pour maintenir tout ça (et je n'ai pas testé avec les bmp en 32 bits, ni tous les fichiers cassés d'un dossier de test proposé par Jérôme il y a quelque temps déjà).
    Cœur de la procédure :
    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
      VAR
        ...
        rowInc :  pRGBQuad;   // ok avec image créée au FormCreate
        rowInf :  pRGBTriple; // ok avec loadimage et le fichier bonbons_640x500x24.bmp
        rowOut :  pRGBQuad;
      BEGIN
        ...
        BitmapSmalller.BeginUpdate();
        if letter = 'c' then // FormCreate
          FOR j := 0 TO BitmapSmalller.Height-1 DO
          BEGIN
            rowInc := pRGBQuad(BitmapOriginal.RawImage.GetLineStart(factor*j));
            rowOut := pRGBQuad(BitmapSmalller.RawImage.GetLineStart(j));
            FOR i := 0 To BitmapSmalller.Width-1 DO
            BEGIN
              lookup := factor*i;
              rowOut[i] := rowInc[lookup] // dessous identique, gardé pour mémoire
              {WITH rowOut[i] DO BEGIN
                rgbRed      := rowInc[lookup].rgbRed;
                rgbGreen    := rowInc[lookup].rgbGreen;
                rgbBlue     := rowInc[lookup].rgbBlue;
                rgbReserved := rowInc[lookup].rgbReserved;
              END     }
            END;
          END
        else // bouton Load
          FOR j := 0 TO BitmapSmalller.Height-1 DO
          BEGIN
            rowInf := pRGBTriple(BitmapOriginal.RawImage.GetLineStart(factor*j));
            rowOut := pRGBQuad(  BitmapSmalller.RawImage.GetLineStart(j));
            FOR i := 0 To BitmapSmalller.Width-1 DO
            BEGIN
              lookup := factor*i;
              WITH rowOut[i] DO BEGIN
                rgbRed      := rowInf[lookup].rgbtRed;
                rgbGreen    := rowInf[lookup].rgbtGreen;
                rgbBlue     := rowInf[lookup].rgbtBlue;
                rgbReserved := 255;
              END
            END;
          END;
        BitmapSmalller.EndUpdate();
    Un peu de lecture utile sur le sujet .
    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

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2002
    Messages
    2 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : mai 2002
    Messages : 2 896
    Points : 4 760
    Points
    4 760

    Par défaut

    Salut

    Pourquoi vouloir absolument passer par une image intermédiaire ?
    Le plus simple est d’utiliser un tableau d'octets (byte) (pas de changement automatique sous-jacent qui sort d'on ne sait où), une fois ton traitement effectué tu recopies ton tableau d'octets (byte) dans un bitmap bien formé.
    J'avoue que j'ai du mal à comprendre les nœuds que tu te mets dans la tête.
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 381
    Points : 11 918
    Points
    11 918

    Par défaut

    Yop !

    Citation Envoyé par anapurna Voir le message
    pourquoi vouloir absolument passer par une image intermédiaire
    Scénario :
    • Je récupère le zip chez efg et je le décompresse ;
    • je fais tourner l'outil de conversion de projet ;
    • j'exécute le projet converti et au choix,
    • - ça se vautre avec SIGSEGV ou autre joyeuseté,
    • - ou au mieux je n'ai pas les bonnes couleurs.

    À partir de là, faut improviser, et c'est comme au jazz, y en a qui partent dans une direction, et d'autres qui partent dans une autre direction.

    Par ailleurs, je ne vois pas de quelle image intermédiaire tu parles : je me suis contenté de rajouter un flag (la string letter) pour permettre à la procédure de choisir entre pRGBTriple et pRGBQuad, c'est tout.


    Maintenant, si tu veux du sport et du lourd, dans un autre projet j'ai découvert il y a une heure un truc dément -- EDIT je voulais faire une discussion dédiée, je le mets ici :
    J'ai réfléchi, je crée un nouveau sujet pour ça.
    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

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 381
    Points : 11 918
    Points
    11 918

    Par défaut

    Salut,
    Citation Envoyé par anapurna Voir le message
    j'avoue que j'ai du mal à comprendre les nœuds que tu te mets dans la tête
    Ce n'est pas moi qui me les mets, simplement je les constate (le plus intéressant, ce sont les commentaires) :
    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
    procedure TForm1.ShowAnImage(Filename: string);
    Var
      Bitmap: TBitmap;
    Begin
      Bitmap := TBitmap.Create;
      ShowMessage(StringReplace(Bitmap.RawImage.Description.AsString, ' ', LineEnding, [rfReplaceAll]));
      // Depth 24 Bpp 32
     
      Bitmap.PixelFormat := pf32bit; // normalement il n'y a pas besoin de cette ligne, mais constatation qu'elle modifie Depth
      ShowMessage(StringReplace(Bitmap.RawImage.Description.AsString, ' ', LineEnding, [rfReplaceAll]));
      // Depth 32 Bpp 32
     
      Bitmap.LoadFromFile(Filename);
      ShowMessage(StringReplace(Bitmap.RawImage.Description.AsString, ' ', LineEnding, [rfReplaceAll]));
      // Detph 24 Bpp 24 même avec un fichier 32 bits
     
      Try
        ShowMessage(StringReplace(image1.Picture.Bitmap.RawImage.Description.AsString, ' ', LineEnding, [rfReplaceAll]));
        // Detph 24 Bpp 32
     
        image1.Picture.Bitmap.PixelFormat := pf32bit; // modifie Depth
        ShowMessage(StringReplace(image1.Picture.Bitmap.RawImage.Description.AsString, ' ', LineEnding, [rfReplaceAll]));
        // Detph 32 Bpp 32
     
        image1.Picture.Assign(Bitmap);
        ShowMessage(StringReplace(image1.Picture.Bitmap.RawImage.Description.AsString, ' ', LineEnding, [rfReplaceAll]));
        // Detph 24 Bpp 24 même avec un fichier 32 bits
        // normal, ça vient du TBitmap qui a été modifié par le LoadFromFile...
     
      Finally
        Bitmap.Free;
      End;
    End;
    (et on s'étonne que je me trompe dans les calculs : j'ai les neurones en vrac après ce genre de constatations, )

    Si certains veulent tester, c'est facile comme tout : un TImage, un TButton, un TOpenPictureDialog et juste ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if opd.Execute then ShowAnImage(opd.FileName);
    end;
    Je rappelle que je suis sous Linux...
    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
    Membre émérite
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 1 102
    Points : 2 892
    Points
    2 892
    Billets dans le blog
    2

    Par défaut

    Salut,

    Ces problèmes de Depth et bpp ne sont pas nouveaux et c'est bien de là que viennent tous les problèmes dans la manipulation des bitmaps avec Lazarus.
    On y a souvent fait référence, dans nos discussions, la gestion interne des bitmaps est une vraie plaie avec Lazarus et les FPBitmap de FreePascal. Il y a beaucoup d'incohérences sur plusieurs niveaux.
    Les dimensions, la gestion des couleurs entre OS et j'en passe. Exemple tu charges un BMP 32bits et il est reconnu comme un 24bits, mais ses données sont des "RGQQuads" bref un joli méli-mélo pour s'y retrouver convenablement.

    Si vous voulez travailler correctement avec les bitmaps et les scanlines, il faut constamment se référer au Depth et BPP du RawImageDescription, plus du RowStride pour connaître exactement comment sont formées les données du bitmap en interne.

    C'est d'ailleurs pour toutes ces choses que j'avais commencé à coder ma propre gestion des bitmaps.
    En plus, sous Linux, la méthode FloodFill est bugguée, on en avait parlé dans un post avec Naute.

    Faudrait que je mette mes sources à disposition. Certains d'entre vous pourraient continuer à améliorer le bouzin. Car j'avoue ne plus avoir trop de temps pour programmer, depuis un petit moment.

    Bon Week-end à tous en attendant
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 381
    Points : 11 918
    Points
    11 918

    Par défaut

    Citation Envoyé par BeanzMaster Voir le message
    --snip--
    Ça t'a rappelé des bons souvenirs, hein !

    Moi j'ai toujours les mains dans le cambouis, mais j'avoue que j'en ai un peu marre... Ma mémoire me joue des tours, des fois, et des choses dont on a longuement causé je les ai zappées, faut que je replonge dans mes notes.

    Allez, juste pour le fun (ça date d'hier soir), deux fichiers .bmp, en haut la preview de l'OpenPictureDialog et dessous ce que ça donne une fois le fichier ouvert avec TLazIntfImage (je croyais que ça devait être la solution à nos problèmes, mais que nenni1) et chargé dans un TImage, effectivement, il y a de quoi couler une bielle, là...

    Nom : étrange_avec_tlazintfimage.gif
Affichages : 53
Taille : 36,5 Ko

    ---
    1 : ai même trouvé un post d'un gars qui dit comme nous, obligé d'utiliser Init_R8G8B8 pour ouvrir un fichier 32 bits…
    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

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 381
    Points : 11 918
    Points
    11 918

    Par défaut

    Salut,


    je suis tombé là-dessus complètement par hasard (5e post, de Michalis [suivez son lien]), et ai estimé que je devais le partager, parce que quand on voit la qualité de la documentation, on tombe par terre !

    Ah, si j'avais une autre vie devant moi, je me plongerais volontiers là-dedans à corps perdu.
    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

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

Discussions similaires

  1. [XSL] Je galère avec un XSL...
    Par argyronet dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 18/05/2004, 12h02
  2. [CR] "Print Report" ne marche pas chez le client
    Par speed034 dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 04/05/2004, 10h00
  3. galère avec my2pg.pl
    Par fafet dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 16/07/2003, 10h10
  4. TdbPlanner de chez TMS Software
    Par Shabata dans le forum Composants VCL
    Réponses: 4
    Dernier message: 19/06/2003, 23h37

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