QImage (или изображения в целом) преобразование в 3 1D массива для RGB - PullRequest
1 голос
/ 09 июня 2011

Функция, которой я пытаюсь соответствовать, требует трех одномерных массивов типа double [19200]. Следующие массивы - это RGB-массивы, такие что:

double r[19200]; // r
double g[19200]; // g
double b[19200]; // b

Пока что я могу извлекать информацию о пикселях из QImage и заполнять вышеуказанные массивы.

Проблема с тестированием. Я не знаю, как сделать обратное: с учетом трех одномерных массивов, как мне создать новый QImage из этих данных?

Я хотел бы убедиться, что я действительно получаю правильные значения. (Такие вещи, как порядок столбцов и строк, вызывают у меня сомнения). В результате я пытаюсь создать изображение QImage из этих трех одномерных массивов.

Ответы [ 2 ]

2 голосов
/ 09 июня 2011

Я не очень понимаю, почему у вас возникла проблема, если вам удалось сделать это одним способом.Процесс в основном такой же:

for (int x=0; x<w; x++)
  for (int y=0; y<h; y++)
     image.setPixel(x,y, convertToRGB(r[x*w+y], ...);

Где convertToRGB - обратное преобразование того, что вы хотите преобразовать, и RGB-значения в значения с плавающей точкой, предполагая, что изображение имеет размерность w*h.Если вы обнаружите, что это неправильный основной мажор строки / столбца, просто инвертируйте его.

Поскольку вы не дали никакой информации о том, как вы выполняете преобразование цветового пространства, и мы не знаем, является ли он мажорной строкойили столбец майор, не может помочь вам гораздо больше.

1 голос
/ 09 июня 2011

Похоже, QImage поддерживает несколько способов загрузки из пиксельных массивов.

QImage(const uchar *data, int width, int height, Format format)
bool QImage::loadFromData(const uchar *buf, int len, const char *format=0)

Используя первый пример, если у вас есть массивы, которые вы упомянули, то вы, вероятно, захотите использовать формат QImage :: Format_RGB888 (из qimage.h).

Вам нужно знать ширину и высоту самостоятельно.

Наконец, вы захотите упаковать ваши массивы в один массив uchar *

uchar* rgb_array = new uchar[19200+19200+19200];

for( int i = 0, j = 0; j < 19200; ++j )
{
    // here we convert from the double range 0..1 to the integer range 0..255
    rgb_array[i++] = r[j] * 255;
    rgb_array[i++] = g[j] * 255;
    rgb_array[i++] = b[j] * 255;
}

{
    QImage my_image( rgb_array, width, height, QImage::Format_RGB888 );

    // do stuff with my_image...
}

delete[] rgb_array; // note you need to hold onto this array while the image still exists
...