5

我有一张图片,我想把这张图片分成 n 块。所以我想知道我怎么能用 QImage 做到这一点?或者这个任务有更好的(性能方面)Qt 类吗?

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

在此处输入图像描述

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

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

感谢您的帮助!

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

感谢您的两个答案。

4

3 回答 3

11

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().

于 2012-10-01T22:28:24.857 回答
3

您可以通过创建QImage所需尺寸的新对象,然后将源图像的适当部分绘制到其中来完成此操作。为此,QPainter从空的目标图像创建一个,并使用该drawImage()方法复制一个特定的子矩形。

但是,如果性能很重要,您可能需要寻找避免不必要的源图像副本的方法。例如,如果您的算法一次只需要查看 192x108 的图片,它是否可以将其分析限制在原始图像的特定子矩形上?

如果您可以通过这种方式重构代码,则可以完全避免创建额外的图像。

于 2012-10-01T21:51:32.290 回答
3

QImage QImage::copy(const QRect &part)您可以使用创建子图像的内置函数。

于 2014-09-12T18:14:30.340 回答