5

画像があり、この画像を n 個に分割したいと考えています。だから私が疑問に思っているのは、どうすればQImageでこれを行うことができるのでしょうか? または、このタスクに適した (パフォーマンスに関して) Qt クラスはありますか?

たとえば、1920x1080 ピクセルで構成される画像があり、それを 100 個に分割するとします。つまり、各部分は 192x108 ピクセルで構成されることになります。192x108 にスケーリングされた同じピースを作成したくないことに注意してください。各ピースは、メイン画像の個別のピースです。

ここに画像の説明を入力

質問を明確にするために画像を添付しました。この画像は 1920x1080 ピクセルで構成され、グリッドで分割された各部分は 192x108 ピクセルで構成されているため、実際には 100 個に分割せずに、それぞれを QImage オブジェクトとして扱いたいと考えています。

QImageでこれを行う方法はありますか? ここではパフォーマンスが重要です。なぜなら、各ピースを分析し、通常は 1000 ピース以上になるからです。

ご協力ありがとうございました!

編集:どちらの方法も完全に機能しますが、alexisdm の方法はもう少し複雑で、低レベルですが、より高速です。jmk の方法は使いやすいですが、遅くなります。

両方の答えをありがとう。

4

3 に答える 3

11

QImageソース イメージと同じストライド (1 行あたりのバイト数) と形式を使用し、未加工データ バッファーを目的の開始位置に対応するオフセットと共に のコンストラクターの 1 つに渡すことにより、データをコピーせずにを作成できます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 QImage::copy(const QRect &part)サブイメージを作成する組み込み関数を使用できます。

于 2014-09-12T18:14:30.340 に答える
3

これを実現するには、必要な寸法の新しいQImageオブジェクトを作成し、ソース イメージの適切な部分をそれらに描画します。これを行うにはQPainter、空のターゲット イメージから を作成し、drawImage()メソッドを使用して特定のサブ長方形をコピーします。

ただし、パフォーマンスが重要な場合は、ソース イメージの不要なコピーを回避する方法を検討することをお勧めします。たとえば、アルゴリズムが一度に画像の 192x108 の部分だけを見る必要がある場合、その分析を元の画像の特定のサブ長方形に限定できますか?

この方法でコードを再構築できれば、追加のイメージを完全に作成することを避けることができます。

于 2012-10-01T21:51:32.290 に答える