Bonjour,
J'ai un bitmap dont le format des pixels est pf8bit. Je souhaite, pour comprendre l'utilisation des palettes, savoir accéder à n'importe quel pixel et obtenir sa couleur (sans utiliser TCanvas).
Suite à de brêves recherches qui m'ont amené à trouver tout ce qui m'était nécessaire sur le site d'efg2 notamment, ou dans les sources que Nono40 met à diposition, j'ai rapidement et facilement codé la copie pixel par pixel avec scanline d'un bitmap pf8bit à un autre bitmap pf24bit.
Malheureusement, j'ai remarqué que lorsque la couleur dans le bitmap d'origine est le blanc, je ne récupère non pas du blanc, mais une couleur fausse (généralement du noir, ou du olive, du rouge, du bleu).
Ayant soupçonné une spécificité des palettes qui m'échappait, j'ai empiriquement trouvé que lorsque je devais rechercher la couleur de la palette à l'indice 255, je devais renvoyer en dur "blanc" (255, 255, 255), et non pas la valeur de la palette à cet indice. J'ai conclu qu'il en était de même pour le noir (indice 0).
Mais je ne comprends pas pourquoi, et je me demande si ces deux spécificités sont réellement génériquement valables. Avez-vous svp une explication ?
[XP Pro, D6 Ent, Affichage windows en 32 bits]
Mon code :
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 procedure TForm1.Button1Click(Sender: TObject); var vX, vY: Integer; vSrc: PByteArray; vDest: PRGBTripleArray; vPalette: TMaxLogPalette; begin Image1.Picture.Bitmap.PixelFormat := pf8bit; with Image2.Picture.Bitmap do begin PixelFormat := pf24bit; Width := Image1.Picture.Bitmap.Width; Height := Image1.Picture.Bitmap.Height; end; with vPalette do palNumEntries := GetPaletteEntries(Image1.Picture.Bitmap.Palette, 0, 255, palPalEntry); for vY := 0 to Image1.Picture.Bitmap.Height-1 do begin vSrc := Image1.Picture.Bitmap.ScanLine[vY]; vDest := Image2.Picture.Bitmap.ScanLine[vY]; for vX := 0 to Image1.Picture.Bitmap.Width-1 do if vSrc^[vX] = 0 then begin vDest^[vX].rgbtRed := 0; vDest^[vX].rgbtGreen := 0; vDest^[vX].rgbtBlue := 0; end else if vSrc^[vX] = 255 then begin vDest^[vX].rgbtRed := 255; vDest^[vX].rgbtGreen := 255; vDest^[vX].rgbtBlue := 255; end else with vPalette.palPalEntry[vSrc^[vX]] do begin vDest^[vX].rgbtRed := peRed; vDest^[vX].rgbtGreen := peGreen; vDest^[vX].rgbtBlue := peBlue; end; end; end;
Partager