Не могу правильно заполнить 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. Извините за мой английский, поправки приветствуются)


person Roman    schedule 11.02.2013    source источник
comment
Знаете ли вы, что QImage уже имеет эту функцию? QImage ( uchar * data, int width, int height, Format format ) и const uchar * QImage::constBits () const   -  person kfunk    schedule 12.02.2013
comment
Я сейчас. Большое спасибо. Я попробую позже и посмотрю, действительно ли это то, что мне нужно. Но все-таки почему я получаю описанный мною результат? Просто из любопытства.   -  person Roman    schedule 12.02.2013


Ответы (1)


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

 local_ind = i * x + j * 3;

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

 ( i * x + j ) * 3

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

person UmNyobe    schedule 12.02.2013
comment
Спасибо. - Почему вы используете x для высоты и y для ширины? Думаю, мне нужно выспаться) - person Roman; 13.02.2013