【问题标题】:How to use the pixel array from an image in sfml如何在 sfml 中使用图像中的像素数组
【发布时间】:2017-03-31 12:22:18
【问题描述】:

我是 sfml 新手,想分别处理图像的每个像素。

我看到的最好方法是遍历该图像中所有像素的数组。 Sfml 为此提供了方便的函数sf::Image::getPixelsPtr()。不幸的是,我无法理解返回的数组。

我不明白这方面的文档,我如何才能访问这个数组中某个像素的颜色值?

【问题讨论】:

  • 您要进行正常的图像处理吗?如果您想以某种特定方式处理所有像素,您可能需要使用像素着色器将您的纹理渲染到sf::RenderTexture,该着色器将您的变换应用于sf::Sprite

标签: c++ arrays pixel sfml


【解决方案1】:

const Uint8* sf::Image::getPixelsPtr ( ) const

返回值指向一个由 8 位整数组成的 RGBA 像素数组。数组的大小是宽度 * 高度 * 4 (getSize().x * getSize().y * 4)。警告:如果你修改了图片,返回的指针可能会失效,所以千万不要保存太久。如果图像为空,则返回空指针。

据我了解,图像是 8 位 RGBA,并且他们在图像的开头为您提供了一个 Uint8 指针,这将是第一个像素的“R”。

// code edited. was saying 'sd' i changed to 'sf'
const UInt8* pByteBuffer = sf::Image::getPixelsPtr();

size_t numPixels = getSize().x + getSize().y;
for (int i = 0 ; i < numPixels; ++i)
    {
    UInt8 red   = pByteBuffer[4 * i];
    UInt8 green = pByteBuffer[4 * i + 1];
    UInt8 blue  = pByteBuffer[4 * i + 2];
    UInt8 alpha = pByteBuffer[4 * i + 3];
    }

如果您想在整个 PIXELS 上进行迭代,而不是在像素内的单一颜色上进行迭代,您可以 reinterpret_cast 他们提供给您的指针:

const UInt8* pByteBuffer = sf::Image::getPixelsPtr();
const UInt32* pPixelBuffer = reinterpret_cast<const UInt32*>(pByteBuffer);

size_t numPixels = getSize().x * getSize().y;
for (int i = 0; i < numPixels; ++i)
    {
    uint32_t pixel = pPixelBuffer[i];
    }

【讨论】:

  • 正确,只是您在for() 循环中为图像像素使用了错误的索引,并且在访问数组时取消引用它,因此您会得到Uint8 而不是UInt8*.
  • @Mario 我的错。我用来处理存储在 vector. 中的图像
  • @O'Neil 已更正。虽然我忍不住想他们的方法应该被命名为 getPixelsCPtr。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 2012-11-16
  • 2013-09-19
  • 2011-09-03
  • 2014-02-25
  • 1970-01-01
  • 2019-08-25
相关资源
最近更新 更多