2011-06-24 2 views
2

J'utilise la bibliothèque FreeImage pour gérer le chargement des images et leur transmission à OpenGL. Actuellement, je supporte la lecture d'une image à partir d'un fichier. Cependant, je voudrais étendre cela à pouvoir lire à partir d'une variable dans le but de paquets de contenu de jeu. Fondamentalement, en bref, j'ai le fichier entier, en-tête et tout, écrit à un char * non signé. Je veux prendre ce tampon et faire quelque chose de similaire à ce avec elle (en supposant fif variable est déclarée):Récupération des données d'image de la mémoire

FIBITMAP * dib = FreeImage_Load(fif, "someImage.png"); 

mais au lieu de someImage.png, je veux spécifier le unsigned char * (permet de l'appeler tampon pour l'intérêt de la question). Y at-il une méthode dans la bibliothèque qui peut gérer une telle chose?

EDIT: Je devrais être un peu plus spécifique étant donné que "someImage.png" peut être considéré comme un char non signé *.

Pour effacer la confusion jusqu'à, le cas échéant, la valeur de tampon unsigned char * serait déterminé par quelque chose comme ce pseudo-code:

fileStream = openFile "someImage.png" 
    unsigned char * buffer = fileStream.ReadToEnd 

Répondre

5

On dirait que vous voulez utiliser FreeImage_ConvertToRawBits. Voici un exemple de la documentation:

// this code assumes there is a bitmap loaded and 
    // present in a variable called ‘dib’ 
    // convert a bitmap to a 32-bit raw buffer (top-left pixel first) 
    // -------------------------------------------------------------- 
    FIBITMAP *src = FreeImage_ConvertTo32Bits(dib); 
    FreeImage_Unload(dib); 
    // Allocate a raw buffer 
    int width = FreeImage_GetWidth(src); 
    int height = FreeImage_GetHeight(src); 
    int scan_width = FreeImage_GetPitch(src); 
    BYTE *bits = (BYTE*)malloc(height * scan_width); 
    // convert the bitmap to raw bits (top-left pixel first) 
    FreeImage_ConvertToRawBits(bits, src, scan_width, 32, FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK, TRUE); 
    FreeImage_Unload(src); 
    // convert a 32-bit raw buffer (top-left pixel first) to a FIBITMAP 
    // ---------------------------------------------------------------- 
    FIBITMAP *dst = FreeImage_ConvertFromRawBits(bits, width, height, scan_width, 32, FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK, FALSE); 
+0

Cela pourrait être ce dont j'ai besoin, je vais essayer. +1! – MGZero

+0

Désolé, mais pourriez-vous expliquer ce que fait exactement le paramètre pitch? Je ne comprends pas très bien la documentation, probablement parce que je ne sais pas vraiment ce qu'est un scanline. – MGZero

+0

Pitch est le nombre d'octets par ligne de l'image. Il est généralement rembourré pour être un peu plus grand que la largeur de l'image pour des raisons d'alignement et de performance. Si votre image est fortement emballée, elle sera juste largeur * octets par pixel. – Mikola

0

Utilisez FreeImage_LoadFromHandle. Vous aurez besoin de créer 3 fonctions qui peuvent accéder au tampon, et mettre les adresses de ces fonctions dans une structure FreeImageIO.

Questions connexes