Работа с большими(1гигабайт) и гигантскими(10Гб) растрами

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Работа с большими(1гигабайт) и гигантскими(10Гб) растрами

Сообщение Aleh » 20.01.2017 00:00:50

Устал искать(ключевые слова не могу придумать), решил тему создать.

Расстроила меня FreeImage 3. её предел где-то около 200-250Мег, формат - без разницы.
Удивил встроенный недоделанный TBitmap - 382М bmp прочитал (изображение rgb 24bit), съев в 2 раза больше памяти. Размеры показал правильно, но пощупать его функцией Canvas.CopyRect(R1, Bitmap1.Canvas, R2) не могу, "out of memory" не даёт.
Прога пока 32бит(старая dll держит), но берут меня сомнения и на счет 64 бит....
Проблема наверно не простая, раньше работали с такими растрами только аргис и фотошоп, остальные (ACDSee, FastStone Image Viewer и пр) до 200-400М.
Сейчас FastStone Image Viewer(с версии 5.3) 2Гб открывал, 7Гб нет.

Буду рад ссылкам, советам, предложениям.
На текущий момент у меня мысль такая: написать "велосипед" для чтения bmp (3Гб) с резкой "на лету" на тайлы (куски по 50-10М), про остальные форматы забыть.

PS :Конкретика: нужно открыть(распаковать), точное масштабирование Canvas.CopyRect, и получить доступ к пикселям (например использованием растр.GetDataLineStart(y); аналог Delphi TBitMap.ScanLine, неплохо бы сохранить изменённый.
Специфика (пока не до неё):у "гигантских" растров как правило больше 3-х каналов (+инфракрасные и ультрафиолетовые, 16-битный панхром)
Область использования - ГИС.
Последний раз редактировалось Aleh 20.01.2017 02:02:36, всего редактировалось 2 раз(а).
Aleh
новенький
 
Сообщения: 53
Зарегистрирован: 08.08.2016 12:27:45

Re: Работа с большими(1гигабайт) и гигантскими(10Гб) растрам

Сообщение olegy123 » 20.01.2017 00:16:46

Ого..
Сам битмап просто массив(векторов) - можно любой функционал написать и при этом не использовать TBitmap.. не проблема..
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Работа с большими(1гигабайт) и гигантскими(10Гб) растрам

Сообщение скалогрыз » 20.01.2017 00:20:29

Библиотек никаких не посоветую, но вот добрым словом:
* файлы без сжатия - твои друзья! типа bmp, tga - можно прочитать заголовок знать размер и себе составить карту, с каких мест, какие пиксели начинаются. Ну т.е. не читать файл целиком, а только получить информацию.
* В jpeg, поидее, есть "упрощеная версия" изображения. Т.е. сначала читать её?! И... если я не ошибаюсь, там сжатие итак идёт потайлам. Какая из jpeg библиотек поддерживает произвольный доступ я хз.
* в png, сложнее. Сам формат zlib, на самом деле, имеет такую фичу, как сброс словаря. Т.е. поидее можно распаковывая изображения, находить "точки сброса" словаря, и когда нужно прочитать отдельные куски, то можно распаковывать не всё изображение целиком, а только найденными кусками (которые начинаются в точках сброса).
Но, если возможности найти точки произвольного доступа нет, то изображение придётся распаковать, и разрезать на тайлы, а ещё map уровни (для масштабирования), и всё это в отдельных файлах хранить.
(естественно, желательно разрезать в процессе распаковки, не забивая всё изображение в память)

Функции отрисовки, при таком подходе придёться делать свои. (есть мнение, что они не слишком и хитрые будут... не?)
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Работа с большими(1гигабайт) и гигантскими(10Гб) растрам

Сообщение olegy123 » 20.01.2017 00:27:16

Конкретика нужна..
если просто резать - то просто move обойтись..
если нужно колдовать с пикселями - вопрос как сложно..

вообще есть библиотека IPP( Intel® Integrated Performance Primitives) которая как раз заточена и оптимизирована для работы с векторами(пикселами).. до больших серверных систем..
лицензия сейчас - фри..
сам её использую.

Добавлено спустя 5 минут 6 секунд:
Re: Работа с большими(1гигабайт) и гигантскими(10Гб) растрами
https://ru.wikipedia.org/wiki/Integrate ... Primitives
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Работа с большими(1гигабайт) и гигантскими(10Гб) растрам

Сообщение Aleh » 20.01.2017 00:35:05

olegy123 писал(а):Ого..
Сам битмап просто массив(векторов) - можно любой функционал написать и при этом не использовать TBitmap.. не проблема..

... проблема объяснить директору, чем я всё это время занимался, когда есть, например, прямо в компиляторе TLazReaderTiff со всем готовым. Да и самому обидно будет. Кстати мне не удалось прочитать хоть какой нибудь tif используя TLazReaderTiff....
Последний раз редактировалось Aleh 20.01.2017 01:13:48, всего редактировалось 1 раз.
Aleh
новенький
 
Сообщения: 53
Зарегистрирован: 08.08.2016 12:27:45

Re: Работа с большими(1гигабайт) и гигантскими(10Гб) растрам

Сообщение olegy123 » 20.01.2017 00:47:51

еще это есть:
vampyre
http://imaginglib.sourceforge.net/

Добавлено спустя 1 минуту 14 секунд:
Re: Работа с большими(1гигабайт) и гигантскими(10Гб) растрами
Native Object Pascal crossplatform library with no dependencies on any dynamically linked libraries or other platform specific binaries. Supported platforms are: Windows, Linux, FreeBSD, Mac OS X, x86/AMD64.
Loading and saving of these image file formats: BMP, JPEG, PNG/APNG, GIF, DDS, TGA, MNG, JNG, JPEG2000, TIFF, PSD, PBM, PGM, PPM, PAM, PFM, PCX, XPM, and more.
Many internal image data formats: 8, 16, 24, 32, 48 and 64 bit RGB and ARGB formats, indexed formats, grayscale formats, floating point formats (IEEE754 and half precision), compressed formats like DXT1/3/5, 3Dc and BTC.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Работа с большими(1гигабайт) и гигантскими(10Гб) растрам

Сообщение vitaly_l » 20.01.2017 02:02:43

Прочитайте про структуру BMP файлов, она, внутри, в самом файле - очень простая и естественно структурированная.
Соответственно сможете считывать пиксели из файла, частями, и на экран выводить уже отскайленную - уменьшенную версию,
При считывании кусочками сразу нужно: скайлить и аппроксимацию - делать до размера экрана (ну или нужного, но умещающегося).
Память, Вы таким образом сохраните и картинку на экран выведите, но если потребуется обработка, то там конечно попотеть придётся.
Времени, считывание кусочками - будет скорее всего занимать меньше, чем при загрузке всего файла в память и попытке там ворочать 10 Гб.

Фотошоп и прочие фИгни, делают тоже самое, только они так умеют работать с любым форматом.

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Работа с большими(1гигабайт) и гигантскими(10Гб) растрам

Сообщение Aleh » 20.01.2017 10:10:26

olegy123 писал(а):еще это есть:
vampyre
http://imaginglib.sourceforge.net/


Пример (ImgBrowser.exe) открывает так-же предел тот-же 200-250мег :(
Aleh
новенький
 
Сообщения: 53
Зарегистрирован: 08.08.2016 12:27:45

Re: Работа с большими(1гигабайт) и гигантскими(10Гб) растрам

Сообщение vitaly_l » 20.01.2017 10:15:29

Aleh писал(а):открывает так-же предел тот-же 200-250мег

Не пытайтесь искать готовый пакет. Бессмысленно, таких 100% нет. Слишком большой размер файла. Даже текстовые файлы, такого размера считывают частями. Делайте аппроксимацию прямоугольников по 10-100 пикселей, до одного пикселя или считывайте например каждый 10-й или 100-й пиксель. И только при масштабировании до максимального - считывайте и показывайте оригинал. Тоже самое делает и любой DrawScale в пакетах, когда выводит на экран из памяти. А здесь вы будете выводить не из памяти, а прямо с диска. Понимаете?
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Работа с большими(1гигабайт) и гигантскими(10Гб) растрам

Сообщение Mikhail » 20.01.2017 11:00:07

ИМХО для вашей задачи лучше использовать TIFF для хранения данных
https://ru.wikipedia.org/wiki/LibTIFF
https://ru.wikipedia.org/wiki/GeoTIFF
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: Работа с большими(1гигабайт) и гигантскими(10Гб) растрам

Сообщение Aleh » 20.01.2017 11:34:17

olegy123 писал(а):Конкретика нужна..
если просто резать - то просто move обойтись..
если нужно колдовать с пикселями - вопрос как сложно..

вообще есть библиотека IPP( Intel® Integrated Performance Primitives) которая как раз заточена и оптимизирована для работы с векторами(пикселами).. до больших серверных систем..
лицензия сейчас - фри..
сам её использую.

Добавлено спустя 5 минут 6 секунд:
Re: Работа с большими(1гигабайт) и гигантскими(10Гб) растрами
https://ru.wikipedia.org/wiki/Integrate ... Primitives


У меня к Вам огромная просьба: выложите пожалуйста демо-бинарник с этой библиотекой (раз вы её используете, это не сложно вам будет сделать), я бы протестировал.
Aleh
новенький
 
Сообщения: 53
Зарегистрирован: 08.08.2016 12:27:45

Re: Работа с большими(1гигабайт) и гигантскими(10Гб) растрам

Сообщение olegy123 » 20.01.2017 12:05:23

vitaly_l писал(а): А здесь вы будете выводить не из памяти, а прямо с диска. Понимаете?

Сейчас в ноутбуках можно 32Gb иметь.


Aleh писал(а):У меня к Вам огромная просьба: выложите пожалуйста демо-бинарник с этой библиотекой (раз вы её используете, это не сложно вам будет сделать), я бы протестировал.

у меня проект под линух, пишу на с++.
Вы бы написали, что вам надо затестить, какую операцию.. я бы сделал exe-шник.

А может и и либлу сделал для lazarus-а.
но это будет на выходных..
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Работа с большими(1гигабайт) и гигантскими(10Гб) растрам

Сообщение sts » 20.01.2017 13:14:07

имхо лучше свой велосипед, задача несложная особенно если разбить на две части, первое - потоковое чтения нужных форматов с поддержкой тайтлов и масштабированием, для начала достаточно bmp, jpeg, png, исходники есть (вроде), просто скомпоновать, второе менеджмент тайтлов, управление масштабированием.
будет три класса - реадер, тайтл, композитор.
можно сначала без картинок потестить.
для непосредственных манипуляций типа ресайза можно использовать выше предложенную либу IPP, судя по доке она хороша, но! битмапы (буферы) больше 2 гигов не поддерживает в 32бит и даже в 64бит ну или я не нашел обратных утверждений.
sts
постоялец
 
Сообщения: 415
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Работа с большими(1гигабайт) и гигантскими(10Гб) растрам

Сообщение olegy123 » 20.01.2017 13:35:02

в IPP нет битмапов.. там вектора они же массивы..
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Работа с большими(1гигабайт) и гигантскими(10Гб) растрам

Сообщение mig-31 » 20.01.2017 13:44:19

есть же GIMP с исходниками. Можно в них покапаться.
mig-31
постоялец
 
Сообщения: 224
Зарегистрирован: 14.07.2011 13:46:48

След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru