9
votes

Win32 C / C ++ Image de charge de la mémoire tampon

Je veux charger un fichier image (.bmp) sur une application Win32, mais je ne souhaite pas utiliser le LOADBITMAP / LoadImage standard à partir de Windows API: Je souhaite que cela se charge à partir d'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 rendait coincé.

Ce que je recherche est une fonction qui fonctionne comme ceci: P>

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


0 commentaires

4 Réponses :


1
votes

non, mais vous pouvez créer un nouveau bitmap de la taille de l'actuel en mémoire et écrivez votre structure de mémoire dessus.

Vous recherchez le CreateBitmap < / a> fonction. Définissez LPVBits sur vos données.


0 commentaires


3
votes

Careibsection peut être un peu compliqué à utiliser, mais l'une des choses qu'il peut faire est de créer un bitmap indépendant de l'appareil et de vous donner un pointeur au tampon pour les bits bitmap. Certes, vous avez déjà un tampon rempli de bits bitmap, mais au moins vous pouvez copier les données.

spéculer un bit: crédibsection peut également créer des bitmaps à partir d'objets de fichier, et il existe probablement un moyen d'obtenir Windows pour vous donner un objet de fichier représentant une pièce de mémoire, ce qui pourrait tromper crédibsection en vous donnant un bitmap construit directement à partir de votre tampon.


1 commentaires

Careibsection est l'API correcte à utiliser. La mémoire qu'il utilise doit être un type particulier de mémoire du noyau (car le pilote de périphérique graphique doit y accéder) - ce qui peut être satisfait d'une section de fichier (étant une structure de noyau elle-même) ou en laissant Carebsection allouer la mémoire.



7
votes

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


1 commentaires

Bonjour, je suis développeur Java mais dans ma candidature, j'ai aussi besoin de charger l'image de C ++ et je ne sais pas comment le faire. Je recherche sur Internet depuis si longtemps mais je ne peux toujours pas l'obtenir. Alors, veuillez fournir votre code entier que je l'ai mal voulu. s'il te plaît