Работа с большими растрами в GDI+

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

SBJoker
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 28.01.2009 (Ср) 14:36

Работа с большими растрами в GDI+

Сообщение SBJoker » 28.01.2009 (Ср) 15:05

Здравствуйте,

делаю программу позволяющую просматривать растры представляющие собой сканированные карты в высоком разрешении.
Типовое разрешение 10 000*10 000, однако есть и по 87 000*60 000. Растры представлены файлами в формате TIFF 1bpp c LZW-сжатием, из за чего типовой размер файла не превышает 40 мб.

В ходе экспериментов с GDI+ в MSVC 2008 .NET, были получены такие результаты:
*растры размерами до 10 000 * 10 000 чаще всего нормально загружаются, но делать с ними ничего не получается, т.е. отобразить даже кусочек не выходит. Хотя получить Thumbnail чаще всего получается. В случае неудачи ошибка "не хватает памяти".
*растры большего размера не загружаются вообще, выкидывая ошибку "неправильный аргумент".

Собственно, вопрос как победить проблему?

Очень жаль что GDI+ не умеет читать фрагмент картинки или обрезать картинку в обход объекта Graphics.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Re: Работа с большими растрами в GDI+

Сообщение Nord777 » 28.01.2009 (Ср) 17:36

Считывать файл с диска не как картинку, а как байтовый массив.
Декомпрессия и определение нужного участка для изьятия - всё ручками. :wink:
Задача нетипичная, поэтому типового решения наверно не существует.
Каждый столкнувшийся сам решает чем жертвовать: памятью или скоростью.
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

SBJoker
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 28.01.2009 (Ср) 14:36

Re: Работа с большими растрами в GDI+

Сообщение SBJoker » 29.01.2009 (Чт) 9:19

Ну ручками это я считаю крайней мерой, велосипед изобретать мало приятного.

Меня больше волнует тот факт что многие даже неочень крутые приложения (MS Paint) открывают подобные растры. И использует он те же GDI и GDI+.
У меня есть подозрение что GDI+ размещает данные в памяти выделенной приложению (а это обычно немного), в то время как такие данные обычно размещаются в heap, т.е. общей памяти.

В VB или C# .NET существует способ загнать данные в общую память? В с++ это делается указателями.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Работа с большими растрами в GDI+

Сообщение Viper » 29.01.2009 (Чт) 11:05

SBJoker писал(а):Ну ручками это я считаю крайней мерой, велосипед изобретать мало приятного.

Меня больше волнует тот факт что многие даже неочень крутые приложения (MS Paint) открывают подобные растры. И использует он те же GDI и GDI+.
У меня есть подозрение что GDI+ размещает данные в памяти выделенной приложению (а это обычно немного), в то время как такие данные обычно размещаются в heap, т.е. общей памяти.

В VB или C# .NET существует способ загнать данные в общую память? В с++ это делается указателями.
Во-первых, место, где размещается картинка здесь не причем. Во-вторых, если не хватает стандартных для NET способов работы с памятью, то API в руки. Читать мою статью о памяти и указателях в NET на основном сайте.
Весь мир матрица, а мы в нем потоки байтов!

SBJoker
Начинающий
Начинающий
 
Сообщения: 18
Зарегистрирован: 28.01.2009 (Ср) 14:36

Re: Работа с большими растрами в GDI+

Сообщение SBJoker » 29.01.2009 (Чт) 19:40

Спасибо, статья хорошая.
Буду думать.


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20

    TopList