Ik ben met een applciatie bezig die een array van unsigned char waarden (0...255) moet omzetten naar een TBitmap met alleen grijswaarden (tussen wit en zwart). Om de conversie naar een TColor te doen had ik de volgende code:
echter deze voert 256*256*4 vermenigvuldigingen per seconde uit, en is dus niet efficiënt. Nu wil ik dit oplossen met een palette op de volgende manier:
Echter ik krijg nu weliswaar een grijs beeld, maar met alleen maar middenwaarden (dus van donkergrijs tot lichtzwart als je begrijpt wat ik bedoel), maar moet eigenlijk volgens het voorbeeld (dat ik iets ingekort heb) van zwart naar wit overlopen.
Iemand een idee wat ik fout doe?
C++:
1
| bitmap->Canvas->Pixels[d][l] = (TColor) (0x00000000 + 65793 * hetArray[d + l *256]) |
echter deze voert 256*256*4 vermenigvuldigingen per seconde uit, en is dus niet efficiënt. Nu wil ik dit oplossen met een palette op de volgende manier:
C++:
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
| /* create a bitmap */ Graphics :: TBitmap* bitmap = new Graphics :: TBitmap(); /* set it's properties */ bitmap->Width = 256; bitmap->Height = 256; bitmap->PixelFormat = pf8bit; /* create default grayscale palette */ LOGPALETTE* mpPalette; unsigned PaletteSize = sizeof(TLogPalette) + (sizeof(TPaletteEntry) * 256); mpPalette = (PLogPalette) malloc(PaletteSize); mpPalette->palVersion = 0x300; mpPalette->palNumEntries = 256; // Set the colors to their Gray indexes for (int i = 0 ; i < mpPalette->palNumEntries; i++) { mpPalette->palPalEntry[i].peRed = i; mpPalette->palPalEntry[i].peGreen = i; mpPalette->palPalEntry[i].peBlue = i; mpPalette->palPalEntry[i].peFlags = 0; //PC_NOCOLLAPSE; } HPALETTE hpal = CreatePalette(mpPalette); bitmap->Palette = hpal; /* fill bitmap with data */ bitmap->Canvas->Lock(); for (unsigned char d = 0; d < 256; d++) { for (unsigned char l = 0; l < 256; l++) { bitmap->Canvas->Pixels[d][l] = (TColor) hetArray[d + l *256]; } // for } // for bitmap->Canvas->Unlock(); |
Echter ik krijg nu weliswaar een grijs beeld, maar met alleen maar middenwaarden (dus van donkergrijs tot lichtzwart als je begrijpt wat ik bedoel), maar moet eigenlijk volgens het voorbeeld (dat ik iets ingekort heb) van zwart naar wit overlopen.
Iemand een idee wat ik fout doe?
[ Voor 12% gewijzigd door Verwijderd op 29-09-2004 16:05 . Reden: Foutje van mijn kant ]