Bonjour,

Ça fait bien longtemps que je n'étais pas venu poster une question ici, plutôt habitué ces derniers temps au bistrot forum Lazarus , mais là, je retourne aux origines.
Contexte : D7perso tournant sur w2K sp4 (virtualisé dans une machine Linux mais ça, on s'en fiche).

Le problème : la compréhension de l'écriture des pixels d'un bitmap vs la même écriture dans le canvas d'une form.

Je suis parti du sympathique article dont Paul TOTH m'a récemment fourni le lien, j'ai vu la jolie image en bas de la page, et je me suis employé à refaire la même chose jusqu'à arriver au même résultat, ce qui ne fut pas trop compliqué grâce au copier/coller.
Ensuite, j'ai voulu refaire la même chose dans un TImage, en passant par un TBitmap intermédiaire, et c'est là que ça se complique.

Comme j'avais des soucis, pour essayer de les cerner j'ai commencé par changer la couleur mais une couleur uniforme dans un carré, pour voir les défauts, laisse tomber !, alors j'ai changé la taille du canvas et du carré je suis passé au rectangle :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
const
  IMAGE_WIDTH  = 256;
  IMAGE_HEIGHT = 128;//256;
et là, tout de suite, j'ai relevé que la note de Paul, sur sa page, en date du 29/05/2013, semble erronée ! Ben oui, Paul, regarde les images (note : les images présentées dans ce post sont toutes réduites de moitié) :
Nom : rouge_yx_xy.jpg
Affichages : 473
Taille : 6,5 Ko à gauche le mode yx conseillé , à droite le mode xy d'origine

En plus, en utilisant le mode d'origine (Pixels[x, y]), j'affiche bien l'image présentée en bas de la page web.
Car oui, en mettant [y, x], je ne retrouvais pas l'image et je me suis dit que Paul n'avait pas fait de nouvelle capture malgré la modif du 29/05.
Nom : paul_xy_yx.jpg
Affichages : 535
Taille : 19,2 Ko à gauche le mode xy d'origine , à droite le mode yx conseillé

Et ça n'est jamais bon de faire des suppositions sur ce qu'ont fait (ou pu faire) les autres : en informatique, àmha, il faut des certitudes, sinon on avance en plein brouillard...
Paul, message perso, il serait bon que tu clarifies ce point.


Ceci étant dit, le problème que je rencontre est résumé ainsi : écrire des pixels colorés sur le canvas de la form est simple et très joli, voir ci-dessus ; écrire ces mêmes pixels sur le canvas d'un TBitmap est (devrait être ?) aussi simple mais affiche des abominations :
Nom : bads.jpg
Affichages : 455
Taille : 8,7 Ko

J'ai tout essayé de ce que je connais : inverser x et y, inverser le sens de balayage (de for variable = 0 to valeur-1 do à for variable = valeur-1 downto 0 do), commencer le balayage d'abord avec la width ou d'abord avec la height, pf24bit ou pf32bit, plusieurs méthodes de recopie dans l'image d'affichage, dans tous les cas c'est la cata !
D'où ce post, dans l'espoir d'idées lumineuses...

Ah, le code (pour tester, une TImage à la taille des constantes données plus haut) sur une form et zou !) :
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
procedure TForm1.FormCreate(Sender: TObject);
var
  x, y: Integer;
  SrcBmp: TBitmap;
begin
  DoubleBuffered := True; // rajouté par moi
{  // 3 lignes direct du site sans changer une virgule
  for x := 0 to IMAGE_WIDTH - 1 do
    for y := 0 to IMAGE_HEIGHT - 1 do
      pixels[y, x] := (x + y) or ((x - y) shl 8 ) or ((x + x) shl 16);
}
  SrcBmp := TBitmap.Create;
  with SrcBmp do begin
    SrcBmp.PixelFormat:=pf32bit;
    //SrcBmp.PixelFormat:=pf24bit;
    SrcBmp.Width := IMAGE_WIDTH;
    SrcBmp.Height := IMAGE_HEIGHT;
  end;
  with SrcBmp.Canvas do
    for x := 0 to IMAGE_WIDTH-1 do
//    for x := IMAGE_WIDTH-1 downto 0 do
//      for y := IMAGE_HEIGHT-1 downto 0 do
      for y := 0 to IMAGE_HEIGHT-1 do
//        Pixels[x, y] := clRed; // ça c'est bon ! Ah mais quand même...
//        Pixels[x, y] := (x + y) or ((x - y) shl 8 ) or ((x + x) shl 16);
        Pixels[x, y] := (x + y) or ((x - y) shl 8 ) or ((x + x) shl 16) or $FF000000;

// essais d'affichage, tous identiques
//  image1.Canvas.Draw(0, 0, SrcBmp);
//  image1.Picture.Assign(SrcBmp);
  image1.Picture.Graphic := SrcBmp;
end;
Je ne mets pas celui du FormPaint, c'est celui de Paul, juste que je lui rajoute un Exit; au début, quand j'active le couple bitmap et image.
Ce FormPaint inclut en bas qq lignes pour écrire sur la form, chose qui ne m'intéresse pas pour l'instant.

Quelqu'un va pouvoir m'expliquer pourquoi je ne peux pas manipuler simplement les pixels d'un bitmap ?

Mille mercis par avance...