OpenCv によって作成された既存の画像バッファーをラップする QImage を作成しようとしています。これを行うには、次のコンストラクターを使用することを検討していました。
QImage::QImage ( const uchar * data, int width, int height,
int bytesPerLine, Format format )
だから、私のコードは
QImage qimage((const uchar*)iplImage->imageData,
iplImage->width, iplImage->height,
iplImage->widthStep,
QImage::Format_Indexed); // image buffer not copied!
qimage.setColorTable(grayScaleColorTable); // color table's item count 256 for grayscale.
// now new image buffer is allocated here.
わかりました。この ctor を呼び出した時点では、実際にはメモリ コピーは行われませんでした。しかし、ここで私の問題が発生します。QImage::setColorTable()
QImage が内部の detach() 関数によってコピーするための新しいイメージ バッファを割り当てる非 const メンバー関数です。
ctor がその ctor の引数としてカラー テーブルを受け入れることができるこの種の問題に対する Qt3 サポートがあることがわかりましたが、> Qt4 ではそのようなサポートは見つかりませんでした。
既存の画像バッファにグレースケール QImage を作成するにはどうすればよいですか?
事前にありがとう
[編集]
Stephen Chu のおかげで、次のコンストラクターが読み取り/書き込み可能な QImage オブジェクトを作成することに気付きました
QImage ( uchar * data, int width, int height, Format format )
QImage ( uchar * data, int width, int height, int bytesPerLine, Format format )
QImage::setColorTable()
インスタンス化の直後に後で呼び出されたとしても、新しいバッファは割り当てられません。一方、「const」データバッファーを受け取る次のコンストラクターは、新しいバッファーが割り当てられ、非 const メンバー関数QImage::setColorTable()
が呼び出されたときに元のバッファーからディープコピーされる読み取り専用の QImage オブジェクトを作成します (それは望ましくありません)。
QImage ( const uchar * data, int width, int height, Format format )
QImage ( const uchar * data, int width, int height, int bytesPerLine, Format format )