![]() |
|
Модераторы: Snowy, Alexeis, MetalFan |
![]()
|
|
| Vitaly333 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 6.11.2006 Где: Volgograd Репутация: нет Всего: 2 |
При размещении на компоненте Image больших изображений (20000X20000 и больше) выдаёт исключение что не хватает памяти. Поменял формат пикселя на pf4bit проблема ушла , но всё равно при изображениях (>30000) всё равно вылетает исключения.
Может есть другой компонент (например PaintBox или спец.) под который отведено больше памяти или может можно изменить память , выделяемую под картинку Image? |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
А вы посчитайте размер памяти необходимый для ее хранения. У меня вышло 1,11 Гб непрерывного адресного пространства. Фрагмент такого размера как правило отсутствует на любой машине. Просто функция new не способна выделить такой фрагмент. Советую вам копать в сторону файлов отображаемых в память. Т.е. на диске можно хоть 4Тб, но отображать в память прийдется небольшими фрагментами, по 500Мб.
Добавлено @ 19:51 PaintBox ничего не хранит, а только рисует на своей поверхности. Ограничение это системное, потому надо искать специфические компоненты (либо писать свои). Но в любом случае вы наткнетесь на ограничение по размерам одного буфера. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 6 Всего: 27 |
А для чего тебе хранить такой Image? Может придумаем другой способ...
|
|||
|
||||
| Vitaly333 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 6.11.2006 Где: Volgograd Репутация: нет Всего: 2 |
Нужно рисовать и масштабировать лабиринт большого размера (2000X2000 клеток). Каждая клетка имеет размер 20X20. Т.е получается изображение 40000X40000, под которое естественно не хватает памяти. |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 18 Всего: 484 |
Решение изначально выбрано неверно
Тебе не нужен такой имадж. Тебе нужно рисовать то, что видно, а не всё и сразу да ещё разрешением в N мониторов. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Тогда вообще ну нужно всего лабиринта! Любой его фрагмент можно составить из стандартных частей 20х20 просто рисовать их на канве. Как из кубиков собирать домик. Каждый раз новый для текущего экрана. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 6 Всего: 27 |
А если попробовать так:
1. Можно создать матрицу 2000х2000 типа byte (она займёт 4Мб оперативы). 2. Заполнить её след. образом: 1 - стена, 0 - нет стены. 3. Установим "камеру" (коей является экран) в точку 0,0 (т.е. х=0, у=0) 4. Если размер ячейки, как ты сказал, 20х20, то обзор камеры будет составлять 51х38 при разрешении экрана 1024х768 (w := 1024/20 = 51, h := 768/20 = 38). Если необходимо выводить не на весь экран, то обзор камеры равен: w := Width/20, h := Height/20; 5. Выводим на экран ячейки с х+0 до х+51 и с у+0 до у+38, где х,у -координаты "камеры". Выводить можно путем блиттинга куска стены на Image: for i := 0 to h-1 do for j := 0 to w-1 do begin BitBlt(Form1.Image1.Picture.Bitmap.Canvas, j*20, i*20, 20, 20, Form2.Image1.Picture.Bitmap.Canvas, XSrc, YSrc, SRCCOPY); end; Сдесь XSrc и YSrс - координаты куска стены в Form2.Image1. Их можно вычислить так: XSrc := Matr[x+j,y+i]*20; // х,у - координаты камеры в матрице YScr := 0; Т.е. битмап содержит элементы лабиринта, нарисованные в строку (По этому YSrc всегда равен 0) с интервалом 20 пикселей. Это сообщение отредактировал(а) Bitter - 7.11.2006, 19:18 |
|||
|
||||
| Vitaly333 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 6.11.2006 Где: Volgograd Репутация: нет Всего: 2 |
Все понял. Спасибо.
|
|||
|
||||
![]()
|
| Правила форума "Delphi: Звук, графика и видео" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |