Toon posts:

[c++] TBitmap en palette probleem -> geen juiste weergave

Pagina: 1
Acties:

Verwijderd

Topicstarter
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:

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 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22-05 16:53
iig krijg je in dit stukje

code:
1
(d + l * 256)


een overflow want l is een char en d ook. ( Maar misschien is dat wel je bedoeling )

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
Ow ja dat klopt, ik zal het even aanpassen, want heb even de code uit het programma moeten slopen, moet een adresverwijzing zijn in het array met unsigned chars. Bedankt.