如何从浮点数组创建一个新的QImage

boa*_*hor 6 qt image

我有一个代表图像的浮点数组.(第一列).我想将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);
Run Code Online (Sandbox Code Playgroud)

问题是当我尝试以下列方式访问信息时:

bcg->像素(i,j)的;

我只得到值12345.如何从数组中创建可视图像.谢谢

str*_*ger 5

这里有两个问题.

一,将a转换float为a char简单地float舍入,因此0.3可以舍入为0而0.9可以舍入到1.对于0..1的范围,char将仅包含0或1.

要为char提供全范围,请使用乘法:

data[i] = (unsigned char)(fres.dataPtr()[i] * 255);
Run Code Online (Sandbox Code Playgroud)

(另外,你的演员阵容不正确.)

另一个问题是你QImage::Format的不正确; Format_Mono期望1BPP比特数据,而不是你期望的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);
Run Code Online (Sandbox Code Playgroud)


// 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);
Run Code Online (Sandbox Code Playgroud)