一旦它由win32加载,如何编辑位图

一旦我从文件中加载了一个BITMAP,使用LoadImage:

HBITMAP renderBMP = (HBITMAP)LoadImage( NULL, filePath, IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE ); 

有没有一种方法可以轻松地访问和编辑像素单独?

我可以用它来获取位图对象,但似乎没有帮助,

 BITMAP bm; GetObject(renderBMP, sizeof(bm), &bm); 

因为结构中bmBits的值是0。

更新:

现在我收到了这个解决scheme的错误:

 struct Pixel { unsigned char r,g,b,a; }; void Frame::PushMemory(HDC hdc) { BITMAPINFO bi; ZeroMemory(&bi.bmiHeader, sizeof(BITMAPINFOHEADER)); bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); GetDIBits(hdc, renderBMP, 0, bi.bmiHeader.biHeight, NULL, &bi, DIB_RGB_COLORS); /* Allocate memory for bitmap bits */ Pixel* pixels = new Pixel[bi.bmiHeader.biHeight * bi.bmiHeader.biWidth]; int n = sizeof(Pixel) * bi.bmiHeader.biHeight * bi.bmiHeader.biWidth; int m = bi.bmiHeader.biSizeImage; GetDIBits(hdc, renderBMP, 0, bi.bmiHeader.biHeight, pixels, &bi, DIB_RGB_COLORS); // Recompute the output //ComputeOutput(pixels); // Push back to windows //SetDIBits(hdc, renderBMP, 0, bi.bmiHeader.biHeight, pixels, &bi, DIB_RGB_COLORS ); //delete pixels; } 

我得到这个错误:

运行时检查失败#2 – variables“bi”周围的堆栈已损坏。

最后三行似乎不在乎是否注释。

使用GetDIBits来访问像素。 它将所有像素复制到指定的缓冲区。 像素修改后,您可以使用SetDIBits将像素写回位图。

编辑:代码示例:

 LPVOID lpvBits=NULL; // pointer to bitmap bits array BITMAPINFO bi; ZeroMemory(&bi.bmiHeader, sizeof(BITMAPINFOHEADER)); bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); if (!GetDIBits(hDC, hBmp, 0, height, NULL, &bi, DIB_RGB_COLORS)) return NULL; /* Allocate memory for bitmap bits */ if ((lpvBits = new char[bi.bmiHeader.biSizeImage]) == NULL) return NULL; if (!GetDIBits(hDC, hBmp, 0, height, lpvBits, &bi, DIB_RGB_COLORS)) return NULL; /* do something with bits */ ::SetDIBits( hDC, hBmp, 0, height, ( LPVOID )lpvBits, &bi, DIB_RGB_COLORS ); 

如果将LR_CREATEDIBSECTION标志传递给LoadImage,它将创建一个特殊类型的位图,其中包含位图位的用户模式内存部分。

DIBSection位图上的GetObject将填充BITMAP结构的bmPits指针,甚至用额外的数据填充DIBSECTION结构。