Créer CImage de tableau d'Octets
J'ai besoin de créer un CImage à partir d'un tableau d'octets (en fait, de son un tableau de unsigned char
, mais je lance à n'importe quelle forme est nécessaire). Le tableau d'octets est dans la forme "RGBRGBRGB...". La nouvelle image doit contenir un copie de l'image en octets, plutôt que d'utiliser la mémoire du tableau d'octets en lui-même.
J'ai essayé beaucoup de différentes manières d'atteindre ce -- y compris en passant par plusieurs HBITMAP les fonctions de création, d'essayer de les utiliser BitBlt-et rien d'autre jusqu'à présent, a travaillé.
Pour tester si la fonction fonctionne, il doit passer ce test:
BYTE* imgBits;
int width;
int height;
int Bpp; //BYTES per pixel (e.g. 3)
getImage(&imgBits, &width, &height, &Bpp); //get the image bits
//This is the magic function I need!!!
CImage img = createCImage(imgBits, width, height, Bpp);
//Test the image
BYTE* data = img.GetBits(); //data should now have the same data as imgBits
Toutes les implémentations de createCImage()
jusqu'à présent se sont retrouvés avec data
pointant vers un vide (rempli de zéros) tableau.
- On dirait que vous devez remplir une structure de BITMAPINFO pour votre imgBits, instancier un CImage, appelez Create() pour créer un vide bitmap de taille correcte, GetDC() pour obtenir votre CImage du DC et ensuite utiliser ::SetDIBitsToDevice() pour tracer votre imgBits à votre CImage.
- Merci, il semble que ce est le chemin à parcourir. Je suis sûr que j'ai été dans cette voie avant, mais il a abandonné parce que je ne pense pas que j'avais la tête à droite. Je vais vous donner un autre aller...
Vous devez vous connecter pour publier un commentaire.
CImage
prend en charge le Fric assez facilement et a unSetPixel()
méthode de sorte que vous pourriez probablement faire quelque chose comme ceci (non compilé, le code non testé à l'avance!):Peut-être pas la méthode la plus efficace mais je pense que c'est l'approche la plus simple.
Utilisation memcpy pour copier les données, puis SetDIBits ou SetDIBitsToDevice en fonction de ce que vous devez faire. Prenez soin de bien que, les lignes de données d'image brutes sont alignés sur 4 octets limites (autant que je me souvienne, il a été quelques années depuis que je l'ai fait) de sorte que les données que vous obtenez de retour de GetDIBits ne sera jamais exactement la même chose que les données d'origine (bien qu'il pourrait, selon la taille de l'image).
Donc plus probable que vous aurez besoin de memcpy scanline par scanline.
Merci à tous, j'ai réussi à le résoudre en fin de compte, avec votre aide. Il intervient principalement @ferblantier et @Roel la suggestion d'utiliser
SetDIBitsToDevice()
, mais il s'agit d'un peu plus de bits de se tourner et de gestion de la mémoire, donc j'ai pensé que je devais partager mon point final ici.Dans le code ci-dessous, je suppose que
width
,height
etBpp
(Octets par pixel), ainsi que l'data
est un pointeur vers le tableau de valeurs de pixels RVB.Ici est une solution plus simple. Vous pouvez utiliser GetPixelAddress(...) au lieu de tout cela BITMAPHEADERINFO et SedDIBitsToDevice. Un autre problème que j'ai résolu a avec les images 8 bits, qui doivent avoir la table des couleurs définies.