Bonjour,
Ça fait bien longtemps que je n'étais pas venu poster une question ici, plutôt habitué ces derniers temps aubistrotforum 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 :
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é) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 const IMAGE_WIDTH = 256; IMAGE_HEIGHT = 128;//256;
à 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.
à 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 :
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 !) :
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.
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;
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...
Partager