Skocz do zawartości

Recommended Posts

Napisano

Jak po wczytaniu bitmapy dorwać się do pixeli w celu wyciągniecia z nich kolorów RGB.

Chodzi mi głównie o bitmapy 24bitowe.

Mile widziany jakiś kod lub funkcyjki ;)

Napisano

Sprubój:

COLORREF GetPixel(HDC hdc, int XPos, int nYPos);
COLORREF SetPixel(HDC hdc, int XPos, int nYPos);
int GetPixelFormat(HDC  hdc);
BOOL SetPixelFormat(HDC  hdc,int  iPixelFormat,CONST PIXELFORMATDESCRIPTOR *  ppfd);

Te dwie ostatnie to do czegos innego, ale... Dwie pierwsze dobra, ale wolne. Sama bitmapa ma taka strukture:

typedef struct tagBITMAP {  // bm 
   LONG   bmType; 
   LONG   bmWidth; 
   LONG   bmHeight; 
   LONG   bmWidthBytes; 
   WORD   bmPlanes; 
   WORD   bmBitsPixel; 
   LPVOID bmBits;            /* Points to the location of the bit values for the bitmap. The bmBits member must be a long pointer to an array of character (1-byte) values.  */
} BITMAP;

wiec możesz spróbować ręcznie się do bitów dobrać.

Napisano

A i jeszcze zapomniałem do wyciągania samych kolorków:

BYTE GetRValue(DWORD rgb);
BYTE GetGValue(DWORD rgb);
BYTE GetBValue(DWORD rgb);

Ale nie problemem było by chyba ręczne rozszyfrowanie COLORREF. Swoją drogą pochwalę się udoskonalonym makrem RGB. Mianowicie, prosze państwa RGBA(r,g,b,a); :

#define RGBA(r, g ,b, a)  ( (DWORD) ( ((BYTE) (r)) | ((WORD) (g) << 8) ) | (DWORD) ( ((DWORD) (b) << 16) | ((DWORD) (a) << 24) ) )

Na co to? W NT'kach, a właściwie od 2k w góre znaczenie ma wartość 'a'. Przy odwracaniu koloru i nie tylko:

~RGB(rr,gg,bb) = ~(0x00rrggbb) 

daje to kolor zawsze czarny. A

~RGBA(rr,gg,bb,0xFF) = ~(0xFFrrggbb)

co daje kolor właściwy. Może się to także przydać do cieniowania w tych systemach, ale nie sprawdzałem. Dobra kończe, bo przynudzam.

Napisano

Dzikei za odpowiedz - dostalem nawet za duzo bo wiekszosc funkcji co pdoales to znam no ale moze komus sie przyda.
A zadalem to pytanie bo kurde eni wiedzxialem jak wyciagnac dane z tego bmp.bmBits. No i teraz przypadkiem doszlem do tego ze ten daleki wskaźnik wskazuje na NULL więc mam mały problem. Wie ktoś co z tym zrobic??

ps
makro RGBA sie przyda ;)

Napisano

Pewnie powiecie że się mądrze.... ;) Ale powiem wam pewną ciekawostkę 9_9 :

To na co mówicie bitmapy to błędna nazwa (ale się przyjęła), pochodząca z czasów Win 3.x, kiedy to każdy pixel był czarno-biały i kodowało go się za pomocą jednego bitu. Więc teraz powinno się na to mówić pixmapy (albo coś w tym stylu).

Taki off-topic

A teraz na temat:
ten kolor a to nie jest przypadkiem alpha (przezroczystość)?

Napisano

Yes, we have a winner. Tyle, ze napisalem to makro na potrzeby programu dzialajacego w 9x i NT, wiec uzywam tylko wartosci przydatnych przy odwracaniu koloru (0x00, 0xFF). Pod Win9x ta czesc koloru w gdi jest olewana i moze byc dowolna.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...