无法通过setPixel正确填充QImage

时间:2013-02-11 22:11:41

标签: c++ qt qimage

我需要将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的格式或smth。

我使用QImage RGB32格式,如果它在这里真的很重要。

PS。对不起我的英文,欢迎更正)

1 个答案:

答案 0 :(得分:1)

问题是您正在使用

 local_ind = i * x + j * 3;

但在你的缓冲区中,每个像素占用3个字节。所以你需要使用

 ( i * x + j ) * 3

btw:你为什么使用x作为高度而y作为宽度?这不直观。