win32 加载位图后如何对其进行编辑

发布于 2024-10-08 03:28:18 字数 1274 浏览 2 评论 0原文

一旦我使用 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”周围的堆栈已损坏。

最后三行似乎无论是否注释都不重要。

Once I have loaded a BITMAP from file, with LoadImage:

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

is there a way to easily access and edit the pixels individually?

I can use this to get the bitmap object, but it doesn't seem to help,

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

because the value of bmBits in the structure is 0.

UPDATE:

Now I am getting a bug with this solution:

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

I get this error:

Run-Time Check Failure #2 - Stack around the variable 'bi' was corrupted.

The last three lines don't seem to matter whether commented in or not.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

我爱人 2024-10-15 03:28:18

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

Use GetDIBits to access pixels. It copies all pixels into specified buffer. After pixels' modification you can use SetDIBits to write pixels back to bitmap.

EDIT:
Example of code:

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 );
尘曦 2024-10-15 03:28:18

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

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

If you pass the LR_CREATEDIBSECTION flag to LoadImage it creates a special kind of bitmap with a usermode memory section containing the bits of the bitmap.

GetObject on a DIBSection bitmap will fill in the bmPits pointer of the BITMAP structure, or even fill in a DIBSECTION struct with extra data.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文