Win32 C / C ++ Load Image à partir de la mémoire tampon

Je souhaite charger un fichier image (.bmp) sur une application Win32, mais je ne souhaite pas utiliser l’API standard LoadBitmap / LoadImage à partir de Windows: je souhaite le charger depuis un tampon déjà en mémoire. Je peux facilement charger un bitmap directement à partir d’un fichier et l’imprimer à l’écran, mais ce problème me bloque.

Ce que je recherche, c’est une fonction qui fonctionne comme ceci:

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

Peu importe, j’ai trouvé ma solution! Voici le code d’initialisation:

 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); 

Essayez CreateBitmap() :

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

CreateDIBSection peut être un peu compliqué à utiliser, mais l’une des choses qu’il peut faire est de créer un bitmap indépendant du périphérique et de vous donner un pointeur vers le tampon pour les bits bitmap. Certes, vous avez déjà un tampon plein de bits bitmap, mais au moins vous pouvez copier les données.

CreateDIBSection un peu: CreateDIBSection peut également créer des bitmaps à partir d’objects de fichiers, et il existe probablement un moyen d’obtenir que Windows vous donne un object de fichier représentant une partie de la mémoire.

Non, mais vous pouvez créer un nouveau bitmap de la taille de la mémoire courante et y inscrire votre structure de mémoire.

Vous recherchez la fonction CreateBitmap . Définissez lpvBits sur vos données.