我有一张图片,我想把这张图片分成n块。所以我想知道的是我怎样才能用QImage做到这一点?或者这个任务有更好的(表现明智的)Qt类吗?
例如,想象一下我的图像由1920x1080像素组成,我想将它分成100个,这意味着每个图像将包含192x108像素。请注意,我不想创建缩放到192x108的相同部分。每件作品都是主要画面的一部分。
我附上了一张图片,让我的问题更加清晰。 这个图像由1920x1080像素组成,每个部分都有一个由192x108像素组成的网格,我希望将它们作为QImage对象处理,而不是实际将它分成100个。
有没有办法用QImage做到这一点?性能在这里很重要,因为我将分析每件作品,通常会有超过1000件。
感谢您的帮助!
编辑:两种方法都运行良好,但是alexisdm的方法更复杂,更低级,但更快。 jmk的方法更容易使用,但速度较慢。
感谢您的回答。
答案 0 :(得分: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()
,则可能无效。
答案 1 :(得分:2)
您可以通过创建所需尺寸的新QImage
个对象,然后将相应的源图像部分绘制到其中来实现此目的。为此,请从空目标图像创建QPainter
,并使用drawImage()
方法复制特定的子矩形。
但是,如果性能很重要,您可能希望了解避免源图像的不必要副本的方法。例如,如果您的算法一次只需要查看192x108的图片,是否可以将其分析限制为原始图像的特定子矩形?
如果您可以通过这种方式重构代码,则可以避免完全创建其他图像。
答案 2 :(得分:2)
您可以使用创建子图像的内置函数QImage QImage::copy(const QRect &part)
。