Wczytywanie bitmapy z zasobów.

0

Witam,
dodałem bitmapę do projektu w środowisku visual studio poprzez kreator zasobów. Pobieram uchwyt do niej za pomocą funkcji LoadBitmap, a następnie pobieram zawartość za pomocą funkcji GetObject do struktury BITMAP. Do tego momentu wszystko jest ok, ponieważ struktura jaką uzyskałem, ma prawidłowe wartości w bmWidth i w bmHeigth. Jednak gdy próbuję odczytać zawartość tej bitmapy to dostaję błąd, że pole bmBits ma wartość NULL. W takim razie w jaki sposób mogę odczytać zawartość kolejnych pikseli bitmapy w zasobach programu, tak żebym mógł ją wczytać w openglu?
Z góry dziękuje.

0

pokaż kod.

PS. BITMAP w zasobach oznacza że obrazek jest nieskompresowany (w formacie .bmp) co szybko powoduje, że rozmiar exeka będzie bardzo duży.

Kiedyś to zrobiłem trzymając obrazek PNG albo JPEG jako dane binarne (za jakimś wymyślonym PICTURE zamiast BITMAP) i ładowałem bitmapę przez CreateDecoderFromStream. Potem to szło właśnie do OpenGL-a.

0

Jeśli chcesz w ten sposób zabezpieczyć się przed edycją, czy podmianą twoich obrazków to musisz wiedzieć, że zmieniłbym tą bitmapę na inną w 5min. Lepiej stwórz własny format plików z paczką ;)

0

Tak mniej więcej wygląda kod:

	HBITMAP hbitmap = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1));
	if (hbitmap == NULL)
	{
		MessageBoxA(0, "#1", 0, 0);
		return 1;
	}
	BITMAP bitmap;
	GetObject(hbitmap, sizeof(bitmap), &bitmap);

	if (!(bitmap.bmHeight || bitmap.bmHeight))
	{
		MessageBoxA(0, "#2", 0, 0);
		return 1;
	}
	if (bitmap.bmBits == NULL)
	{
		MessageBoxA(0, "#3", 0, 0);
		return 1;
	}

@Ola Nordmann
Tu chodzi bardziej o wygodę. To ma być mały program i nie chciałbym żeby razem z nim plątały się jakieś dodatkowe pliki.

0
MSDN - GetObject function napisał(a)

If hgdiobj is a handle to a bitmap created by calling CreateDIBSection [...].
If hgdiobj is a handle to a bitmap created by any other means, GetObject returns only the width, height, and color format information of the bitmap. You can obtain the bitmap's bit values by calling the GetDIBits or GetBitmapBits function.

http://msdn.microsoft.com/en-us/library/windows/desktop/dd144904(v=vs.85).aspx

0

Dzięki,
teraz kod wygląda mnie więcej tak:

	HBITMAP hbmp = LoadBitmap(hInstance, name);
	BITMAP bmp;
	GetObject(hbmp, sizeof(bmp), &bmp);
	bmp.bmBits = new char[bmp.bmHeight*bmp.bmWidth*3];
	GetBitmapBits(hbmp, bmp.bmHeight*bmp.bmHeight*3, bmp.bmBits);

i chciałbym się dowiedzieć czy to ma prawo działać, bo tekstura się jakoś dziwnie wyświetla. Być może gdzieś w innej części kodu popełniłem błąd, dlatego chcę się upewnić.

0

bo tekstura się jakoś dziwnie wyświetla
A to już wszystko zależy od tego, jakie parametry tekstury OpenGL-owi podałeś: ile bitów na piksel przede wszystkim, i kolejność kolorów (RGB vs BGR)
Poza tym OpenGL spodziewa się że bitmapa jest do góry nogami (odbitej w osi poziomej), czyli liniami od dołu do góry. Nie wiem jak to jest z BITMAPami pod WinAPI.

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