Черепица большого QGraphicsItem в QGraphicsView - PullRequest
3 голосов
/ 10 июня 2011

В настоящее время я использую QGraphicsItem, в который загружаю растровое изображение для отображения некоторых растровых данных.В настоящее время я не делаю никаких листов или чего-либо в этом роде, но я переопределил свой QGraphicsItem, чтобы я мог реализовать такие функции, как масштабирование под мышью, отслеживание пикселя, над которым я нахожу курсор, и т. Д. И т. Д.Размер диска составляет 1 - 2 ГБ, и я хотел бы найти более оптимальный способ их отображения.Для начала - кажется, что я мог бы отобразить их все сразу, если бы захотел - потому что QImage, который я использую (Qpixmap-> QImage-> QgraphicsItem), похоже, не работает при любом индексе пикселей более 32, ххх (16 бит).

Итак, как мне реализовать мозаику здесь, если я хочу поддерживать использование одного QGraphicsItem?Я не думаю, что я хочу использовать несколько QGraphicsItems, чтобы сохранить отображаемые данные + соседние данные "о", которые будут отображаться.Это потребовало бы, чтобы я масштабировал их все, когда человек размышлял и пытался масштабировать одну плитку, и таким образом заставлял меня также перемещать все, правильно?Я предполагаю, что это также потребует некоторых знаний о том, какие данные точно получить из файла.

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

Я посмотрел на чип 40000демо, но я не уверен, что это то, что мне нужно - похоже, что он по-прежнему отображает все фишки, как вы обычно делаете в сцене, просто переопределил метод рисования, чтобы обеспечить меньший уровень детализации ... или ячто-то пропустить в этой демонстрации?

1 Ответ

0 голосов
/ 10 июня 2011

Не удивительно, что будет трудно обрабатывать изображения такого размера. Qt просто не предназначен для этого, и, возможно, существуют другие факторы, связанные с конкретной ОС и, возможно, способом управления памятью.

Вы очень явно нуждаетесь (или, по крайней мере, должны использовать) механизм листов. Ваша главная проблема заключается в том, что вам нужен способ доступа к данным изображения, который не требует использования QImage (или QPixmap) для загрузки всего объекта и обеспечения доступа к данным изображения, поскольку уже было определено, что это не удается .

Вам нужно будет либо найти метод (библиотеку), который может загрузить все изображение в память и позволить извлечь из него области данных изображения, либо загрузить только определенный регион из файла на диске. Вам также понадобится возможность изменять размеры очень больших областей для уменьшения разреза при попытке «уменьшить» любую часть изображения. К сожалению, я никогда не занимался обработкой изображений подобным образом, поэтому не знаю, какие опции библиотеки доступны, Qt, скорее всего, не сможет помочь вам напрямую с этим.

Однако вы можете изучить один из вариантов - использовать пакет для редактирования изображений, чтобы разбить ваше большое изображение на более управляемые куски. Тогда, возможно, подойдет QGraphicsView решение, похожее на демонстрационную версию чипа.

...