PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bitmap Laden


Lord Nikon
2003-10-12, 12:45:30
Hi ,
mit

char *name="\\Test.bmp";

if (FileExists(name)) // Borland spezifisch zu
{ // Überprüfen ob die Datei existiert
ShowMessage("Test bestanden");
}
HBITMAP hBmp;
hBmp=LoadBitmap
(NULL,
name);

versuche ich ein Bitmap zu laden. Die Funktion gibt immer NULL zurück. Woran kann das liegen? Die Datei müsste er eigentlich gefunden haben , da die Methode FileExists immer die Datei findet und true zurückgibt. Wenn ich statt NULL der Funktion LoadBitmap den Handle der Anwendung übergebe , gibt es immer eine Zugriffsverletzung.

Xmas
2003-10-12, 18:20:30
Die WinAPI-Funktion LoadBitmap ist nicht dazu da BMP-Dateien zu laden, sondern nur für in die ausführbare Datei eingebettete Ressourcen. Stattdessen musst du LoadImage nehmen:
LoadImage(NULL, name, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

Lord Nikon
2003-10-12, 23:01:36
thx , mit LoadImage wird die Datei problemlos geladen.

Lord Nikon
2003-10-14, 17:08:46
BITMAP BM;
::GetObject(hBmp,sizeof(BM),&BM);
glGenTextures(1,pTexName);
glBindTexture(GL_TEXTURE_2D,*pTexName);
glPixelStorei(GL_UNPACK_ALIGNMENT,4);
glPixelStorei(GL_UNPACK_ROW_LENGTH,0);
glPixelStorei(GL_UNPACK_SKIP_ROWS,0);
glPixelStorei(GL_UNPACK_SKIP_PIXELS,0);
glTexParameteri(GL_TEXTURE_2D,
GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);
gluBuild2DMipmaps(
GL_TEXTURE_2D,
3,
BM.bmWidth,BM.bmHeight,
GL_BGR_EXT,
GL_UNSIGNED_BYTE,
BM.bmBits);
ShowMessage("TEST");

Wieso kriege ich beim GluBuild2DMipmaps stelle einen Ausnahmefehler? Wenn ich die BitsPixel afrage kommt 32 zurück. Geht die Methode nur mit 24 Bit ?

MeLLe
2003-10-15, 13:27:59
Original geschrieben von Lord Nikon

gluBuild2DMipmaps(
GL_TEXTURE_2D,
3,
BM.bmWidth,BM.bmHeight,
GL_BGR_EXT,
GL_UNSIGNED_BYTE,
BM.bmBits);

Wieso kriege ich beim GluBuild2DMipmaps stelle einen Ausnahmefehler? Wenn ich die BitsPixel afrage kommt 32 zurück. Geht die Methode nur mit 24 Bit ?
So wie du sie benutzt - JA!
Tausche 3 gegen 4 und GL_BGR_EXT gegen GL_BGRA_EXT ... aus, sollte klappen ...
gluBuild2DMipmaps(
GL_TEXTURE_2D,
4,
BM.bmWidth,BM.bmHeight,
GL_BGRA_EXT,
GL_UNSIGNED_BYTE,
BM.bmBits);

Lord Nikon
2003-10-15, 14:59:35
Original geschrieben von MeLLe
gluBuild2DMipmaps(
GL_TEXTURE_2D,
4,
BM.bmWidth,BM.bmHeight,
GL_BGRA_EXT,
GL_UNSIGNED_BYTE,
BM.bmBits);
Danke für die Antwort , aber der gleiche Fehler ist immer noch da. Woran kann das noch liegen ?

Xmas
2003-10-15, 17:21:26
Was für eine Fehlermeldung bekommst du genau? Gib mal alle Member der BITMAP-Struktur aus.

Lord Nikon
2003-10-15, 17:43:20
Member von Bitmap:
Bm Type:0
Bm Width:800
Bm Height:600
Bm WidhtBytes:3200
Bm Planes:1
Bm BitsPixel:32
Fehlermeldung:
Es ist eine Exception der Klasse C0000005 aufgetreten. Zugriffsverletzung bei 0x68fc6be5;Lesen von Adressen
0x00000000

Xmas
2003-10-15, 18:14:39
Und bmBits? Ein sinnvoller Pointer oder NULL?

Lord Nikon
2003-10-15, 18:35:39
bmBits ist NULL. Dies ist doch einentlich nicht möglich , weil

hBmp=LoadImage(NULL,name, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

erfolgreich ausgeführt wird und hBmp ist deshalb nicht NULL . Mit

BITMAP BM;
::GetObject(hBmp,sizeof(BM),&BM);

dürfte der sich doch den richtigen Pointer holen oder?
Der Rückgabe Wert der Funktion GetObject ist 24.
Es trifft damit der Fall ein:
If the function succeeds, and lpvObject is NULL, the return value is the number of bytes required to hold the information the function would store into the buffer.

Xmas
2003-10-15, 20:30:36
If hgdiobj is a handle to a bitmap created by calling CreateDIBSection, and the specified buffer is large enough, the GetObject function returns a DIBSECTION structure. In addition, the bmBits member of the BITMAP structure contained within the DIBSECTION will contain a pointer to the bitmap's bit values.

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.
Also GetDIBits verwenden.

Oder alternativ gleich zum Datei Laden auxDIBImageLoad(), eine Funktion von GLaux.