2010-05-22 11 views
5

Ich möchte eine Bilddatei (.bmp) in einer Win32-Anwendung laden, aber ich möchte nicht die Standard-LoadBitmap/LoadImage von Windows-API verwenden: Ich möchte es laden ein Puffer, der bereits im Speicher ist. Ich kann ein Bitmap einfach direkt aus einer Datei laden und auf dem Bildschirm ausdrucken, aber dieses Problem macht mich fest.Win32 C/C++ Bild aus dem Speicher laden

Was ich suche, ist eine Funktion, die wie folgt funktioniert:

HBITMAP LoadBitmapFromBuffer(char* buffer, int width, int height); 

Antwort

5

Nevermind, ich fand meine Lösung! Hier ist der Initialisierungscode:

std::ifstream is; 
is.open("Image.bmp", std::ios::binary); 
is.seekg (0, std::ios::end); 
length = is.tellg(); 
is.seekg (0, std::ios::beg); 
pBuffer = new char [length]; 
is.read (pBuffer,length); 
is.close(); 

tagBITMAPFILEHEADER bfh = *(tagBITMAPFILEHEADER*)pBuffer; 
tagBITMAPINFOHEADER bih = *(tagBITMAPINFOHEADER*)(pBuffer+sizeof(tagBITMAPFILEHEADER)); 
RGBQUAD    rgb = *(RGBQUAD*)(pBuffer+sizeof(tagBITMAPFILEHEADER)+sizeof(tagBITMAPINFOHEADER)); 

BITMAPINFO bi; 
bi.bmiColors[0] = rgb; 
bi.bmiHeader = bih; 

char* pPixels = (pBuffer+bfh.bfOffBits); 

char* ppvBits; 

hBitmap = CreateDIBSection(NULL, &bi, DIB_RGB_COLORS, (void**) &ppvBits, NULL, 0); 
SetDIBits(NULL, hBitmap, 0, bih.biHeight, pPixels, &bi, DIB_RGB_COLORS); 

GetObject(hBitmap, sizeof(BITMAP), &cBitmap); 
+0

Hallo, ich bin Java-Entwickler, aber in meiner Anwendung muss ich auch Bild von C++ laden und ich weiß nicht, wie es geht. Ich forsche im Internet so lange, kann es aber immer noch nicht bekommen. also bitte geben sie ihren ganzen code an ich habe es dringend benötigt. Bitte – Jony

0

Nein, aber Sie können eine neue Bitmap die Größe der aktuellen im Speicher erstellen, und schreiben Sie Ihre Speicherstruktur auf es.

Sie suchen nach der CreateBitmap Funktion. Setze lpvBits auf deine Daten.

3

Versuchen CreateBitmap():

HBITMAP LoadBitmapFromBuffer(char *buffer, int width, int height) 
{ 
    return CreateBitmap(width, height, 1, 24, buffer); 
} 
3

CreateDIBSection ein wenig kompliziert sein kann, zu verwenden, aber eines der Dinge, die sie tun können, ist eine geräteunabhängige Bitmap erstellen und geben Sie einen Zeiger auf den Puffer für die Bitmap-Bits . Zugegeben, Sie haben bereits einen Puffer voller Bitmap-Bits, aber zumindest könnten Sie die Daten kopieren.

Spekulieren ein bisschen: CreateDIBSection können auch Bitmaps aus Datei-Objekte erstellen, und es ist wahrscheinlich ein Weg, um Windows erhalten Sie einen Teil des Speichers ein Dateiobjekt zu geben darstellt, die CreateDIBSection in geben Sie eine Bitmap direkt gebaut verleiten könnten von Ihrem Puffer.

+0

CreateDIBSection ist die richtige API zu verwenden. Der verwendete Speicher muss eine bestimmte Art von Kernel-Speicher sein (da der Grafikgerätetreiber darauf zugreifen muss) - was durch einen Dateiabschnitt (der selbst eine Kernel-Struktur ist) befriedigt werden kann oder CreateDIBSection den Speicher zuordnen lässt. –

Verwandte Themen