Загрузить фрагмент изображения

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Загрузить фрагмент изображения

Сообщение alibek » 17.04.2003 (Чт) 10:59

Можно ли, и если можно, то как загрузить фрагмент изображения не загружая всего файла целиком?

Поясню. Есть большой файл. Это -- отсканированная географическая карта. Файл действительно большой, свыше 250Мб, разрешение примерно 20000x20000, сохранено в формате GIF.

Нужно выводить на экран фрагмент карты (размером примерно 400x400 пикселов). Вариант "загрузить файл в невидимый Image или PictureBox и извлекать оттуда фрагмент" нереален.
Нужно загружать изображение из файла, и не все изображение, а только требуемый фрагмент.
Если бы это был BMP, то все было бы проще -- считал заголовок, подсчитал требуемое смещение в файле, загрузил из файла блок данных и вывел в PictureBox. Но с GIF-ом такое не прокатит.

Что посоветуете, народ?
Lasciate ogni speranza, voi ch'entrate.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 17.04.2003 (Чт) 11:15

А может, хранить в BMP? Получится ненамного больше - всего около 400МБ

Зато обрабатывать проще будет :?

ASD
Модератор
Модератор
Аватара пользователя
 
Сообщения: 1758
Зарегистрирован: 07.12.2001 (Пт) 21:08
Откуда: Russia

Сообщение ASD » 17.04.2003 (Чт) 11:20

Есть компонент ImageXpress я не могу сказать точно, но он многое умеет с картинками. Может он тебе поможет...
Moderator VBStreets
---------------------------

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.04.2003 (Чт) 17:10

ImageXpress денег стоит :)

Я тоже думал, чтобы использовать BMP-формат, но не хотелось бы. Во-первых, открыть и сохранить такой файл будет ОЧЕНЬ тяжким делом для компа, загнется еще, болезный :)
И кроме того, насколько я помню, GIF запоминается построчно, т.е. все-таки выдрать блок данных из него можно (в худшем случае это будет блок высотой 400 и шириной 20000 пикселов).

Так что наверно будет Windows Bitmap. Но может есть рецепт
Lasciate ogni speranza, voi ch'entrate.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 17.04.2003 (Чт) 17:21

GIF кроме всего прочего тоже платный и содержит пакованные LZW данные. LZW также стоит денег :)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.04.2003 (Чт) 17:45

Везде денег хотят, кругом враги :)

Тогда такой вопрос. Можно ли загружать фрагмент BMP-файла с помощью каких-либо системных процедур? Возможно, в функциях DirectX есть возможность загрузить фрагмент изображения из BMP-файла?
У меня есть описание формата BMP и я смогу написать свой загрузчик, но ведь он тормозным будет.
Lasciate ogni speranza, voi ch'entrate.

DimPos
Обычный пользователь
Обычный пользователь
 
Сообщения: 60
Зарегистрирован: 15.11.2002 (Пт) 17:24
Откуда: Киров

Сообщение DimPos » 22.04.2003 (Вт) 21:40

Есть такая API
LoadImage Lib "user32" Alias "LoadImageA" ( _
ByVal hInst As Long, ByVal lpsz As String, ByVal un1 As Long, ByVal n1 _ As Long, ByVal n2 As Long, ByVal un2 As Long) As Long
С битмапой она точно работает но с гифой не пробовал-если нада пошлю примерчик

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 23.04.2003 (Ср) 13:47

Я вначале обрадовался, а потом посмотрел описание функции и огорчился :)
Функция может загрузить фрагмент изображения указанной ширины и высоты, но в ней нельзя указать позицию, с которой нужно осуществлять загрузку изображения.
Идеальная функция (если она вообще есть) должна иметь в декларации параметры ..., Left, Top, Width, Height, ...
Такую функцию я уже написал, но она очень тормозная. Т.е. она в принципе не тормозная, но такая возможность нужна для скроллинга изображения в окне; в окне показывается только небольшой фрагмент карты и пользователь может скроллить эту карту при помощи мышки. Но для этого нужно:
- либо загрузить всю карту в память и вывод осуществлять (например) при помощи picMap.PaintPicture ... ;
- либо загружать фрагмент из файла, но загрузчик должен быть очень быстрым.
Пока я отдыхаю :)
Lasciate ogni speranza, voi ch'entrate.

DimPos
Обычный пользователь
Обычный пользователь
 
Сообщения: 60
Зарегистрирован: 15.11.2002 (Пт) 17:24
Откуда: Киров

Сообщение DimPos » 23.04.2003 (Ср) 23:14

Что верно то верно - загрузить фрагмент эта штука не позволяет и что еще хуже, без загрузки в память похоже не обойтись, я к тому что есть еще одна API-
Function StretchBlt Lib "gdi32" ( _
ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, _
ByVal nWidth As Long, ByVal nHeight As Long, _
ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, _
ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, _
ByVal dwRop As Long) As Long
Она как раз позволяет загрузить определенный фрагмент, но не из файла а из контекста.
Как то я делал что-то похожее - но у меня размеры картинки были 300х500 пикс. - попробуй, может не так уж сильно и тормозить будет

DimPos
Обычный пользователь
Обычный пользователь
 
Сообщения: 60
Зарегистрирован: 15.11.2002 (Пт) 17:24
Откуда: Киров

Сообщение DimPos » 23.04.2003 (Ср) 23:20

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

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 24.04.2003 (Чт) 9:10

Если разбивать на 400x400, то это получиться 2500 файлов. Кроме того, как будет выглядеть скроллинг? "Загрузить файл(i,j), если скроллинг влево, то подгрузить файл(i-1,j), объеденить их и вырезать 400x400". Это не то. Буду оптимизировать свой загрузчик, перейду на Pure API :)
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 38

    TopList  
cron