gpt4 book ai didi

c++ - 在 native C++ 中锁定 GDI+ 位图?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:00:31 26 4
gpt4 key购买 nike

我可以找到很多关于如何在托管 C++ 中执行此操作的示例,但没有找到非托管的示例。

我想尽可能高效地获取所有像素数据,但我需要更多有关 scan0 的一些信息,以便我可以正确地遍历像素数据并从中获取每个 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 等效的操作?谢谢

最佳答案

lockdat->Scan0是指向位图像素数据的指针。请注意,您真的关心您要求的像素格式,PixelFormatDontCare 不会。因为你如何使用指针会受到像素格式的影响。 PixelFormat32bppARGB 是最简单的,一个像素将是一个 int 大小,4 个字节分别代表 alpha、红色、绿色和蓝色。并且步幅将等于位图的宽度。很可能一个简单的 memcpy() 就能完成工作。请注意位图是颠倒存储的。

关于c++ - 在 native C++ 中锁定 GDI+ 位图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2999814/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com