gpt4 book ai didi

c++ - 从 SDL_Surface 读取像素并转换为颜色值

转载 作者:太空宇宙 更新时间:2023-11-04 14:20:22 27 4
gpt4 key购买 nike

我真的不知道哪里出了问题(主要是因为我不知道给我报错的那一行是干什么的)。

我认为我不必向您展示那么多代码。我正在做的是尝试获取像素的 RGBA 值以查看 Alpha 值有多大。我正在使用它来确定它们的矩形内是否存在碰撞。

这是我的:

bool Texture2D::GetPixelAlphaValue(Vector2 pixel)
{
int bpp = surface->format->BytesPerPixel;
Uint8* p = (Uint8*) surface->pixels + (int) pixel.y * surface->pitch + (int) pixel.x * bpp);

Uint32 pixelColor = *(Uint32*)p;

Uint8 red, green, blue, alpha;
SDL_GetRGBA(pixelColor, surface->format, &red, &green, &blue, &alpha);

return alpha > 250;
}

我很确定我的碰撞是好的,我所做的是检查矩形是否相交,我创建一个相交的矩形,然后检查相交矩形内的每个像素。

一旦我在屏幕上发生像素完美碰撞,游戏就会崩溃,并且我得到一个箭头指向:

Uint32 pixelColor = *(Uint32*)p;

出现错误:

 Unhandled exception at 0x000393b4 in OpenGLSDLTest.exe: 0xC0000005: Access violation      reading location 0x063b6fd0.

这是我不明白的那一行,有人可以解释一下这条线在做什么以及我该如何解决这个问题吗?

亲切的问候

马库斯

最佳答案

访问冲突意味着您正在尝试访问不属于您的内存。在这种情况下,您可能在调用该函数时使用了 xy 超出范围(大于图像的大小,或负值)。

在对它们进行指针运算之前,您应该检查 xy 的值,然后您可以更优雅地处理该错误(这可能只是意味着报告 哪个值是错误的,然后无论如何中止,或者它可能意味着将该错误报告给调用者)。

另一个可能的错误来源是发生错误的行。它将指向 Uint8 的指针重新解释为指向 Uint32 的指针,并取消引用它。实际上,它将以该地址为起点的四个字节读入 pixelcolor。请注意,此转换仅在 bpp 为 4 时有效,并且像素数组的对齐方式适合 UInt32。对齐问题不太可能在基于 x86 的平台上导致错误(x86 通常只会对未对齐的指针造成性能影响),但 bpp 问题可能会在数组末尾发生。干净(但通常较慢)的方法是单独读取字节并使用位移位组合它们,如下所示:

UInt32 pixelcolor = 0;
for (int i = 0; i < bpp; ++i)
{
pixelcolor <<= 8;
pixelcolor += *p++;
}

关于c++ - 从 SDL_Surface 读取像素并转换为颜色值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8111239/

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