Bonjour,

Oui, c'est encore moi avec mes misères de TImage, TBitmap, PixelFormat et tout ce foutoir immonde...

Tout est dans le titre, et les détails suivent, mais tout d'abord je tiens à préciser que j'ai longtemps, très longtemps résisté (comprendre : retourné le web dans tous les sens sans rien trouver de concluant) avant de venir pleurer ici, mais là, au bout de 3 jours de vaines recherches, je n'en peux plus ...

Alors, pour résumer, sous Linux, si j'utilise aBitmap.PixelFormat := pf32bit; le TImage propriétaire de ce aBimap est vide alors qu'en enregistrant avec aBitmap.SaveToFile('test32.bmp'); ce aBitmap, le fichier, lui, est tout bon :
Nom : test_Fossie.png
Affichages : 394
Taille : 431 octets en beige la fiche, en noir l'image 80x80, en jaune et bleu un dessin.

Voilà le bout de code, normalement avec une TImage (image4) et un bouton sur une fiche ça devrait le faire :
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
procedure TForm1.btnTestFromFossieClick(Sender: TObject);
// examples/canvas_test
  function BytesPerPixel(APixelFormat: TPixelFormat): integer;
  begin
    Result := -1;
    case APixelFormat of pf8bit:result:=1;pf16bit:result:=2;pf24bit:result:=3;pf32bit:result:=4;end;
  end;
  procedure WorkWithCanvas(aBitmap: TBitmap);
  begin
    aBitmap.PixelFormat := pf24bit; // 24 ok, 32 vide
    aBitmap.Width  := 80;
    aBitmap.Height := 80;
    Image4.Width:=80; Image4.Height:=80; // ici ou en fin de proc = pareil, sert à rien...
    aBitmap.Canvas.Brush.Color := clBlue;
    aBitmap.Canvas.Pen.Color := clYellow;
    aBitmap.Canvas.Pen.Width := 5;
    aBitmap.Canvas.Rectangle(20, 20, 60, 60);
//    Caption:=IntToStr(BytesPerPixel(Image4.Picture.Bitmap.PixelFormat));//ok 4 si 32
//    aBitmap.SaveToFile('test32.bmp'); // OK OK OK !
  end;
begin
  Image4.Picture.Bitmap.PixelFormat := pf32bit; // forcé mais sert à rien
  Caption:=IntToStr(BytesPerPixel(Image4.Picture.Bitmap.PixelFormat));//3 par défaut
  WorkWithCanvas(Image4.Picture.Bitmap);
end;
C'est inspiré des exemples fournis avec la distrib, où j'avais déjà noté en son temps, que ça ne fonctionnait pas en pf32bit sous Linux (à croire que les exemples ne sont qu'à moitié testés ).

Un dernier mot à propos de cette construction où le bouton appelle une proc qui va bidouiller le Bitmap de l'image : c'est parce que dans un autre projet c'est la même construction sauf que le Bitmap y est bidouillé à grands coups de pointeurs et autre Scanline, et ça y fonctionne !, mais la chose n'est pas reproductible avec cet exemple simple (sinon je ne serais pas là).
Vous allez me dire, mais pourquoi faire simple quand on peut faire compliqué, c'est ça ? Je n'ai pas la réponse, mais j'ai une question simple : quelle instruction manque-t-il à ce code pour que je puisse enfin voir mon joli dessin dans cette TImage en mode 32 bits ?

Mon autre problème, aussi, c'est que j'en ai franchement marre de passer des jours et des jours sur les forums, à lire des solutions dont on dirait, d'après la discussion, que ça va fonctionner mais non, pas chez moi...
Et il y a aussi les discussions où ça part bien, avec des solutions auxquelles l'OP répond que chez lui ça ne va pas, et plus de réponse de la part des helpers : un brave mystère, ça, que de laisser ainsi les gens le bec dans l'eau...
Le nombre de discussions que j'ai pu voir comme ça, non finies, sur forum.lazarus.freepascal.org, c'est impressionnant !
Et totalement décourageant...