繁体   English   中英

在Qt中显示QImage的灰度和大小

[英]Displaying and sizing a grayscale from a QImage in Qt

我能够使用以下内容在Qt中的标签中显示图像:

transformPixels(0,0,1,imheight,imwidth,1);//sets unsigned char** imageData

unsigned char* fullCharArray = new unsigned char[imheight * imwidth];
     for (int i = 0 ; i < imheight ; i++)
         for (int j = 0 ; j < imwidth ; j++)
                fullCharArray[(i*imwidth)+j] = imageData[i][j];

QImage *qi = new QImage(fullCharArray, imwidth, imheight, QImage::Format_RGB32);

ui->viewLabel->setPixmap(QPixmap::fromImage(*qi,Qt::AutoColor));

所以fullCharArray是一个已经从2D数组imageData映射的无符号字符数组,换句话说,它是imighight * imwidth字节。

问题是,似乎我的图像中只有一部分显示在标签中。 图像非常大。 我希望显示完整的图像,按比例缩小以适应标签,并保留纵横比。

另外,那个QImage格式是我能找到的唯一一个似乎能让我近距离展示我想要展示的图像的格式,这是我应该期待的吗? 我只使用每个像素一个字节(无符号字符 - 从0到255的值),似乎谎言RGB32对该数据类型没有多大意义,但没有其他任何显示任何远程正确

编辑:关于dan gallaghers的建议,我实现了这段代码:

QImage *qi = new QImage(fullCharArray, imwidth, imheight, QImage::Format_RGB32);
int labelWidth = ui->viewLabel->width();
int labelHeight = ui->viewLabel->height();

QImage small = qi->scaled(labelWidth, labelHeight,Qt::KeepAspectRatio);
ui->viewLabel->setPixmap(QPixmap::fromImage(small,Qt::AutoColor));

但这导致我的程序“意外地完成”代码0

Qt不直接支持灰度图像构造。 您需要使用8位索引彩色图像:

QImage * qi = new QImage(imageData, imwidth, imheight, QImage::Format_Indexed8);
for(int i=0;i<256;++i) {
    qi->setColor(i, qRgb(i,i,i));
}

QImage有一个scaled成员。 因此,您希望将setPixmap调用更改为:

QImage small = qi->scaled(labelWidth, labelHeight, Qt::KeepAspectRatio);
ui->viewLabel->setPixmap(QPixmap::fromImage(small, Qt::AutoColor);

注意, scaled不会修改原始图像qi ; 它返回一个新的QImage ,它是原始的缩放副本。

重新编辑:

要将1字节灰度转换为4字节RGB灰度:

 QImage qi = new QImage(imwidth, imheight, QImage::Format_RGB32);
 for (int i = 0; i < imheight; i++)
 {
     for (int j = 0; j < imwidth; j++)
     {
         qi->setPixel(i, j, QRgb(imageData[i][j], imageData[i][j], imageData[i][j]));
     }
 }

然后缩放qi并使用缩放副本作为viewLabel的像素图。

我也遇到过类似的问题 - QImage :: scaled返回黑色图像。 在我的案例中,快速解决方法是将QImage转换为QPixmap,然后进行缩放和转换。 像这样:

QImage resultImg = QPixmap::fromImage(image)
  .scaled( 400, 400, Qt::KeepAspectRatio )
  .toImage();

其中“图像”是原始图像。 在阅读这个帖子之前我没有意识到格式问题 - 但实际上,我的图像是1位黑白色。

此致,Valentin Heinitz

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM