Здесь есть две проблемы.
Один, приведение float
к char
просто округляет float
, поэтому 0,3 можно округлить до 0, а 0,9 можно округлить до 1
,Для диапазона 0..1, char
будет содержать только 0 или 1.
Чтобы дать символу полный диапазон, используйте умножение:
data[i] = (unsigned char)(fres.dataPtr()[i] * 255);
(Также,ваш каст был неверным.)
Другая проблема в том, что ваш 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);
// 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);