Не могу правильно заполнить QImage через setPixel

Мне нужно преобразовать QImage в массив, где каждый пиксель представлен тремя целыми числами (каналами). Поэтому я пытаюсь достичь этого с помощью следующего кода:

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 в массив и обратно), результат немного странный. Целое изображение состоит из трех повторяющихся изображений: треть исходного изображения (синий, зеленый и красный каналы исходного изображения). Я думаю, что я просто использовал setPixel неправильно, поэтому формат QImage не наблюдается или что-то в этом роде.

Я использую формат QImage RGB32, если это действительно важно здесь.

PS. Извините за мой английский, исправления приветствуются)

1 ответ

Решение

Проблема в том, что вы используете

 local_ind = i * x + j * 3;

Но в вашем буфере каждый пиксель занимает 3 байта. Так что вам нужно использовать вместо

 ( i * x + j ) * 3

кстати: почему вы используете x для высоты и y по ширине? Это не интуитивно понятно.

Другие вопросы по тегам