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 :

Comportement du TImage.Picture.Bitmap différent selon son mode de chargement [Lazarus]


Sujet :

Lazarus Pascal

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut Comportement du TImage.Picture.Bitmap différent selon son mode de chargement
    Bonjour,

    tout est dans le titre, voici cependant quelques précisions :

    Soit un TImage posé sur un TPanel lui-même posé sur une fiche.

    Soit la propriété Picture de ce TImage remplie grâce à l'inspecteur d'objets (Picture... Charger, et choisir un fichier, tout le monde connaît).

    Soit donc au runtime l'image affichée correctement et sur laquelle je vais effectuer des calculs (sur les pixels, très exactement), en cliquant sur un bouton dont la proc OnClick contient le code des calculs et tout se passe bien (j'utilise Scanline et donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for h := 0 to Height4Moyenne-1 do begin
        p := pRGBTriple(bmptmp.RawImage.GetLineStart(h));
        for w := 0 to Width4Moyenne-1 do begin
          Rtot := Rtot + p[w].rgbtRed;
          Gtot := Gtot + p[w].rgbtGreen;
          Btot := Btot + p[w].rgbtBlue;
        end;
      end;
    bmptmp a été préalablement rempli avec bmptmp.Assign(Image1.Picture.Bitmap);)
    Tout est parfait.

    Soit maintenant un système de copie d'une partie de l'écran, sélectionnée à la souris (une sorte de ScreenShot, quoi), qui va générer un TBitmap qui va être assigné au TImage, très exactement avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      Result:= StretchBlt(dst.Canvas.Handle, 0, 0, dst.Width, dst.Height,
                          src.Canvas.Handle, 0, 0, src.Width, src.Height,
                          SRCCOPY);
    dst correspond à Image1.Picture.Bitmap et effectivement, le TImage dans son TPanel m'affiche bien la zone que j'ai sélectionnée.

    Je clique alors sur le bouton des calculs et là, patatras, tous les pixels remontés ont une valeur à 0

    Une idée pour corriger cette engeance ?
    Inutile de vous préciser que j'ai passé un temps dément sur http://wiki.freepascal.org/Developing_with_Graphics/fr sans aucune étincelle lumineuse...

    Un tout dernier mot : au début de la proc de calcul je récupère Image1.Picture.Bitmap.Width et .Height qui sont parfaitement valides (sinon je ne serais pas là à pleurer... ).
    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
    Membre chevronné

    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
    Points : 1 884
    Points
    1 884
    Par défaut
    Salut JP.

    Test fait sous Windows :
    StretchBlt avec 2 TBitmap 24 bits (dst et src).
    Envoi de dst à ta procédure de calcul : résultat : 0 0 0
    Pourtant l'affichage de dst est correct.

    Si j'assigne dst à un TImage vierge : image1.picture.bitmap.assign(dst) --> l'image s'affiche bien mais le calcul ne marche pas.

    Si je copie sur le canvas du TImage, c'est OK.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    image1.canvas.draw(0,0,dst);
    calcul(image1.picture.bitmap);
    Si je me rappelle bien, je n'avais aucun problème de ce genre sous Delphi.

    Remarque : ta procédure de calcul exige un bitmap en 24bits (utilisation de pRGBTriple).

    Amicalement
    Thierry

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    Bonsoir Thierry,

    Grand merci pour ta réponse.
    Citation Envoyé par ThWilliam Voir le message
    Si je copie sur le canvas du TImage, c'est OK.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    image1.canvas.draw(0,0,dst);
    calcul(image1.picture.bitmap);
    Je pensais bien à un truc tordu comme ça, mais je ne voyais pas trop comment le mettre en œuvre puisque dans un cas (TImage chargé depuis l'EDI) ça fonctionne : comment dépanner un truc qui fonctionne ?

    Enfin, je m'en suis à moitié sorti en rajoutant un Image1.Canvas.Draw(0,0,Bmp4Selection); après l'appel au StretchBlt, c'est mieux mais c'est pas encore ça :
    à gauche l'image chargée dans l'EDI, la moyenne est OK, au milieu capture du fond d'écran Linux et à droite capture d'un bout d'une form verte :
    Nom : 3tests.png
Affichages : 254
Taille : 8,4 Ko

    Citation Envoyé par ThWilliam Voir le message
    Remarque : ta procédure de calcul exige un bitmap en 24bits (utilisation de pRGBTriple).
    Et si je passe à l'utilisation du pRGBQuad je ne mets pas de copie d'écran car c'est juste l'inverse de la précédente : la moyenne depuis le fichier chargé est en vrac, les moyennes depuis copies d'écran sont OK.

    Ça pue le problème 24/32 bits, étant entendu que rien n'est configurable dans l'EDI au niveau du TImage. Donc je dois travailler en pf24bit puisque c'est bon comme ça depuis l'EDI.
    Maintenant, pourquoi ça se fout en vrac avec les copies d'écran alors que tous mes bitmaps sont en 24 bits, c'est la bonne question.
    Pas encore eu le temps de poster ça, mais j'ai découvert il y a un ou deux mois que sans rien faire de particulier (une simple recopie), le PixelFormat changeait tout seul de 32 à 24 bits, alors bon...
    Là je l'ai vérifié et je suis toujours et partout à pf24bit.

    Citation Envoyé par ThWilliam Voir le message
    Si je me rappelle bien, je n'avais aucun problème de ce genre sous Delphi.
    Ben oui mais là on est sous Lazarus, donc c'est l'enfer, et le TImage c'est l'enfer de Lazarus...

    Et encore, je n'ai pas encore testé sous Windows...

    Je ne sais plus quoi faire pour avancer, et bonjour le temps perdu...

    EDIT : dernier test fait à l'instant, et qui résume bien le problème -- lisez les commentaires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      with bmptmp do begin
        PixelFormat := pf24bit;
        SetSize(Width4Moyenne, Height4Moyenne);
        //Assign(Image1.Picture.Graphic);  // ok avec image chargée dans l'edi
        // dessus ou dessous c'est pareil
        //Assign(Image1.Picture.Bitmap);   // ok avec image chargée dans l'edi
        Canvas.Draw(0,0,Image1.Picture.Bitmap); // cata avec image chargée dans l'edi
      end;
      // suite vers récup des valeurs des pixels et calculs
    Et quand c'est la cata avec l'image de l'edi c'est OK avec les copies d'écran, et inversement
    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
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    Bonjour à tous,

    Citation Envoyé par Jipété Voir le message
    Et quand c'est la cata avec l'image de l'edi c'est OK avec les copies d'écran, et inversement
    Me suis sorti de cet enfer !

    La nuit porte conseil, dit-on, en l'espèce c'est plutôt les infobulles de complétion de code

    Après la création du TBitmap temporaire dans la proc de calcul (dont on pourrait se passer si les choses étaient bien faites...), j'ai simplement rajouté ça, après avoir bien vérifié que je suis partout en pf24bit et que c'est bien le pRGBTriple que je vais utiliser pour le balayage du bitmap avec Scanline :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // au-dessus, création des trucs et des machins divers (et d'été, :mouarf:)
      Image1.Picture.Graphic.SaveToStream(TS); // source des images à moyenner
      TS.Position := 0;
      bmp4calculs.LoadFromStream(TS, TS.Size);
    // ci-dessous les calculs
    Et valà

    Bonne journée,
    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. [Lazarus] [Linux] TImage.Picture.Bitmap vide en mode pf32bit
    Par Jipété dans le forum Lazarus
    Réponses: 12
    Dernier message: 31/05/2016, 09h17
  2. Réponses: 7
    Dernier message: 15/02/2010, 22h52
  3. Comportement différent selon le lanceur
    Par michelcky dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 03/10/2008, 20h03
  4. [RegEx] Résultat différent selon le mode d'exécution de PHP
    Par mgauffeny dans le forum Langage
    Réponses: 2
    Dernier message: 30/07/2008, 16h41
  5. Comportement différent selon Mode Execution
    Par MarronSuisse dans le forum C
    Réponses: 7
    Dernier message: 14/04/2008, 13h52

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