从文件加载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。
更新:
现在我遇到了这个解决方案的错误:
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 - 变量'bi'周围的堆栈已损坏。
无论是否评论,最后三行似乎都不重要。
答案 0 :(得分:3)
使用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 );
答案 1 :(得分:0)
如果将LR_CREATEDIBSECTION标志传递给LoadImage,它会创建一种特殊的位图,其中包含位图的位用户模式内存部分。
DIBSection位图上的GetObject将填充BITMAP结构的bmPits指针,甚至用额外的数据填充DIBSECTION结构。