0

QImage を、各ピクセルが 3 つの整数 (チャネル) で表される配列に変換する必要があります。だから私は充填コードでこれを達成しようとしています:

void Processor::init(QImage *image){
QColor* c = new QColor();

int i,j;
int local_ind;

x = image->width();
y = image->height();

if(this->img!=NULL)
    delete [] this->img;
this->img = new int[ x * y * 3];

for( i = 0 ; i < y ; i++ )
    for( j = 0 ; j < x ; j++ ){
        c->setRgb(image->pixel(j, i));
        local_ind = i * x + j * 3;
        this->img[local_ind + 0] = c->red();
        this->img[local_ind + 1] = c->green();
        this->img[local_ind + 2] = c->blue();
    }
delete c;
}

void Processor::flush(QImage *image){

QColor* c = new QColor();
QRgb color;

int i, j;
int local_ind;

for( i = 0 ; i < y ; i++ )
    for( j = 0 ; j < x ; j++ ){

        local_ind = i * x + j * 3;
        color = qRgb(this->img[local_ind + 0],
                     this->img[local_ind + 1],
                     this->img[local_ind + 2]);

        image->setPixel(j, i, color);
    }

delete c;
}

デバッガーで確認できるように、両方の関数は正常に動作しているように見えますが、それらを次々に呼び出すと (QImage から配列に情報をコピーして逆方向にコピーするだけです)、結果は少し奇妙です。画像全体は、元の画像の 3 分の 1 (ソース画像の青、緑、赤のチャンネル) の 3 つの繰り返し画像で構成されます。setPixel を間違った方法で使用しただけだと思う​​ので、QImage の形式は観察されないか、うまくいきません。

ここで本当に重要な場合は、QImage RGB32 形式を使用します。

PS。私の英語で申し訳ありません、訂正は大歓迎です)

4

1 に答える 1

1

問題は、あなたが使用していることです

 local_ind = i * x + j * 3;

しかし、バッファでは各ピクセルが 3 バイトかかります。したがって、代わりに使用する必要があります

 ( i * x + j ) * 3

ところで:なぜx高さとy幅に使用しているのですか?これは直感的ではありません。

于 2013-02-12T10:03:15.640 に答える