2015-05-21 2 views
0

У меня есть много изображений с привязками к США в формате png и tiff. Есть около 12, которые я хочу использовать. Каждое изображение составляет около 60 мб, а разрешение составляет около 18000 * 12000 пикселей. Я пытаюсь создать приложение форм Windows, которое загружает все изображения для создания карты. (ознакомьтесь с приведенной ниже ссылкой - top pic). Программа также имеет функцию масштабирования/панорамирования. Я пробовал загружать около 4 изображений, и приложение становится очень медленным, и оно даже срабатывает много раз. Поэтому я хочу знать, могу ли я использовать файлы с отображением памяти (или любым другим способом). То, что я хочу сделать, это загрузить только часть изображений, которые видны, а не все изображения. Когда вы увеличиваете или панорамируете, должна загружаться только видимая часть карты. Я хочу использовать для этого файлы с отображением памяти, но не знаю, с чего начать.Как работать с файлами с отображением памяти при загрузке нескольких больших изображений

What I am trying to create

+1

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

+0

О, хорошо. Итак, если я скажу 10 уровней масштабирования, тогда мне нужно будет разбить изображение на 10 разных. Поэтому я не использую файлы с отображением памяти правильно? Я могу просто сохранить изображения в списке. Но я думаю, что проблема все равно будет там, если кто-то масштабируется на всем пути –

+0

Нет, вы разбиваете изображение на 100 или 1000 на уровень масштабирования, но каждое изображение будет чем-то маленьким размером 200x200 пикселей. Затем вы загружаете в память 20 или около того фрагментов, которые находятся на экране, когда пользователь перемещает свой вид или меняет уровень масштабирования, вы отпускаете память на не показанные изображения и загружаете новые показанные. Посмотрите на google-карты, когда вы очень быстро уменьшаете масштаб, [вы можете увидеть метод стилизации, который я пытаюсь объяснить на работе] (http://i.stack.imgur.com/R5PNM.png). –

ответ

0

Наш разговор в сообщениях становится немного долго, так что я обращу это к ответу.

Не используйте файлы с отображением памяти, используйте картографическую систему с черепицей.

На данный момент я собираюсь разобраться с одним изображением 18000 * 12000, но вы можете расширить эту логику до нескольких изображений, которые у вас есть. Что вы собираетесь делать, так это вам нужно разбить его на более мелкие куски меньшего разрешения, чтобы показывать пользователю в данный момент времени.

Значит, у вас есть 3 уровня масштабирования 100%, 66% и 33%. 100% будет родным разрешением.

Таким образом, для 100% мы разбиваем изображение на более мелкие изображения 250x250px, так что теперь у вас есть 3,456 маленьких 250x250 изображений (72 изображения на 48 изображений вниз).

Для 66% вы используете либо другое исходное изображение для представления этого «уровня масштабирования» (например, вы можете не показывать небольшие дороги на карте), либо уменьшить размер исходного изображения. Предположим, вы уменьшили изображение, вы используете программу рисования, чтобы уменьшить разрешение исходного изображения до 12000x8000, мы снова сломаем изображение на более мелкие изображения размером 250x250 пикселей, так что теперь у вас есть 1536 маленьких 250x250 изображений (48 изображений на 32 изображения вниз).

Повторяем процесс снова на 33% ниже разрешения исходного изображения до 6000x4000, мы снова разбиваем изображение на более мелкие изображения размером 250x250 пикселей, так что теперь у вас есть 384 маленьких изображения 250x250 (24 изображения по 16 изображений вниз).

Итак, в вашей базе данных вы сохраняете 5 376 изображений, сгенерированных вами (3,456 + 1,536 + 384). Говорите, что у пользователя есть разрешаемое разрешение экрана 1920x1080, вы должны загрузить 40 из 250x250 фрагментов в памяти (8 изображений на 5 изображений вниз) для соответствующего уровня масштабирования и показать их на экране. Если ваш пользователь нажимает или меняет уровни масштабирования, загружает новые плитки, и вы позволяете старым фрагментам выгружать, поэтому вам нужно сохранить только 40 изображений 250x250 в памяти в любой момент времени.

+0

OK делает большой смысл. Некоторые вопросы: почему нам нужно уменьшать размер изображений? Я имею в виду, что мы будем разбивать изображения на 250x250 пикселей для всех уровней масштабирования. Кроме того, если у меня есть приложение winforms и визуальное окно (где показано на карте) составляет около 1000px x 500px, это будет разрешение экрана или фактическое разрешение монитора. В этом случае мне нужно будет показывать только 4x2 плитки для всех уровней масштабирования? –

+0

Мы разбиваем его на 250x250, поэтому каждое изображение не вызывает большой нагрузки при обработке. вы имеете дело с несколькими десятками изображений 1 кБ вместо 1 60 мб изображения. Что касается резолюции, да 4x2 будет звучать правильно. Просто fyi GMap.net должен делать всю логику отображения и сколько должно быть на экране для вас. –

+0

, когда я храню изображения в базе данных, какую информацию я должен хранить с ними. Как координаты xy изображений на карте? Также, когда вы извлекаете изображения из базы данных, как я могу узнать, какие из них нужно получить? Я имею в виду, мне нужно будет получить 8 изображений, но какие? –

0

Я собираюсь прокомментировать этот. Я сразу увидел красный флаг, когда ответ вошел в «уровни масштабирования». С точки зрения программиста это ленивый метод, который позволяет избежать обработки дополнительных изображений, но с точки зрения пользователя это довольно плохо, если они хотят непрерывного диапазона для масштабирования. Google делает это для скорости и пропускной способности, что отлично подходит для конкретного приложения. Ирония здесь, я пришел к этой теме, потому что у меня есть карта, уже разбитая на плитки (625 1009x1009!), Где все, что я хочу сделать, это панорама. Это боль, когда единственное решение даже не затрагивает оригинальный вопрос.

Редактировать: Если модератор видит это, пожалуйста, преобразуйте это в комментарий. Я не знаю, как это стало ответом.

+0

Что делать, если я хочу иметь только определенное количество уровней масштабирования? –

+0

Опять же, посмотрите название вашего вопроса. Речь идет о загрузке изображений с использованием сопоставления памяти. Если у вас есть только определенное количество уровней масштабирования, это еще одна проблема, и предлагаемое решение является правильным. Разумеется, «решение» вовсе не связано с вопросом. Он разбивается на «Не делайте этого, вместо этого используйте внешнюю программу для предварительной обработки изображения». Конечно, в теле вашего вопроса вы позволили. Но это отстой для тех, кто действительно ищет помощь по оригинальному вопросу. –