Постройте и нарисуйте большое изображение на Qt - PullRequest
2 голосов
/ 19 июля 2011

Моя программа создает изображение, используя сложные правила, а затем отображает его в QScrollArea.В настоящее время я делаю это следующим образом:

  • создать QImage
  • заполнить его с помощью QImage :: setPixel
  • добавить мой виджет (полученный из QWidget) в QScrollArea
  • определить paintEvent в виджете и использовать QPainter :: drawImage

Это самый простой способ отобразить сгенерированное изображение?

Теперь у меня проблема.Изображение может быть очень большим.QImage хранит данные в памяти и не может хранить большие изображения.Я хочу сохранить сгенерированное изображение на диске и быстро нарисовать любую его часть с любым увеличением.Как я могу это сделать?

Ответы [ 2 ]

3 голосов
/ 19 июля 2011

Возможно, вы захотите проверить в этой статье описание некоторых различий между QPixmap и QImage:

http://techbase.kde.org/Development/Tutorials/Graphics/Performance#QPixmap_vs._QImage

Если вы хотите быстро масштабировать очень большие изображения, для этого существует методология, называемая «Глубокое масштабирование» и «Масштабируемые пользовательские интерфейсы» (ZUI):

http://en.wikipedia.org/wiki/Deep_Zoom

QScrollArea не предназначен для этого из коробки. Я не знаю о реализации Qt, но лично я играл с открытым исходным кодом Flash под названием OpenZoom . Вы можете увидеть мои результаты:

http://hostilefork.com/2010/09/12/imagination-squared-plus-openzoom/

Было бы приятно увидеть, как кто-то решает эту проблему повторно для Qt.

1 голос
/ 19 июля 2011

самый простой способ отобразить сгенерированное изображение - присвоить его QLabel. Используйте QLabel::SetPixmap() вместо вашего собственного виджета.

Как бы я справился с этой задачей ...

Сначала создайте множество отдельных изображений с достаточно хорошим размером (1024x1024 или даже меньше).

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

для позиционирования в файле используйте простую справочную таблицу с полями типа xId yId offset length

Для быстрой работы с зумом - просто добавьте больше матриц - следующая должна быть в два раза меньше базовой и т. Д., Пока не останется одно изображение (для самого дальнего зума).

...