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 :

Problème d'affectation de bitmap (:=) et compatibilité Delphi


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 135
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 135
    Par défaut Problème d'affectation de bitmap (:=) et compatibilité Delphi
    Bonsoir,

    Et oui, encore moi, encore avec un problème tordu !

    Tout récemment je découvre sur le forum Delphi quelque chose que je ne connaissais pas, que j'ai voulu tester, et mal m'en a pris, qu'on en juge.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var
      image: TBitmap;
    begin
      image := TBitmap.Create;
      ImageList1.GetBitmap(0, image);
      Shape1.Brush.Bitmap := image;
    end;
    source

    C'est la dernière ligne qui m'a titillé les neurones : on peut assigner un TBitmap au Bitmap d'un TShape ? Ah ah !

    Et je suis parti d'un TImage et d'un TShape posés sur une fiche, et d'un fichier 128x96x72dpi,
    aec_128x96x72.bmp.txt
    (Ceux qui veulent tester récupèrent ce .txt et enlèvent cette extension [rajoutée pour tromper le filtre du forum], ils récupéreront le .bmp)
    que j'ai chargé dans le TImage (image1.Picture.Bitmap.LoadFromFile(OpenDialog1.FileName); --> image parfaite) puis
    shape1.Brush.Bitmap := image1.Picture.Bitmap; et là, catastrophe !
    Nom : 128x96.png
Affichages : 385
Taille : 7,7 Ko

    à gauche le rendu du TImage, à droite le rendu du TShape, la barre noire est expliquée dessous.

    Regardez l'image, très agrandie pour montrer les défauts :
    Nom : défauts.png
Affichages : 429
Taille : 10,1 Ko

    à gauche le bord droit du fichier dans le TImage pour bien montrer que le TShape perd un pixel en hauteur, en bas à droite la partie inférieure du même fichier et le TShape perd un pixel en largeur.
    Et je ne parle pas du rendu des couleurs, bien en vrac dans le TShape.

    Et on est bien d'accord que cette fois, il y a zéro code de mon fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    image1.Picture.Bitmap.LoadFromFile(OpenDialog1.FileName);
    shape1.Brush.Bitmap := image1.Picture.Bitmap;
    Elle est où, la blague, là ?
    Sur quoi puis-je intervenir ?

    Ah, un dernier mot :
    à gauche Debian8 Laz 1.6.2, à droite XP SP2 Laz 1.6.0, le défaut n'est plus le même qu'avec Laz 1.4 (les couleurs ne sont pas en vrac de la même manière), mais bon, il y a bien un défaut...
    Nom : debian_XP.png
Affichages : 409
Taille : 20,4 Ko

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 934
    Billets dans le blog
    6
    Par défaut
    Bonjour JP,

    Il est probablement plus question d'assigner le BitMap que de l'affecter, dans ce cas. Question de propriétés à adapter, sans doutes, dont probablement les fameuses questions de couleurs sur 3 ou 4 octets, dans l'ordre BGR ou RGB, etc.
    Que donne un Shape1.Brush.Bitmap.Assign(image) ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 135
    Par défaut
    Bonsoir, Yves
    Citation Envoyé par tourlourou Voir le message
    Que donne un Shape1.Brush.Bitmap.Assign(image1) ?
    cannot assign a TImage to a TBitmap, et Shape1.Brush.Bitmap.Assign(image1.Picture.Bitmap); me donne Access Violation.

    EDIT :
    Mais ce bitmap du Shape1.Brush me semble bizarre : que je tente Shape1.Brush.Bitmap.PixelFormat := pf24bit; ou Shape1.Brush.Bitmap.SetSize(image1.Width,image1.Height); dans les 2 cas c'est Access Violation sur la ligne concernée.

    Même un simple showmessage(inttostr(shape1.Brush.Bitmap.Width) +' '+ inttostr(shape1.Brush.Bitmap.Height)); se termine en Access Violation...

    Ça ne doit pas être aussi simple que la ligne en Delphi le laissait supposer...

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 937
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 937
    Par défaut
    Pour éviter la bordure, il faut sans doute mettre la largeur du Pen à zéro.

    Concernant le remplissage, et bien le résultat est... correct
    Ce qu'il faut savoir est que le point d'origine de la brosse est le coin supérieur gauche de la zone cliente de la fiche et non celui du TShape. En déplaçant la forme, tu constateras un remplissage différent.

    Pour illustrer, à gauche la forme seule et à droite en appliquant la même brosse au Paint de la fiche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm7.FormCreate(Sender: TObject);
    begin
      Bitmap := TBitmap.Create;
      Bitmap.LoadFromFile('D:\aec_128x96x72.bmp');
     
      Shape1.Brush.Bitmap := Bitmap;
    end;
     
    procedure TForm7.FormPaint(Sender: TObject);
    begin
      Canvas.Brush.Bitmap := Bitmap;
      Canvas.FillRect(ClientRect);
    end;
    Nom : Png1.png
