как создать новый QImage из массива с плавающей точкой - PullRequest
6 голосов
/ 31 июля 2010

У меня есть массив с плавающей точкой, представляющий изображение. (Столбец первый). Я хочу показать изображение на QGraphicsSecene как QPixmap. Для этого я попытался создать новое изображение из моего массива с помощью конструктора QImage - QImage (const uchar * data, int width, int height, Format format). Сначала я создал новый неподписанный символ и преобразовал каждое значение из моего исходного массива в новый неподписанный символ, а затем попытался создать новое изображение со следующим кодом:

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-> пикселей (I, J); * +1006 *

Я получаю только значение 12345. Как я могу создать видимое изображение из моего массива. Спасибо

1 Ответ

5 голосов
/ 02 августа 2010

Здесь есть две проблемы.

Один, приведение 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...