Russian Qt Forum
Май 08, 2024, 19:19 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: как лучше преобразовать массив в изображение?  (Прочитано 13996 раз)
Sahsa
Гость
« : Сентябрь 02, 2015, 21:35 »

Есть массив типа float. Нужно на выходе получить изображения QImage и в дальнейшем изменять палитру полученного изображения.
Записан
Bepec
Гость
« Ответ #1 : Сентябрь 03, 2015, 00:20 »

Ххы построение из произвольного массива изображения? Круто Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Сентябрь 03, 2015, 10:50 »

Есть массив типа float. Нужно на выходе получить изображения QImage и в дальнейшем изменять палитру полученного изображения.
Ну должны быть какие-то соглашения, доп информация, напр сколько точек в строке, сколько строк и  сколько float на точку. Тогда просто создаете QImage нужного размера и переводите по точкам, см QImage::bits. Палитра - я бы с ней не связывался, создал бы QImage::Format_ARGB32 и при изменении цвета опять бы переводил из исходных float.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #3 : Сентябрь 03, 2015, 11:05 »

А что определяет каждый элемент типа флоат? Цвет? Высоту? Напряжение? Каким образом должен формироваться цветовой компонент каждой точки?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Sahsa
Гость
« Ответ #4 : Сентябрь 03, 2015, 15:01 »

А что определяет каждый элемент типа флоат? Цвет? Высоту? Напряжение? Каким образом должен формироваться цветовой компонент каждой точки?

Каждый элемент задаёт значение датчика на определённой глубине(временном отрезке).
Изображения, это как один из вида представления снятых показаний.
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #5 : Сентябрь 03, 2015, 15:03 »

Каждый элемент задаёт значение датчика на определённой глубине(временном отрезке).
Изображения, это как один из вида представления снятых показаний.
Вы напишите, как это число должно быть преобразовано в цвет.
Вот число 100 - это какой цвет, а 200?
Записан
Sahsa
Гость
« Ответ #6 : Сентябрь 03, 2015, 15:06 »

Есть массив типа float. Нужно на выходе получить изображения QImage и в дальнейшем изменять палитру полученного изображения.
Ну должны быть какие-то соглашения, доп информация, напр сколько точек в строке, сколько строк и  сколько float на точку. Тогда просто создаете QImage нужного размера и переводите по точкам, см QImage::bits. Палитра - я бы с ней не связывался, создал бы QImage::Format_ARGB32 и при изменении цвета опять бы переводил из исходных float.


Это порядка 700-800 столбцов и 1500 и больше строк. На каждую точку одно значения float.

А перерисовка изображения не будет в данном виде занимать много времени, так как при изменении палитры это происходит гораздо быстрее.
Записан
Sahsa
Гость
« Ответ #7 : Сентябрь 03, 2015, 15:09 »

Каждый элемент задаёт значение датчика на определённой глубине(временном отрезке).
Изображения, это как один из вида представления снятых показаний.
Вы напишите, как это число должно быть преобразовано в цвет.
Вот число 100 - это какой цвет, а 200?

Создаётся палитра из 256 цветов. В зависимости минимального и максимального значения из массива составляется пропорция для отображения определённых значений, определённым цветом.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #8 : Сентябрь 03, 2015, 15:13 »

Ну, карта высот, в общем)
Дык, а затруднение в чем возникает? У QImage есть метод scanLine, который возвращает поинтер на линию в изображении. Это просто набор байт согласно формату, в котором был создан QImage. Просто проходите высоту в цикле по i и получаете каждую строку через image.scanLine(i). Ну и соответвенно идете по строке от начала до конца и пишите туда цветовые значения, преобразовав float в нужное число.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #9 : Сентябрь 03, 2015, 15:14 »

Создаётся палитра из 256 цветов. В зависимости минимального и максимального значения из массива составляется пропорция для отображения определённых значений, определённым цветом.
Тогда, вам нужно каждый float преобразовать в uchar, минимальное значение float это 0, максимальное - 255.
Создаете QImage нужного размера с форматом QImage::Format_Indexed8 с полученными данными.
Устанавливаете вашу палитру через: void QImage::setColorTable(const QVector<QRgb> & colors).
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Сентябрь 03, 2015, 18:12 »

А перерисовка изображения не будет в данном виде занимать много времени, так как при изменении палитры это происходит гораздо быстрее.
Вряд ли, так или иначе в видеобуфер надо поместить 4 байта на точку. И нет уверенности что c Indexed8 это сильно (или вообще) быстрее. С др стороны отсекаются возможности которые могут пригодиться - ну напр показать "зашкаливающие" значения др цветом.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #11 : Сентябрь 03, 2015, 18:44 »

Ну, у нас карта высот подобного размера в 3д в реальном времени строится и норм... А с QImage вообще не вижу причин для торможения.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Sahsa
Гость
« Ответ #12 : Сентябрь 03, 2015, 22:25 »

Ну, карта высот, в общем)
Дык, а затруднение в чем возникает? У QImage есть метод scanLine, который возвращает поинтер на линию в изображении. Это просто набор байт согласно формату, в котором был создан QImage. Просто проходите высоту в цикле по i и получаете каждую строку через image.scanLine(i). Ну и соответвенно идете по строке от начала до конца и пишите туда цветовые значения, преобразовав float в нужное число.

на данный момент существует следующая проблема.

после формирование изображения, вылетает ошибка доступа на сохранении. Но при формировании тестовой 256*20 все происходит нормально. Размер 689*1500.
Вот код, может что-то не так(

QImage img(im, m_iTraceCount, m_iDiscreteCount, QImage::Format_Indexed8);
QVector<QRgb> palette;
for (int i = 0; i < 256; i++)
   palette.append(qRgb(i, i / 4, 255 - i));
img.setColorTable(palette);
img.save("test.jpg", "JPG");
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #13 : Сентябрь 04, 2015, 06:12 »

Как описан и как формируется im?
Записан
Sahsa
Гость
« Ответ #14 : Сентябрь 04, 2015, 07:11 »

Как описан и как формируется im?

Это массив uchar размерностью [m_iDiscreteCount * m_iTraceCount]
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 23.