c++ - 将 QImage 分成更小的部分

标签 c++ image qt image-processing qimage

我有一张图片,我想把这张图片分成n张。所以我想知道如何使用 QImage 做到这一点?或者是否有更好的(性能方面的)Qt 类来完成这项任务?

例如,假设我有一个由 1920x1080 像素组成的图像,我想将它分成 100 block ,这意味着每 block 将由 192x108 像素组成。请注意,我不想创建缩放到 192x108 的相同作品。每件作品都是主图片的一个独特部分。

enter image description here

我附上了一张图片以使我的问题更清楚。 此图像由 1920x1080 像素组成,每个用网格潜水的部分由 192x108 像素组成,我想将它们中的每一个都视为 QImage 对象,而不是将其实际划分为 100 block 。

有没有办法用 QImage 做到这一点?性能在这里很重要,因为我会分析每一件,通常会有超过 1000 件。

感谢您的帮助!

编辑:这两种方法都可以完美运行,但是 alexisdm 的方法稍微复杂一些,级别较低,但更快。 jmk 的方法更容易使用,但速度较慢。

感谢您的回答。

最佳答案

您可以创建一个 QImage 而无需复制任何数据,方法是使用与源图像相同的步幅(每行字节数)和格式并传递原始数据缓冲区,偏移量对应于所需的起始位置,到 QImage 的构造函数之一:

QImage createSubImage(QImage* image, const QRect & rect) {
    size_t offset = rect.x() * image->depth() / 8
                    + rect.y() * image->bytesPerLine();
    return QImage(image->bits() + offset, rect.width(), rect.height(),
                  image->bytesPerLine(), image->format());
}

只要子 QImage 存在,源图像就必须存在。

但如果分析代码尝试直接访问图像原始数据而不使用 QImage::bytesPerLine()QImage::scanLine()QImage::pixel().

关于c++ - 将 QImage 分成更小的部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12681554/

相关文章:

Python:读写TIFF 16位,三 channel ,彩色图像

c++ - Qt - 仅在发出两个信号时调用插槽

flash - 从图库中批量导出图像?

c++ - 如何使 vector 分配新的(而不是更多的)内存

c++ - 编译好的文件放到文件夹后无法运行程序

c++ - 我只能从一个文件访问静态 fstream

ios - Flickr API : Retina images for the new iPad

linux - Qt 应用程序需要 KDE 吗?

qt - 如何获取tableView中某个值的索引?

c++ - 传递给 Curl 的 URL 变量