2008-10-10 4 views

Répondre

2

Jetez un oeil à Image::Image(IStream *, BOOL). Cela prend un pointeur vers un objet COM implémentant l'interface IStream. Vous pouvez en obtenir un en allouant de la mémoire globale avec GlobalAlloc puis en appelant CreateStreamOnHGlobal sur le descripteur renvoyé. Ça va ressembler à quelque chose comme ceci:

shared_ptr<Image> CreateImage(BYTE *blob, size_t blobSize) 
{ 
    HGLOBAL hMem = ::GlobalAlloc(GMEM_MOVEABLE,blobSize); 
    BYTE *pImage = (BYTE*)::GlobalLock(hMem); 

    for (size_t iBlob = 0; iBlob < blobSize; ++iBlob) 
     pImage[iBlob] = blob[iBlob]; 

    ::GlobalUnlock(hMem); 

    CComPtr<IStream> spStream; 
    HRESULT hr = ::CreateStreamOnHGlobal(hMem,TRUE,&spStream); 

    shared_ptr<Image> image = new Image(spStream); 
    return image; 
} 

Mais avec la vérification des erreurs et tels (omis ici pour rendre les choses plus claires)

+0

qui a fait le travail, merci! – djeidot

+0

C'est ce que je reçois pour ne pas essayer de le compiler. – Eclipse

0

récupère d'abord votre blog dans un tableau d'octets utilisez quelque chose comme ceci:

public static Image CreateImage(byte[] pict) 
{ 
    System.Drawing.Image img = null; 
    using (System.IO.MemoryStream stream = new System.IO.MemoryStream(pict)) { 
    img = System.Drawing.Image.FromStream(stream); 
    } 
    return img; 
} 
+0

ce qui est l'équivalent de MemoryStream sur C++? – djeidot

+0

J'ai d'abord mal lu le titre et je pensais que vous cherchiez C#. Il semble que MemoryStream soit aussi disponible en C++: http://msdn.microsoft.com/en-us/library/system.io.memorystream(VS.71).aspx –

+0

Je ne cherchais pas d'objets gérés, mais merci quand même – djeidot

Questions connexes