我有一个表示图像的浮点数组。(第一列)。 我想将QGraphicsSecene上的图像显示为QPixmap。为了做到这一点,我尝试使用QImage构造函数从我的数组创建一个新图像 - QImage(const uchar * data,int width,int height,Format format)。 我首先创建了一个新的unsigned char,并将原始数组中的每个值转换为新的unsigned char,然后尝试使用以下代码创建一个新图像:
unsigned char * data = new unsigned char[fres.length()];
for (int i =0; i < fres.length();i++)
data[i] = char(fres.dataPtr()[i]);
bcg = new QImage(data,fres.cols(),fres.rows(),1,QImage::Format_Mono);
问题是当我尝试以下列方式访问信息时:
bcg-&GT;像素(i,j)的;
我只获得值12345。 如何从数组中创建可视图像。 感谢
答案 0 :(得分:5)
这里有两个问题。
一,将float
转换为char
只会使float
四舍五入,因此0.3可以舍入为0,0.9可以舍入为1
。对于0..1的范围,char
将仅包含0或1。
要为char赋予全范围,请使用乘法:
data[i] = (unsigned char)(fres.dataPtr()[i] * 255);
(另外,你的演员表不正确。)
另一个问题是你的QImage::Format
不正确; Format_Mono
期望1BPP bitpacked 数据,而不是您期望的8BPP。有两种方法可以解决此问题:
// Build a colour table of grayscale
QByteArray data(fres.length());
for (int i = 0; i < fres.length(); ++i) {
data[i] = (unsigned char)(fres.dataPtr()[i] * 255);
}
QVector<QRgb> grayscale;
for (int i = 0; i < 256; ++i) {
grayscale.append(qRgb(i, i, i));
}
QImage image(data.constData(), fres.cols(), fres.rows(), QImage::Format_Index8);
image.setColorTable(grayscale);
// Use RGBA directly
QByteArray data(fres.length() * 4);
for (int i = 0, j = 0; i < fres.length(); ++i, j += 4) {
data[j] = data[j + 1] = data[j + 2] = // R, G, B
(unsigned char)(fres.dataPtr()[i] * 255);
data[j + 4] = ~0; // Alpha
}
QImage image(data.constData(), fres.cols(), fres.rows(), QImage::Format_ARGB32_Premultiplied);