Qt: Сохранение изображения в предполагаемом формате сжатия

Я использую Qt и сохраняю файл изображения из элемента пользовательского интерфейса QML. Вот что я делаю

auto screenshot = quick_item->grabToImage();
screenshot->saveToFile("/somepath/filename.jpeg");
// OR sometimes use like png like
screenshot->saveToFile("/somepath/filename.png");

Это работает фантастически хорошо на всех платформах. Открываю файл изображение сохраняется как задумано.

Теперь мой вопрос:
Я только что упомянул .jpeg в качестве расширения файла, указав имя файла в качестве параметра в saveToFile. Это работает, но нужно ли мне использовать QImageWriter, чтобы убедиться, что изображение действительно сжато в формате jpeg/png?

Что происходит, когда это сжатие с потерями, такое как jpeg?
Как управлять сжатием с потерями, если я хочу, как в Android, я могу сделать image.compress(CompressFormat.JPEG, 80, stream), где 80 - это процент качества для сжатия ?


person TheWaterProgrammer    schedule 19.07.2017    source источник


Ответы (1)


Вы не можете сделать это напрямую из QQuickItemGrabResult, вы должны использовать QImage::save() для этого:

auto screenshot = quick_item->grabToImage();
auto image = screenshot->image();
image.save("/somepath/filename.jpeg", nullptr, 80);

Второй параметр сохранения — это формат, но его можно оставить нулевым и дальше угадывать по расширению имени файла, третий — качество сжатия.

Фактор качества не имеет значения, если вы используете формат без потерь, такой как png. Вы можете установить его на -1 (значение по умолчанию), опустить параметр или использовать коэффициент, который вы использовали бы для формата с потерями.

person GrecKo    schedule 19.07.2017
comment
ах здорово. мне нужно сделать это, если я также сохраняю формат без потерь, такой как png? это тоже было частью моего вопроса - person TheWaterProgrammer; 19.07.2017
comment
Похоже, что QImage::Format::, который я могу ввести вместо nullptr, имеет массу вариантов выбора формата? Что мне выбрать? Я сохраняю изображение, которое представляет собой цветное изображение со многими цветами, и я хочу, чтобы все цвета отображались как есть. - person TheWaterProgrammer; 19.07.2017
comment
@ HAL9000-Kernel Я отредактировал свой ответ. Также QImage::Format касается форматов изображений, а не форматов файлов, таких как jpeg или png. Изображение имеет формат изображения, который вам не нужно менять. Формат файла, который вы можете указать вместо nullptr, представляет собой название формата, например "PNG" или "JPEG", как описано здесь: doc.qt.io/qt-5/qimage.html#reading-and-writing-image-files - person GrecKo; 19.07.2017
comment
screenshot->saveToFile("/somepath/filename.png") также работает, как я сказал в своем вопросе. Я открываю сохраненный файл, и он содержит данные в порядке. Что я потеряю, если не буду следовать вашему способу получения изображения и вызвать его сохранение при использовании .png в качестве расширения файла? - person TheWaterProgrammer; 19.07.2017
comment
Ничего. screenshot->saveToFile("/somepath/filename.png") делает то же самое, что и screenshot->image().save("/somepath/filename.png"). Формат файла не нужен, так как его можно угадать по расширению png, а фактор качества бесполезен, так как он без потерь. - person GrecKo; 19.07.2017