【问题标题】:Read pixels from SDL_Surface and Convert to color values从 SDL_Surface 读取像素并转换为颜色值
【发布时间】:2011-11-13 11:35:11
【问题描述】:

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

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

这是我不明白的线路,谁能解释一下这条线路在做什么以及我该如何解决这个问题?

亲切的问候

马库斯

【问题讨论】:

  • 这真的是你的真实代码吗?因为我很惊讶它完全可以编译。在第 4 行,您将一个整数分配给指向 Uint8 的指针。
  • p 正在跳过表面->像素?
  • 您的代码看起来与此非常相似:Pixel_Access 您是否像它说的那样先锁定了表面?如果您与示例代码进行比较,您的代码中也存在错误。您想将表面->像素投射到 (Uint8*),而不是 (Uint8)。
  • 对不起,你是对的,我写问题时错过了*,它在我的代码中。
  • 提示:通常最好从实际代码中使用复制/粘贴。这样你就不会添加新的错误(或者在极端情况下甚至不小心纠正了实际错误,让任何人不知道你的代码应该有什么问题)。

标签: c++ 2d sdl pixel alpha


【解决方案1】:

访问冲突意味着您正在尝试访问不属于您的内存。在这种情况下,您可能调用该函数时使用了超出范围(大于图像大小或负数)的 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++;
}

【讨论】:

  • 嗯,我只能说只有当两个像素颜色都不是 255 alpha 时才会发生错误。我试过检查 x 和 y,但没有任何区别。
猜你喜欢
  • 1970-01-01
  • 2011-05-22
  • 2022-01-14
  • 1970-01-01
  • 2012-07-08
  • 2018-04-08
  • 1970-01-01
  • 1970-01-01
  • 2013-05-07
相关资源
最近更新 更多