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

时间:2011-11-13 11:35:12

标签: c++ 2d sdl pixel alpha

我真的不知道出了什么问题(主要是因为我不知道哪条线会给我一个错误)。

我认为我不得不向你展示那么多代码。 我正在做的是,我正在尝试获取像素的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.

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

亲切的问候

马库斯

1 个答案:

答案 0 :(得分:0)

访问冲突意味着您正在尝试访问不属于您的内存。在这种情况下,您可能在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++;
}
相关问题