Arrow23. April 2017 08:50
Масштабирование изображения с сохранением качества
Вопрос в следующем масштабирую изображение при помощи:
label->setPixmap(pixm.scaledToWidth(ui->scrollArea->width() ));
Как выяснилось изображение теряет в качестве и текст на отсканированных страницах становится сложно читаемым.
Отсюда возник вопрос каким образом можно отмасштабировать изображение по ширине при этом не повредив его читаемость (качество)?
Как один из вариантов рассматриваю:
QTransform transform; scaleFactor = img.weidth / ui->scrolarea->width; transform.scale(img.height * scaleFactor, img.weidth * scaleFactor); QImage image = img.transformed(transform, Qt::SmoothTransformation);
Или есть еще более подходящие для этой цели варианты?
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.Magst du es? In sozialen Netzwerken teilen!
Kommentare
sf
- sdfsdfkp fgskpgokspdog
- 14. Oktober 2024 15:09
C++ - Тест 004. Указатели, Массивы и Циклы
- Ergebnis:90punkte,
- Bewertungspunkte8
МВ
- Максим Васильев
- 2. Oktober 2024 04:14
Qt - Тест 001. Сигналы и слоты
- Ergebnis:68punkte,
- Bewertungspunkte-1
ЛС
- Лев Семенов
- 30. September 2024 11:04
C++ - Тест 001. Первая программа и типы данных
- Ergebnis:53punkte,
- Bewertungspunkte-4
Letzte Kommentare
Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
Игорь Максимов5. Oktober 2024 07:51
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Анатолий Кононенко5. Februar 2024 01:50
Jetzt im Forum diskutieren
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
ИМ
Реализация навигации по разделам Спасибо Евгений!
Игорь Максимов3. Oktober 2024 04:05
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
Кирилл Гусарев27. September 2024 09:09
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
Я тут поинтереснее решение нашёл. Без использования QPixmap::scaledToWidth . Если настроить QLabel на возможность масштабировать контент внутри себя, то можно просто изменять размеры QLabel, и контент будет тогда сам масштабироваться, причём потери качества я не заметил.
То есть не нужно подготавливать QPixmap по ширине, а сразу выкидываем его в сторону лейаута, и добавляем его внутри QLabel, который уже сам масштабируется по ширине layout. То есть сигнал по добавлению картинки выглядит ещё проще:
А QLabel настраивается немного посложнее:
Также я добавил возможность зума, чтобы показать, что качество изображения не изменяется при зуммировании.
Таким образом получается довольно таки приличный вариант с приближением и отдалением изображений. Проект тот же, что и в предыдущем вопросе. Прикрепил к ответу. Отличается тем, что я добавил кнопки для масштабирования.
Что-то я не пойму. Создал новый проект и туда пишу:
Изображение меленькое по центру, а не растянуто по ширине. Я что-то упустил важное?
Скорее всего параметры геометрии коряво определяются. Если открыть окно, а потом растянуть его, то при загрузке изображения, это самое изображение масштабируется по той ширине verticalLayout , которая была изначально при открытии окна. Так что стоит похоже, как-то иначе найти необходимую ширину.
Например заменить эту строчку:
На следующую:
То есть оттолкнуться не от ширины verticalLayout, а от scrollarea. Видимо размеры verticalLayout не изменяются при масштабировании окна, когда он помещён в scrollarea.
Не помогает.
А чем вариант через QTransform плох?
Если не помогает, может что-нибудь настроили такого в графическом дизайнере из-за чего не хочет работать как положено. Впрочем, может сказываться различное поведение в операционных системах. Под какую ОС разработку сейчас ведёте? Я под Ubuntu проверял.
Насчёт QTransform ничего не скажу, не проверял ))) Мне вариант с масштабированием QLabel показался попроще сам по себе. Это чисто субъективное ощущение. Впрочем, нужно просто QTransform рассмотреть под лупой, тогда смогу высказать более адекватное мнение.
Во вложении мой вариант вашей попытки проверки масштабирования с QLabel.
Пробовал в ОС Windows 7. Перепроверил в Debian Jessie - результат то-же. Буду копать визуальный редактор.
Тестирую на таком собранном проекте.
Картинку на ClientForm нужно добавлять после того, как добавили объект ClientForm в Tab, а не до этого. Нужно сначала поместить форму в Таб, тогда она примет размеры окна, а потом уже добавлять картинку. А то так добавили картинку в объект, который имеет мизерные размеры, а потом уже добавили этот объект в Таб, который растянулся во время добавления, а картинка в данном случае остаётся того же размера, что и была изначально.
В общем так не правильно:
А так правильно:
Спасибо!
Я на это как-то и внимания не обратил.
Все работает.
Хотел задать еще один вопрос, только уже не по теме.
У меня в исходном коде (приложенном в сообщении выше) главное меню программы реализовано наследованием от класса QMenuBar и описано в ручную (класс MainMenu).
Представление реализовано как виджет (класс ClientForm) в визуальном редакторе.
Отсюда вопрос:
Есть ли в Qt Creator возможность реализовать главное меню программы отдельным классом как MainMenu, только при помощи визуального редактора (типа класса ClientForm)? Или TollBar реализовать в отдельном классе, но в визуальном редакторе?
Хочется все это вынести в отдельные файлы (классы) и работать с ними через сигналы и слоты, а класс главного окна сделать контейнером для всего этого. Скажем так - максимально отделить интерфейс программы от реализации.
Извините если с вопросом сильно намудрил :)
В Qt Creator, когда выбираете пункт Добавить новый... из контекстного меню проекта, можете выбрать добавить класс формы Qt Designer, и там есть список не только окон, которые можно создать в дизайнере, но и список виджетов. Так вот классов QMenuBar и QToolBar я там не нашёл. Так что, думаю, что вряд ли такое возможно.
Такого я там тоже не видел. Думал есть другой путь о котором не знаю или которого у меня нет в дизайнере (у меня раздел моделирование пуст).
Да я не про моделирование говорил, а про раздел Qt . Не думаю, что есть какой-то специальный способ. Только если самому плагин соответствующий написать, но это опять же придётся код писать.
Плагин писать это уже думаю лишнее.