2010-06-08 21 views
2

我可以找到很多關於如何在託管C++中執行此操作的示例,但沒有一個適用於非託管操作。在Native C++中鎖定GDI +位圖?

我想盡可能高效地獲取所有的像素數據,但是我需要更多的信息,所以我可以正確地遍歷像素數據並從中獲取每個rgba值。

現在我有這樣的:

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

如何使用lockdat做getpixel的相同呢? 謝謝

回答

2

lockdat-> Scan0是一個指向位圖像素數據的指針。請注意,你確實不在乎你要求的像素格式,PixelFormatDontCare不會這樣做。因爲您如何使用指針受像素格式的影響。 PixelFormat32bppARGB是最簡單的,一個像素將是int的大小,4個字節表示alpha,紅色,綠色和藍色。步幅將等於位圖的寬度。使一個簡單的memcpy()可能完成工作。謹防位圖存儲顛倒。

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