reinterpret_cast<uchar*>(quint32*)
からQImageコンストラクタを使用してARGB32 QImageを作成しようとすると、イメージはカラーとアルファチャンネルを失い、その結果のQImageはグレースケールです!uint32またはuchar配列からARGB QImageを作成する
グレースケールで表示しようとすると、グレースケールイメージが期待通りに表示されます。だから私はスケーリングとquint32アレイへのushortデータのインデックス作成はうまくいったが、何がうまくいかないのだろうか?
A Qt forum post私はそれをやっているように(私が見る限り)、しかし多分Qtのそのバージョン以来の動作は変わっていますか?
私はドキュメントが言うことを実現(私はQtの5.9を使用しています):
データは32ビットで整列させる必要があり、かつ画像 内のデータのそれぞれの走査線は、32ビットを揃えなければなりません。
しかし、私はquint32がreinterpret_cast<uchar*>()
の後でも32ビットに整列されることを期待していますか?
今詳細:
inline uchar val_to_blue(const double val) {
if (val > 0.5)
return 0;
else if (val < 0.25)
return 255;
else // x={.5,...,.25}:a=255/(.25-.5)=-4*255 & b=-255*0.5/(0.25-0.5)=4/2*255=2*255
return (uchar)(val * -4.0 * 255.0) + 2 * 255;
}
inline uchar val_to_green(const double val) {
if (val > 0.25 && val < 0.75)
return 255;
else if (val < 0.25)// x={0,...,.25}:a=255/(.25-0)=4*255 & b=-255*0/(0.25-0)=0
return (uchar)(val * 4.0 * 255.0);
else // if (val > .75) // x={.75,...,1}:a=255/(.75-.5)=4*255 & b=-255*0.5/(0.75-0.5)=-4/2*255=-2*255
return (uchar)(val * -4.0 * 255.0) - 2 * 255;
}
inline uchar val_to_red(const double val) {
if (val < 0.5)
return 0;
if (val > 0.75)
return 255;
else // x={0.5,...,0.75}:a=255/(0.75-0.5)=4*255 & b=-255*0.5/(0.75-0.5)=-4/2*255=-2*255
return (uchar)(val * 4.0 * 255.0) - 2 * 255;
}
inline QRgb val_to_rgba_scale(const double val) {
return qRgba(// ax+b={0,...,255} for x={i,...,j}, a=255/(j-i), b= -255i/(j-i)
val_to_blue(val),
val_to_green(val),
val_to_red(val),
(uchar)(val * 81)
);
}
: 私はこのような半透明の青色から緑色〜赤色画像を計算(符号なしshort値を持つアレイ)の結果を変換してい
ここで、val
は、ushortデータからスケーリングされた0と1の間の倍数です。 (m_pData[i*m_iWidth + j] - lowVal)/(double)winWidth
がUSHORTツーダブルスケーリング方法である
if (m_pData[i*m_iWidth + j] >= uppVal)
tmpData[tmpIdx] = 0x45ff0000;
else if (m_pData[i*m_iWidth + j] <= lowVal)
tmpData[tmpIdx] = 0x00000000;
else
tmpData[tmpIdx] = val_to_rgba_scale((m_pData[i*m_iWidth + j] - lowVal)/(double)winWidth);
: 各QRgb
値は、このようなquint32
配列の対応するインデックスに格納されます。 これはforループで行われます。
は最後に私がイメージを構築しようとすると:
QImage tmpQImage = QImage(reinterpret_cast<unsigned char*>(tmpData), m_iWidth, m_iHeight, QImage::Format_ARGB32);
しかし、直後に呼び出されたときtmpQImage.allGray()
trueを返しますので、私は、期待どおり、これは動作しません!
私は間違っていますが、代わりにARGB画像を作成して色とアルファチャンネルを維持するにはどうすればよいですか?
トラブルシューティングのヒント:2次元のforループとQImageの「putpixel」メソッドを使用してピクセル単位で画像を生成し、その画像がすぐに出力されるかどうかを確認してください。正しい場合は、この正しいイメージの生データとグレースケールイメージのデータを比較します。それが正しいのではない場合、問題は元の生画像データに含まれていなければなりません。 – hyde