13

QPixmapおよび/またはQImage文書化されたオブジェクトの既知のサイズ/スペース制限はありますか? これに関する有用な情報は見つかりませんでした。現在、OSX と Windows で Qt 4.7.3 を使用しています。特に私は興味があります:

  • 幅/高さの制限?
  • カラーフォーマットによる制限?
  • 32/64 ビット マシンの違いは?
  • OSの違い?

メモリが唯一の制限であると単純に疑うので、最大サイズを次のように計算できます

幅 x 高さ x byte_per_pixel

もっと精巧な経験則があると思います。また、32 ビット マシンでは、GB ディメンションに遭遇したときにアドレス指定の問題が発生する可能性があります。

最後に、サイズが約 16000x16000 ピクセルの複数の RGBA 画像を保存し、透明度を使用して相互にレンダリングしたいと考えていますQGraphicsScene。利用可能なワークステーションには大量の RAM (16GB としましょう) を搭載できます。

tl;dr: QImage/QPixmap のどのようなサイズ制限を知っていますか、またはそのような情報はどこで見つけることができますか?

編集:私はタイリングアプローチを認識しており、それで問題ありません。それでも、上記のことを知っておくことは素晴らしいことです。

ありがとう!

4

4 に答える 4

13

どちらも 32767x32767 ピクセルに制限されています。つまり、X と Y の両方の解像度に符号付き 16 ビット値を使用していると考えることができます。

他の軸が 1 ピクセルしかない場合でも、どの軸も 32767 ピクセルを超えることはできません。オペレーティング システムの「ビット数」は制限に影響しません。このような巨大なイメージを作成する前に、基礎となるシステムがメモリなどの他の制限に達する可能性があります。

この制限の例は、次のソース コードで確認できます: http://git.zx2c4.com/qt/plain/src/gui/image/qpixmap_x11.cpp

if (uint(w) >= 32768 || uint(h) >= 32768) {
    w = h = 0;
    is_null = true;
    return;
}
于 2011-08-16T15:37:45.140 に答える
8

@charles-burnsによる回答に基づいて、QImageに関連するソースコードを次に示します。

QImageData *d = 0;

if (format == QImage::Format_Invalid)
    return d;

const int depth = qt_depthForFormat(format);
const int calc_bytes_per_line = ((width * depth + 31)/32) * 4;
const int min_bytes_per_line = (width * depth + 7)/8;

if (bpl <= 0)
    bpl = calc_bytes_per_line;

if (width <= 0 || height <= 0 || !data
    || INT_MAX/sizeof(uchar *) < uint(height)
    || INT_MAX/uint(depth) < uint(width)
    || bpl <= 0
    || height <= 0
    || bpl < min_bytes_per_line
    || INT_MAX/uint(bpl) < uint(height))
    return d;                                        // invalid parameter(s)

したがってbpl、これは 1 行あたりのバイト数であり、事実上width * depth_in_bytes. その最後の無効なテストで代数を使用します。

  • INT_MAX/uint(bpl) < uint(height)
  • INT_MAX < uint(height) * uint(bpl)
  • INT_MAX < height * width * depth_in_bytes

したがって、イメージの合計サイズは 2147483647 未満にする必要があります (32 ビット整数の場合)。

于 2014-07-14T01:51:48.010 に答える
2

私は実際に一度これを調べる機会がありました。ソース コードでqimage.cpp「潜在的なオーバーフローの健全性チェック」を検索すると、Qt が実行しているチェックを確認できます。基本的、

  • 必要なバイト数 (幅 * 高さ * depth_for_format) は 未満でなければなりませんINT_MAX
  • インスタンスmallocを作成している時点で、これらのバイトにアクセスできる必要があります。QImage
于 2011-08-16T15:49:45.833 に答える