我需要将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。对不起,我的英语,欢迎改正)

最佳答案

问题是您正在使用

 local_ind = i * x + j * 3;


但是在缓冲区中,每个像素占用3个字节。因此,您需要使用

 ( i * x + j ) * 3


顺便说一句:为什么要使用x表示高度,使用y表示宽度?这不是直观的。

关于c++ - 不能通过setPixel正确填充QImage,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14821878/

10-13 07:07