Russian Qt Forum

Qt => Мультимедиа => Тема начата: Crazy Sage от Октябрь 17, 2012, 18:21



Название: Создание QPixmap из памяти
Отправлено: Crazy Sage от Октябрь 17, 2012, 18:21
Есть у меня прога получающая кадры с фотоаппарата и обрабатывающая их.
Раньше я сохранял изображения на диск, открывал, обрабатывал и снова сохранял.
Сейчас копирую изображение сразу в память, обрабатываю и сохраняю.
Передача с камеры не особо ускорилась, это понятно, там usb накладывает ограничения по скорости.
Но меня несколько удивляет, что для изображения в 6 мегабайт QPixmap::load() работает всего на 30% медленнее, чем QPixmap::loadFromData(). Это нормально?
И может есть способ использовать сразу QPixmap (ну или какой-нибудь другой класс для изображения) в качестве принимающего буфера для ускорения процесса?
С камеры идет jpeg, но высота и ширина заранее неизвестны (по крайней мере я не нашел как их получить).


Название: Re: Создание QPixmap из памяти
Отправлено: GreatSnake от Октябрь 17, 2012, 18:26
Для таких дел нужно использовать QImage.


Название: Re: Создание QPixmap из памяти
Отправлено: Crazy Sage от Октябрь 17, 2012, 18:48
При использовании операций loadFromData, transformed, scaledToWidth и save разницы между QPixmap и QImage в производительности замеры не показали.


Название: Re: Создание QPixmap из памяти
Отправлено: GreatSnake от Октябрь 17, 2012, 19:34
При использовании операций loadFromData, transformed, scaledToWidth и save разницы между QPixmap и QImage в производительности замеры не показали.
Не верю.


Название: Re: Создание QPixmap из памяти
Отправлено: Crazy Sage от Октябрь 17, 2012, 20:02
Ну я даже полную пересборку сделал под такое дело, но нет. Что с QPixmap, что с QImage на создание объекта из QByteArray размером ~6мегабайт уходит ~0.7 сек, на сохранение этого изображения на диск ~1 сек, поворот и изменение размера вместе занимают на порядок меньше времени, поэтому их производительность я не сравнивал.


Название: Re: Создание QPixmap из памяти
Отправлено: Igors от Октябрь 17, 2012, 20:10
Ну я даже полную пересборку сделал под такое дело, но нет. Что с QPixmap, что с QImage на создание объекта из QByteArray размером ~6мегабайт уходит ~0.7 сек, на сохранение этого изображения на диск ~1 сек, поворот и изменение размера вместе занимают на порядок меньше времени, поэтому их производительность я не сравнивал.
Ну сохранение = 1 сек выглядит реально учитывая что имедж нужно сжать. А вот создание = 0.7 сек - да  откуда? Выделение памяти и копирование - порядок ну никак не 0.7. Может нагружено чем-то еще?


Название: Re: Создание QPixmap из памяти
Отправлено: Crazy Sage от Октябрь 17, 2012, 20:16
Замер времени непосредственно перед, замер сразу после. Меня тоже удивляет, что так долго.
Вот код

Код:
EdsStreamRef stream = NULL;
//Функции получения информации о файле в фотоаппарате
EdsDirectoryItemInfo dirItemInfo;
EdsGetDirectoryItemInfo(directoryItem, & dirItemInfo);
QByteArray buf;
buf.resize(dirItemInfo.size);
//Создаем поток с буфером в QByteArray
EdsCreateMemoryStreamFromPointer(buf.data(),dirItemInfo.size, &stream);
//Копирование данных в буфер
EdsDownload( directoryItem, dirItemInfo.size, stream);
EdsDownloadComplete(directoryItem);
QImage pixmap;
//Замер времени 1
pixmap.loadFromData(buf);
//Замер времени 2


Название: Re: Создание QPixmap из памяти
Отправлено: Igors от Октябрь 17, 2012, 20:31
А, так это "распаковка" из исходного jpg (а не просто создание). Ну тогда разумное время. И это "не масштабируется" и не ускоряется.


Название: Re: Создание QPixmap из памяти
Отправлено: Crazy Sage от Октябрь 17, 2012, 20:32
Ок, именно это я и хотел узнать. Не ускоряется, значит не ускоряется :)