Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как выводить огромную картинку на экран. [D6, D7, Win95/98, Win2k, WinXP]


Destiny ©   (2004-09-14 22:39:00) 

Стоит задача: вывод огромного изображения на экран с максимальным быстродействием и минимальными затратами памяти.
Все изображение загружать в image нельзя ввиду больших затрат памяти, да и ограничение на размер используемой памяти в 1.4G, по-моему не обойти, даже если DIBSection делать.
Как грузить части изображения из файла? И как оптимизировать загрузку этих частей, чтобы изображение при перемещении не подтормаживало.
Требуется осуществлять Scroll & Drag.
Спасибо.
P.S. Может подскажите ссылки на ресурсы, где можно посмотреть.


Amoeba   (2004-09-16 12:15:00) [1]


> Destiny ©   (15.09.04 19:14) [12]

Там даже есть готовый код.


Destiny   (2004-09-15 19:14:00) [2]

Привет, всем!
Спасибо огромное за ответы, сейчас буду читать материал из ссылки.


DiamondShark   (2004-09-15 11:16:00) [3]


> Если ты файл размерм в 2Gb спроецируешь в ВАП, то из всего
> ВАП сколько останется свобоного места?

Проецировать можно кусками.


Defunct   (2004-09-15 11:02:00) [4]

> Прочитай внимательнее главку из книжки, на которую дана ссылка.

Беру свои слова [7] назад. ;)


Verg   (2004-09-15 11:00:00) [5]


> Сам в свое время пользовался приведенным там кодом для просмотра
> картинок из файлов BMP намного больших, чем достомный объем
> памяти.


Прекрасно, а каков доступный объем ВАП (Виртуального Адресного Пространства), проецирование в которое и происходит? И судя из той главы - происходит целиком.
Если ты файл размерм в 2Gb спроецируешь в ВАП, то из всего ВАП сколько останется свобоного места?


Amoeba   (2004-09-15 10:37:00) [6]


> Defunct ©   (15.09.04 10:31) [7]

Ничего подобного. Памяти хватит. Загружается в память только столько, каков размер ВИДИМОГО участка. Хватит и 256Mb. Прочитай внимательнее главку из книжки, на которую дана ссылка.
Сам в свое время пользовался приведенным там кодом для просмотра картинок из файлов BMP намного больших, чем достомный объем памяти.


Defunct   (2004-09-15 10:31:00) [7]

Amoeba ©   (15.09.04 10:25) [6]

может просто не хватить памяти, у автора вопроса отмечана цифра 1.4Gb памяти как - недостаточная.

IMHO здесь только позонное кеширование способно помочь.


Amoeba   (2004-09-15 10:25:00) [8]


> Рамиль ©   (15.09.04 08:32) [4]

Поддерживаю! Лучшее решение - через отображение файла в память. Минимум тормозов.


Карелин Артем   (2004-09-15 08:34:00) [9]

компонент для быстрой работы с графикой лежит на g32.org


Рамиль   (2004-09-15 08:32:00) [10]

Может вот это поможет?
http://podgoretsky.com/ftp/Docs/Delphi/D7/d7stp/Glava10/Index17.html


MBo   (2004-09-15 06:47:00) [11]

Лучше всего разбить картинку на прямоугольные разумного размера - тогда при изменении прямоугольника вывода достаточно будет скопировать куски из максимум 4-х битмапов.


Defunct   (2004-09-15 05:49:00) [12]

> Как грузить части изображения из файла? И как оптимизировать загрузку этих частей, чтобы изображение при перемещении не подтормаживало.

При объеме рисунка >=1.4Gb торможений избежать невозможно.

1.TImage лучше не использовать - лучше TPaintBox. это даст самый большой пророст скорости.

Верно, но придется переделать TPaintBox (ввести в него TBitmap) и переопределить методы Paint и Repaint, добавить TMemoryStream в который кешировать часть рисунка, например +-10 экранов во всех направленниях потребует ~300Mb оперативной памяти для разрешения 1024x768. При Drag'e и Scroll'е копировать содержимое Stream'a в Bitmap. При выходе за границу кешируемой области, загружать новую порцию данных (5-10 секунд если будет быстрый диск), (1-5 сек - RAID массив). Вывод кешируемой области тормозить не дожен вообще, подгрузка порции данных есть везде, даже в CorelDraw, так что ничего позорного в этом нет.

> 2.Какой формат файла? (BMP, JPG) нужно научиться извлекать данные напрямую.

Только BMP - проще извлекать данные и нет лишних операций по распаковке. Вытаскивать из общего рисунка видимую область через TMemoryStream и загонять в Bitmap.


wl   (2004-09-14 23:35:00) [13]

1.TImage лучше не использовать - лучше TPaintBox. это даст самый большой пророст скорости.
2.Какой формат файла? (BMP, JPG) нужно научиться извлекать данные напрямую.
3. Чтобы Drag не тормозило, нужно, пожалуй, читать со всех сторон по столько,сколько влазит на экран, потому что при достижении границ окна мышку придётся отпустить, для скролла -не знаю, тоже какое-нибудь упреждающее чтение в ту сторону, в которую идёт скролл.


Наверх

Титульная страница Поиск, карта сайта Написать письмо