Affichages : 381
Taille : 10,7 Ko

    Et en déplaçant la forme, toujours la même origine, le remplissage semble décalé :

    Nom : Png2.png
Affichages : 366
Taille : 10,7 Ko

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 135
    Par défaut
    Salutations, gentlemen,
    Citation Envoyé par gvasseur58 Voir le message
    Surtout, quelle étrange idée que de vouloir manipuler le Bitmap d'un composant qui sert à dessiner des formes .
    C'est pas moi, m'sieur, c'est l'autre ! (comme expliqué hier, et j'ai cité ma source dénoncé le coupable )

    Citation Envoyé par Andnotor Voir le message
    Pour éviter la bordure, il faut sans doute mettre la largeur du Pen à zéro.
    Refusé par Lazarus, qui me repasse la propriété à 1. Ce que j'avais fait, c'est Style à psClear.

    Citation Envoyé par Andnotor Voir le message
    Ce qu'il faut savoir est que le point d'origine de la brosse est le coin supérieur gauche de la zone cliente de la fiche et non celui du TShape. En déplaçant la forme, tu constateras un remplissage différent.
    Bah non, d'ailleurs tu te contredis : si c'est lié à la zone cliente, n'importe où que soit la fiche, son origine sera toujours 0,0 par rapport à la fiche.
    La preuve : en diagonale 3 positions différentes de la MainForm, et on voit bien que le TShape à droite est toujours rempli de la même manière.
    Nom : positions_différentes.png
Affichages : 428
Taille : 55,1 Ko

    Alors j'ai changé mon fusil d'épaule et j'ai positionné le TShape en 0,0, justement (image dans l'angle en bas à gauche) et le TImage en bas à droite, et effectivement le rendu semble correct (je ne me suis pas penché sur la perte d'un pixel en hauteur et en largeur, pas le temps, là...)

    Bon, Gilles a tout dit, il vaut mieux laisser tomber, bizarre que le post en Delphi n'ait pas soulevé plus de débats...

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 937
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 937
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Bah non, d'ailleurs tu te contredis : si c'est lié à la zone cliente, n'importe où que soit la fiche, son origine sera toujours 0,0 par rapport à la fiche.
    Pour une fois que je parlais français (forme = shape, fiche = form)

  7. #7
    Rédacteur

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Billets dans le blog
    84
    Par défaut
    Bonjour Jipété,

    Ah là là, dans quelle galère tu es allé te fourrer ...

    Déjà, avec Delphi, on obtient aussi quelque chose de très vilain (pour l'excellente raison donnée par Andnotor) :

    Nom : 2017-03-28_104446.png
Affichages : 444
Taille : 34,3 Ko

    [Delphi 10.2 - à gauche TImage, à droite TShape]

    Ensuite, lors de la création de TShape, la brosse Brush est fixée à nil. Autant dire que tenter d'accéder au bitmap associé conduit à des erreurs . Une ligne comme celle-ci suffit pour déclencher une erreur à l'exécution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    W := shape1.Brush.Bitmap.Width;
    Surtout, quelle étrange idée que de vouloir manipuler le Bitmap d'un composant qui sert à dessiner des formes . C'est tout ce qu'on lui demande et il le fait très bien, non ? Demande-t-on à un réfrigérateur de servir de chauffage ? Il chauffe, oui, mais c'est pour produire du froid, et il remplit bien cette tâche en temps normal... Vouloir faire dessiner directement à TShape des surfaces peintes selon un modèle de bitmap , sans dériver un composant enfant ou sans partir de TControlGraphic, est une idée que j'oublierais vite, mais bon, c'est un point de vue sans doute personnel...
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

Discussions similaires

  1. Problème de compatibilité Delphi 7.0
    Par MissHey dans le forum Débuter
    Réponses: 8
    Dernier message: 25/04/2015, 23h08
  2. Réponses: 1
    Dernier message: 28/08/2013, 16h06
  3. Entier 64 bits sous linux, problème d'affectation
    Par Steki-kun dans le forum Linux
    Réponses: 2
    Dernier message: 13/01/2005, 21h10
  4. [D2005][FK 2.0] Compatibilité Delphi et ce Framework
    Par Mjm dans le forum Delphi .NET
    Réponses: 3
    Dernier message: 30/11/2004, 14h05
  5. [Fichiers séquentiels] compatibilité Delphi <-> C++
    Par soccersoft dans le forum Langage
    Réponses: 2
    Dernier message: 08/07/2004, 10h56

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