Созаю миниатюры изображений:
QImage im;
im.load(filename);
im = im.scaled(icoWidth, icoHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
im.save( filename_s, "JPG", 95);
QImage im;
im.load(filename);
im = im.scaled(icoWidth, icoHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
im.save( filename_s, "JPG", 95);
QImage im;
im.load(filename);
im = im.scaled(icoWidth, icoHeight, Qt::KeepAspectRatio, Qt::SmoothTransformation);
im.save( filename_s, "JPG", 95);
Тогда нужно использовать конкретные библиотеки для чтения файлов графических форматов, например в JPEG могут хранится миниатюры, но не всегда они есть, поэтому придется загружать файл целиком (в случае когда нет миниатюры в файле). Это сэкономит время лишь в ряде случаев и не для всех типов форматов.
Если время создания миниатюр критично (например известно что они должны создаваться в основном для файлов фоток, в них как правило хранятся миниатюры) то используй libJPEG библиотеку для работы с jpeg'ом. в api libjpeg есть функции по загрузке миниатюр. Есть более общая либа, freeImage, она объединяет в себе несколько библиотек для чтения нескольких форматов файлов, на сколько универсально ее api не могу сказать, в моих проектах используются конкретные библиотеки для конкретных форматов.
Медленно - это сколько?
У меня на не новом ноуте, чтение изображение из тегов .flac и сжатие до 200pix, происходит практически мгновенно.
Можно покрутить сторонние библиотеки. Тот же openCV, imagemagic. Но у них тоже все упирается во время загрузки изображения. Это скорее от железа зависит.
Ну я же говорю, что в 2-3 раза медленне нежели в других просмотрщиках.
Есть идея использовать QIcon:
QImage im;
QIcon ico;
QSize size(200, 200);
ico.addFile(MainWindow::currentDir + MainWindow::listImage.at(i), size);
im = ico.pixmap(size).toImage();
im.save( MainWindow::currentDir + ".prev/" + MainWindow::listName.at(i), "JPG", 95);
http://www.google.com.ua/search?aq=f&sourceid=chrome&client=ubuntu&channel=cs&ie=UTF-8&q=QIcon+to+QImage
нельзя использовать QPixmap вне guithread , соответственно подходит только QImage.
в 2-3 раза медленнее с чем сравниваешь и на каких форматах изображения?
я писал нечто подобное, Image browser, он генерит представление thumbnail'ов работает не медленнее чем IrfanView. в Gui поток приходят миниатюры, дальше отправляются в QGraphicsView представление.
но там для чтения миниатюр из jpeg используется libJPEG. Поскольку они оч мало занимают, то загружаются практически мгновенно....
к сожалению код показать не имею права, но подсказать кое что могу. 18 мпикс фотки формат jpeg? какие либы в составе Gwenview.
есть еще одна особенность открытия миниатюр например в стандартном виндовом браузере
Он тоже как бы мгновенно открывает миниатюры, но нужно не забывать что первый раз на создание кеша этих миниатюр у виндов тоже уходит заметное время.
Image browser, это компонент в разрабатываемой совтине, аналог Browse in bridge в Photoshop. но надо сказать там заметное время тратится на открытие больших картинок. Хотя они используют не Qt движок.
попробуй вырезать thumbnail из тестовых фоток и скормить Gwenview. Посмотри насколько быстро у них это получится для сравнения. QImage всегда зачитывают весь файл, вроде в мобильной версии Qt были какие то классы связанные с получением thumbnail'ов, но они не доступны для PC версии
Проблема решена.
Может кому то пригодится:
int icoWidth = 200;
int icoHeight = 200;
QImageReader imageReader(MainWindow::currentDir + MainWindow::listImage.at(i));
QSize size;
int image_width;
int image_height;
if (imageReader.supportsOption(QImageIOHandler::Size))
{
size = imageReader.size();
image_width = size.width();
image_height = size.height();
}
double ratio = (double)image_width / (double)image_height;
if (ratio >= 1)
{
image_width = icoWidth;
image_height = image_width / ratio;
}
else
{
image_height = icoHeight;
image_width = image_height * ratio;
}
imageReader.setScaledSize(QSize(image_width, image_height));
QImage image = imageReader.read();
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)