【问题标题】:Dividing QImage to smaller pieces将 QImage 分成更小的部分
【发布时间】:2014-09-13 02:14:30
【问题描述】:

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

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

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

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

感谢您的帮助!

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

感谢您的两个回答。

【问题讨论】:

    标签: c++ image qt image-processing qimage


    【解决方案1】:

    您可以创建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(),则可能无法正常工作。

    【讨论】:

    • 这太完美了,非常感谢!正是我一直在寻找的东西,但我对图像处理很陌生,我不太明白你为什么将深度划分为 8,我猜是因为每个颜色通道都是 8 位,这就是为什么你将深度重新划分为 8?
    • QImagedepth() 文档声明它返回每个像素的 数。第一个参数,一个指向原始数据的指针,必须以 bytes 中指定的偏移量递增,这就是除以 8 的原因。
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢!这是一个好主意,我以前没有使用过 QPainter,所以我不知道我可以用它来做到这一点。实际上,我的算法永远不会创建额外的图像,因为在分析每一块之后,我会破坏 QImage 对象并继续下一个,所以我永远不会存储这些块但是我需要将它们视为 QImage 因为我想使用QImage 函数来分析这幅作品。
    • 我有一门课要上课,但我一回家就试试你的方法,如果对我有用,我会接受答案。再次感谢!
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-10
      • 1970-01-01
      • 2023-03-16
      • 2016-11-08
      • 2018-02-01
      • 2011-09-04
      相关资源
      最近更新 更多