我需要将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/