DIB i DDB (konwersja)

0

Problem polega na tym, że chcę wstawić tekst do istniejącej bitmapy. Jest ona reprezentowana przez BITMAPINFOHEADER (z paletą kolorów - 256-skala szarości) i bufor z danymi obrazka.
Najpierw konwertuję ją do DIB poprzez CreateDIBitmap, później:
hMemDC = CreateCompatibleDC(hDC)
otrzymuę więc kontekst pamięci, wstawiam do niego text za pomocą DrawText.
Teraz jest czas na konwersję DDB z powrotem do DIB. Robię to za pomocą GetDIBits.
I tu pojawia się problem. Funkcja ta zmienia mi paletę kolorów w "moim" BITMAPINFO i dopasowuje sobie do tej palety bity obrazu. Gdybym konwertował DDB do DIB za pomocą GetPixel, czyli z hMemDC brałbym pixel po pixelu to byłoby wszstko OK. Ale to przecież za wolno. Macie jakiś pomysł w związku z tym?

0

Dobrze by bylo gdybys zamiescil kod w ktory konwertuje z DDB na DIB (wywolanie funkcji) i
deklaracje parametrow (z wartosciami ktorymi zostaly zainicjowane) jak rowniez wywoalnie CreateDIBitmap.
A tak to moge tylko gdybac ;), wiec skoro paleta to 256 odcieni szarosci wiec
wrzucasz do GetDIBits(,,,,(LPVOID)wskTwojaBitmap, (LPBITMAPINFO)wskTwojBITMAPHEADER, DIB_RGB_COLORS)
i nie powinno byc problemow bo w tym wypadku nic nie moze zostac podmienione w HEADERZE a juz na pewno
nie pierwsze 6 jej elementow (w tym bitCount)!!!! wiec jak header jest wlasciwie zainicjowany i DDB zostalo dobrze stworzone
to nie powinno byc problemow ;)

0

"Niestety" mam wrażenie, że wszystko jest w porządku. Wygląda to tak:

hBmp = ::CreateDIBitmap(hDC, mojBH, CBM_INIT, mojeDane, (LPBITMAPINFO) mojBH, DIB_RGB_COLORS);
hMemDC = CreateCompatibleDC(hDC);
SelectObject(hMemDC, hBmp);

Wracam do DIB w ten sposob:

GetDIBits(hMemDC, hBmp, 0, mojBH->biHeight, mojeDane, (LPBITMAPINFO) mojBH, DIB_RGB_COLORS);

I po wywołaniu tef funkcji już nie jest w porządku. W mojBH na koncu mialem palete kolorow, 256 odcieni szarosci : 00 00 00 00 01 01 01 00 02 02 02 00 03 03 03 00 ..... itd. Po wywołaniu GetDIBits w to miejsce wskakuje (samoczynnie, nikt jej nie prosi) systemowa paleta kolorow (dziesiec pierwszych i dziesięć ostatnich kolorów systemowe) i co więcej: mojeDane nie są takie jak być powinny, tylko są w jakiś sposób dopasowane do tej nowej systemowej palety kolorów. Gdybym "powyciągał" mojeDane za pomocą GetPixel to byłyby zupełnie inne(prawidłowe). Mam nadzieję, że kumasz o co mi chodzi.

0

Tak kumam ;)
Tutaj masz text z MSDN-a :

If the requested format for the DIB matches its internal format, the RGB values for the bitmap are copied. If the requested format doesn't match the internal format, a color table is synthesized. The following table describes the color table synthesized for each format.

Value Meaning
1_BPP The color table consists of a black and a white entry.
4_BPP The color table consists of a mix of colors identical to the standard VGA palette.
8_BPP The color table consists of a general mix of 256 colors defined by GDI. (Included in these 256 colors are the 20 colors found in the default logical palette.)
24_BPP No color table is returned.

If the lpvBits parameter is a valid pointer, the first six members of the bitmap information header structure must be initialized to specify the size and format of the DIB.

ta linijka z 8_BPP to Twoj przypadek ;) - dlatego pojawilo Ci sie 20 nowych kolorow.
A wiec cos jest wyraznie nie tak ;).
Sadze ze powod lezy w wywolaniu CreateDIBitmap i dlatego dobrze byloby gdybys
zapodal jakimi wartosciami wypelniony jest mojBH (szczegolnie wartosc biBitCount, biCompression)
bo widze ze w palecie masz RGBQUAD-y i powyzsze wartosci sa wazne( jak wszystkie w mojBH !!!!).

PS. Najlepiej gdybys przeslal mi na [email protected] kod ktory jest odpowiedzialny
za tworzenie DIB i wszystkich niezbednych zmiennych) potem DDB i potem znow na DIB max okrojony ale tak zeby
byl ten blad (wkleje go do swego progsa i znacznie szybciej znajde blad :) ).

1 użytkowników online, w tym zalogowanych: 0, gości: 1