2010-06-08 7 views
2

Je peux trouver de nombreux exemples sur la façon de le faire dans C++ géré mais aucun pour non géré. Je veux obtenir toutes les données de pixel aussi efficacement que possible, mais certaines des choses de scan0 dont j'ai besoin de plus d'informations sur afin que je puisse parcourir correctement les données de pixel et obtenir chaque valeur rgba de celui-ci.Verrouillage d'un bitmap GDI + en C++ natif?

J'ai en ce moment ceci:

Bitmap *b = new Bitmap(filename); 
    if(b == NULL) 
    { 
    return 0; 
    } 

    UINT w,h; 
    w = b->GetWidth(); 
    h = b->GetHeight(); 
    Rect *r = new Rect(0,0,w,h); 
    BitmapData *lockdat; 
b->LockBits(r,ImageLockModeRead,PixelFormatDontCare,lockdat); 

    delete(r); 
    if(w == 0 && h == 0) 
    { 
    return 0; 
    } 

    Color c; 

    std::vector<GLubyte> pdata(w * h * 4,0.0); 

    for (unsigned int i = 0; i < h; i++) { 
    for (unsigned int j = 0; j < w; j++) { 
    b->GetPixel(j,i,&c); 

    pdata[i * 4 * w + j * 4 + 0] = (GLubyte) c.GetR(); 
    pdata[i * 4 * w + j * 4 + 1] = (GLubyte) c.GetG(); 
    pdata[i * 4 * w + j * 4 + 2] = (GLubyte) c.GetB(); 
    pdata[i * 4 * w + j * 4 + 3] = (GLubyte) c.GetA(); 
    } 
    } 
    delete(b); 

    return CreateTexture(pdata,w,h); 

Comment puis-je utiliser lockdat pour faire l'équivalent de getPixel? Merci

Répondre

2

lockdat-> Scan0 est un pointeur vers les données de pixel de la bitmap. Notez que vous vraiment faire attention quel format de pixel vous demandez, PixelFormatDontCare ne fera pas. Parce que la façon dont vous utilisez le pointeur est affectée par le format de pixel. PixelFormat32bppARGB est le plus simple, un pixel aura la taille d'un int, 4 octets représentant l'alpha, le rouge, le vert et le bleu. Et la foulée sera égale à la largeur de l'image bitmap. Faire en sorte qu'un simple memcpy() fasse le travail. Attention, les bitmaps sont stockés à l'envers.

0
Bitmap *m_image = new Bitmap(...) // a 24-bit RGB bitmap 

BitmapData bmData; 
Rect rect(0, 0, m_image->GetWidth(), m_image->GetHeight()); 
m_image->LockBits(&rect , ImageLockModeRead , PixelFormat24bppRGB,&bmData ); 
memcpy(your_bytes_buffer, bmData.Scan0, min(bmData.Height * bmData.Stride, your_buffer_size)); 
m_image->UnlockBits(&bmData);