首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Qt/QML从图像中获取特定像素及其坐标

使用Qt/QML从图像中获取特定像素及其坐标
EN

Stack Overflow用户
提问于 2020-07-15 15:33:41
回答 1查看 440关注 0票数 1

我们正在创建一个有地图的游戏。在这些地图上,玩家可以步行,但是为了知道他们是否可以步行到某个地方,我们有另一个图像,其中的路径是绘画。

玩家可以通过点击地图来移动,如果点击与对撞机图像匹配,角色应该用探路器去点击的点。如果不是,角色不会移动。

例如,下面是一个贴图及其碰撞路径图像:

我怎么知道我是否在Qt中点击了碰撞器(这是一个只有一种颜色和透明度的png )?我正在使用QML和Felgo进行渲染,所以如果已经有一种方法可以用QML实现,那就更好了,但我也可以用C++实现它。

我的第二个问题是如何做一个探路者?我知道这方面的算法,但我应该使用像素移动吗?

我已经看到了QPainterPath类,它可能是我正在寻找的,我如何才能读取图像中具有特定颜色的所有像素并知道它们的坐标?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2020-07-26 07:12:31

  • QML接口没有提供有效的方法来解决您的任务。这应该是在C++端完成的。
  • 要获取图片数据,你可以使用:
    • QImage来加载图片
    • 调用N次QImage::constScanLine,每次读取K个像素。N=图像高度,K= width.

如何处理QImage::constScanLine返回的uchar*

您应该调用QImage::format()来确定被uchar*隐藏的像素格式。或者,您可以调用QImage::convertToFormat(QImage::Format_RGB32)并始终将像素数据从uchar*转换为您的自定义结构,如PixelData

代码语言:javascript
复制
#pragma pack(push, 1)
struct PixelData {
   uint8_t padding;
   uint8_t r;
   uint8_t g;
   uint8_t b;
};
#pragma pack(pop)

根据该文档:https://doc.qt.io/qt-5/qimage.html#Format-enum

这是一个可编译的解决方案,用于将图像加载到RAM中,以便进一步有效地处理其数据:

代码语言:javascript
复制
#include <QImage>


#pragma pack(push, 1)
struct PixelData {
   uint8_t padding;
   uint8_t r;
   uint8_t g;
   uint8_t b;
};
#pragma pack(pop)


void loadImage(const char* path, int& w, int& h, PixelData** data) {
    Q_ASSERT(data);

    QImage initialImage;
    initialImage.load(path);
    auto image = initialImage.convertToFormat(QImage::Format_RGB32);

    w = image.width();
    h = image.height();
    *data = new PixelData[w * h];

    PixelData* outData = *data;

    for (int y = 0; y < h; y++) {
        auto scanLine = image.constScanLine(y);
        memcpy(outData, scanLine, sizeof(PixelData) * w);
        outData += w;
    }
}


void pathfinder(const PixelData* data, int w, int h) {
    // Your algorithm here
}


void cleanupData(PixelData* data) {
    delete[] data;
}


int main(int argc, char *argv[])
{
    int width, height;
    PixelData* data;

    loadImage("D:\\image.png", width, height, &data);
    pathfinder(data, width, height);
    cleanupData(data);

    return 0;
}

您可以通过调用此函数来访问每个像素

代码语言:javascript
复制
inline const PixelData& getPixel(int x, int y, const PixelData* data, int w) {
    return *(data + (w * y) + x);
}

..。或者在你的寻路算法中使用这个公式,这样会更有效率。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62909736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档