Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2 3 4      [все]
 Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
Наконец дошли руки до моей поделки. Сразу столкнулся с двумя проблемами.

1. При попытке открыть тиф больше 2 гигов оказалось, что TStream этого не может потому что у него лапки Longint.Объяснение и решение нашел тут. Но это пол-беды.
2. При попытке просто создать картинку и задать ей размеры 25000 на 25000 (заведомо больше 2ГБ) поймал исключение при вызове gdi32
CreateCompatibleBitmap(DC: HDC; Width, Height: Integer): HBitmap;
. А тут уже не совсем ясно. Это может быть связано с тем, что у меня в видюшке всего 2 гига памяти?

Прошу совета, в каком направлении двигаться. В общем, задача выглядит так: открываем большую-большую картинку, рисуем на ней LineTo, TextOut, сохраняем. Показывать картинку целиком я не собираюсь, только маленький кусочек для превью. Разбивать картинку на кусочки тоже не собираюсь, там на стыках слишком много лишних расчетов получится. Да и не для того я 32 гига оперативки покупал.

Delphi XE3, Windows 7 SP1 x64.
22 фев 21, 20:09    [22284875]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 29547
Flying-home,

приложение 32бит? ну не может оно аллокировать больше 2 гиг. Что за программисты пошли, вообще ничего не знают.
22 фев 21, 20:13    [22284877]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52451

Flying-home
А тут уже не совсем ясно.

Что тебе неясно? Лапки не только у TStream. Забей на битмап, работай просто с массивом
пикселей.

Posted via ActualForum NNTP Server 1.5

22 фев 21, 20:21    [22284881]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
kdv
Flying-home,

приложение 32бит? ну не может оно аллокировать больше 2 гиг. Что за программисты пошли, вообще ничего не знают.

Да не, специально скачал свежую (относительно) Дельфу, выставил в свойствах проекта таргет платформ x64.
22 фев 21, 20:26    [22284883]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 14192
Flying-home
А тут уже не совсем ясно. Это может быть связано с тем, что у меня в видюшке всего 2 гига памяти?
Нет. DDB буфер в RAM сидит, и у него есть ограничение на размер. Маловероятно что мы доживем до времени когда буфер отрисовки будет рассчитан на мониторы с таким разрешением.

Flying-home

Прошу совета, в каком направлении двигаться.
В том, куда ты не хочешь.
22 фев 21, 20:28    [22284886]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
Dimitry Sibiryakov
Flying-home
А тут уже не совсем ясно.

Что тебе неясно? Лапки не только у TStream. Забей на битмап, работай просто с массивом
пикселей.

Думаю, так и придется. А рисовать как? Самому вот это вот все реализовывать? Я хочу и полупрозрачность, и другие вкусняшки GDI.
22 фев 21, 20:29    [22284887]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
Соколинский Борис
Flying-home
А тут уже не совсем ясно. Это может быть связано с тем, что у меня в видюшке всего 2 гига памяти?
Нет. DDB буфер в RAM сидит, и у него есть ограничение на размер. Маловероятно что мы доживем до времени когда буфер отрисовки будет рассчитан на мониторы с таким разрешением.

Flying-home

Прошу совета, в каком направлении двигаться.
В том, куда ты не хочешь.

Бить на кусочки? Грустно.
22 фев 21, 20:30    [22284888]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 14192
Flying-home,
Ты хочешь сказать, что исходная картинка не из кусочков? Можно я не поверю?
22 фев 21, 20:33    [22284890]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
Соколинский Борис
Flying-home,
Ты хочешь сказать, что исходная картинка не из кусочков? Можно я не поверю?

Ну конечно, была склеена из кусочков. Но рисовать-то удобнее на целом листе.

Кстати, есть такие картинки, которые точно не из кусочков.
https://api.discover.digitalglobe.com/show?id=103001008D9D1700
Это превьюшка снимка разрешением 0.5 метра на пиксель. Там точно больше 2 гигов.
22 фев 21, 20:40    [22284894]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 14192
Flying-home,
Нет таких матриц в природе, это все панорамные съемки. И хранить их в непорезанном виде - совсем не умная идея.
22 фев 21, 20:46    [22284897]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
Соколинский Борис
Flying-home,
Нет таких матриц в природе, это все панорамные съемки. И хранить их в непорезанном виде - совсем не умная идея.

Они хранятся продаются в непорезанном виде. И ортокоррекцию им делают тоже в непорезанном виде. Так удобнее.
Кстати, делаются они тоже целиком, за один проход. Но там по принципу сканера фотка делается, ширина снимка ограничена размером матрицы, а высота - нет.
22 фев 21, 21:05    [22284905]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
Ладно, вернемся к нашим баранам. Если я буду резать картинки на кусочки по 2 гига, смогу ли я работать с каждым их этих кусочков в отдельном потоке?

И это. Тот же Ирфан Вью легко и быстро открывает и показывает этот тиф. Значит, он что-то знает, чего не знаем мы?
22 фев 21, 21:10    [22284908]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 14192
Flying-home
Они хранятся продаются в непорезанном виде. И ортокоррекцию им делают тоже в непорезанном виде. Так удобнее.
Нифига это не удобнее. Удобно тайлы + пирамида, очень быстро получаешь и целиком в малом масштабе и нужный фрагмент в натуральном. Это пограничные случаи, все остальные в них вписываются.
Рискну предположить, что в твоем tiff-е оно и есть, только зачем-то запихнуто в один файл.

Flying-home
Но там по принципу сканера фотка делается, ширина снимка ограничена размером матрицы, а высота - нет.
Уверен?
Сомнительно что так со спутника можно снять, временной параллакс и все такое.
22 фев 21, 21:15    [22284911]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 14192
Flying-home
И это. Тот же Ирфан Вью легко и быстро открывает и показывает этот тиф. Значит, он что-то знает, чего не знаем мы?
Посмотри инфу о файле. Наверняка многостраничный и первой как раз верхушка пирамиды.
22 фев 21, 21:16    [22284913]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
Flying-home
Если я буду резать картинки на кусочки по 2 гига, смогу ли я работать с каждым их этих кусочков в отдельном потоке?

Я имею в виду, нет ли у GDI каких-то ограничений на вызов функций не из основного потока приложения?

Flying-home
Ирфан Вью легко и быстро открывает и показывает этот тиф. Значит, он что-то знает, чего не знаем мы?

Правда, он на плюсах написан.
22 фев 21, 21:21    [22284916]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 14192
Flying-home
Я имею в виду, нет ли у GDI каких-то ограничений на вызов функций не из основного потока приложения?
Нет.
22 фев 21, 21:22    [22284917]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
miksoft
Member

Откуда:
Сообщений: 38693
Flying-home
Тот же Ирфан Вью легко и быстро открывает и показывает этот тиф. Значит, он что-то знает, чего не знаем мы?
Есть идея скормить этот тиф какому-нибудь опенсорсовому просмотрщику. Если он с ней справится, то можно будет посмотреть в код.

Можете дать образец такого тифа?
22 фев 21, 21:23    [22284918]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
Соколинский Борис
Flying-home
Они хранятся продаются в непорезанном виде. И ортокоррекцию им делают тоже в непорезанном виде. Так удобнее.
Нифига это не удобнее. Удобно тайлы + пирамида, очень быстро получаешь и целиком в малом масштабе и нужный фрагмент в натуральном. Это пограничные случаи, все остальные в них вписываются.
Рискну предположить, что в твоем tiff-е оно и есть, только зачем-то запихнуто в один файл.

Flying-home
Но там по принципу сканера фотка делается, ширина снимка ограничена размером матрицы, а высота - нет.
Уверен?
Сомнительно что так со спутника можно снять, временной параллакс и все такое.


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

2. Да, уверен. Просто по-другому никак.
22 фев 21, 21:25    [22284920]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
miksoft
Flying-home
Тот же Ирфан Вью легко и быстро открывает и показывает этот тиф. Значит, он что-то знает, чего не знаем мы?
Есть идея скормить этот тиф какому-нибудь опенсорсовому просмотрщику. Если он с ней справится, то можно будет посмотреть в код.

Можете дать образец такого тифа?

Классная идея! Ща выложу.
22 фев 21, 21:26    [22284921]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 14192
Flying-home
Ну представь, тебе надо нарисовать горизонталь, которая тянется через всю картинку. Или любую другую линию. На тайлах никто не рисует.
Мне и представлять не надо, имею большой опыт подобных действий.
Аннотации нужно в векторном виде хранить и рисовать оверлеем.
22 фев 21, 21:29    [22284923]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
Соколинский Борис
Flying-home
Ну представь, тебе надо нарисовать горизонталь, которая тянется через всю картинку. Или любую другую линию. На тайлах никто не рисует.
Мне и представлять не надо, имею большой опыт подобных действий.
Аннотации нужно в векторном виде хранить и рисовать оверлеем.

В общем и целом да. Но иногда надо рисовать. Например, когда конечное приложение не умеет вектор. Или как в моем случае, нет приложений, которые рисовали бы вектор так, как мне надо.
22 фев 21, 21:33    [22284924]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 14192
Flying-home
Или как в моем случае, нет приложений, которые рисовали бы вектор так, как мне надо.
Ну так напиши сам. Или программиста найди.
22 фев 21, 21:44    [22284928]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
Flying-home
miksoft
пропущено...
Есть идея скормить этот тиф какому-нибудь опенсорсовому просмотрщику. Если он с ней справится, то можно будет посмотреть в код.

Можете дать образец такого тифа?

Классная идея! Ща выложу.

Не все так просто. Яндекс хочет, чтобы я какую-то прогу установил.
22 фев 21, 21:45    [22284930]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
Flying-home
2. При попытке просто создать картинку и задать ей размеры 25000 на 25000 (заведомо больше 2ГБ) поймал исключение при вызове gdi32
CreateCompatibleBitmap(DC: HDC; Width, Height: Integer): HBitmap;

. А тут уже не совсем ясно. Это может быть связано с тем, что у меня в видюшке всего 2 гига памяти?

Соколинский Борис
Нет. DDB буфер в RAM сидит, и у него есть ограничение на размер. Маловероятно что мы доживем до времени когда буфер отрисовки будет рассчитан на мониторы с таким разрешением.


Вот тут пацаны в далеком 2001 году пришли к выводу, что работа CreateCompatibleBitmap таки зависит от видеокарты и настройки драйверов.
автор
Ничего странного. Вызов CreateCompatibleBitmap идет прямиком в дисплей-драйвер под именем DrvCreateDeviceBitmap. Это дает возможность драйверу создать битмап прямо в видеопамяти, что значительно ускоряет последующую работу с ним. Так что очень вероятно, что драйвер здесь причастен.


Это никуда не годится. Получается, надо искать способы рисовать на битмапе без GDI.
22 фев 21, 22:38    [22284949]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
Соколинский Борис
Flying-home
Или как в моем случае, нет приложений, которые рисовали бы вектор так, как мне надо.
Ну так напиши сам. Или программиста найди.

Ах, если бы делать то что надо было бы так же просто, как знать, что надо делать! (С)
"Написать самому" в данном случае будет сложнее, чем написать свою ГИС с нуля. У меня сейчас продукт получается в результате последовательных действий в четырех разных программах. Работа третьей меня не устраивает. Надо или ждать, пока ее разработчики почешутся, или писать то, о чем я говорю. Именно рисовать на больших растрах.
22 фев 21, 22:48    [22284952]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Sapersky
Member

Откуда:
Сообщений: 82
Flying-home,

Забудьте про DDB (CreateCompatibleBitmap), в современных виндах от них никакой пользы нет.
DIB 25000*25000 в 64-битном режиме создаётся, но работает ли рисование - не пробовал.
b := TBitmap.Create;
b.PixelFormat := pf24Bit;
b.SetSize(25000, 25000);
Вообще лучше искать библиотеку, которая может выделять память под битмап через GetMem. Graphics32 вроде так умеет, и даже через MMF:
https://graphics32.github.io/Docs/Additional Topics/Back-Ends.htm
но рисовать придётся только средствами самой библиотеки.
При загрузке tiff могут быть проблемы, если загрузка не нативная, а скажем через GDI+, то опять же всё пойдёт через виндовые битмапы.
22 фев 21, 23:04    [22284958]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
Sapersky
Забудьте про DDB (CreateCompatibleBitmap), в современных виндах от них никакой пользы нет.

Так она вызывается в SetSize!
SetSize - CopyImage - CopyBitmap - Result := GDICheck(CreateCompatibleBitmap(ScreenDC, bmWidth, bmHeight))
22 фев 21, 23:18    [22284963]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
rgreat
Member

Откуда:
Сообщений: 6564
Flying-home
Да не, специально скачал свежую (относительно) Дельфу

Только в дельфи коммюнити могут сказать "свежая" про версию среды аж 8-летней давности.

Работу с 4+ GB потоками давным давно уже поправили.

А XE3 это всего 2-я версия среды с поддержкой x64.

Сообщение было отредактировано: 22 фев 21, 23:16
22 фев 21, 23:22    [22284966]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Sapersky
Member

Откуда:
Сообщений: 82
Flying-home,

Если PixelFormat задан конкретный (не pfDevice по умолчанию), то должен создаваться DIB через CreateDIBSection.
Заглянул в потроха - так и есть, CreateDIBSection в CopyBitmap.
22 фев 21, 23:24    [22284968]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
rgreat
Flying-home
Да не, специально скачал свежую (относительно) Дельфу

Только в дельфи коммюнити могут сказать "свежая" про версию среды аж 8-летней давности.

Работу с 4+ GB потоками давным давно уже поправили.

А XE3 это всего 2-я версия среды с поддержкой x64.

Я до этого писал в BDS 2006, мне хватало. Тут захотелось много памяти, спросил пацанов в соседнем топике, что ставить. Посоветовали XE3, сказали, за глаза хватит.
А тут, оказывается, не все так просто. И TStream с шестой версии не переписывался.
22 фев 21, 23:34    [22284972]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
Sapersky
Flying-home,

Если PixelFormat задан конкретный (не pfDevice по умолчанию), то должен создаваться DIB через CreateDIBSection.
Заглянул в потроха - так и есть, CreateDIBSection в CopyBitmap.

Это уже лучше. Осталось загрузить имеющийся тифф в этот битмап. Спасибо.
22 фев 21, 23:35    [22284973]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
rgreat
Member

Откуда:
Сообщений: 6564
Flying-home
Я до этого писал в BDS 2006, мне хватало.

Такая веселая хрень имхо вообще только в дельфи комьюнити и существует. ;)
22 фев 21, 23:39    [22284975]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
rgreat
Flying-home
Я до этого писал в BDS 2006, мне хватало.

Такая веселая хрень имхо вообще только в дельфи комьюнити и существует. ;)

Не знаю, о каком комьюнити ты говоришь, я большей частью сам по себе. Мне для поделок хватало, и ладно.
22 фев 21, 23:42    [22284977]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1776
rgreat
Flying-home
Я до этого писал в BDS 2006, мне хватало.

Такая веселая хрень имхо вообще только в дельфи комьюнити и существует. ;)


Да ладно. К нам один человечек на работу устраиваться приходил, он на C++ пишет, использует MS VS 6.0, и (по его словам) контора, где он раньше работал.
22 фев 21, 23:42    [22284979]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
Flying-home
Sapersky
Flying-home,

Если PixelFormat задан конкретный (не pfDevice по умолчанию), то должен создаваться DIB через CreateDIBSection.
Заглянул в потроха - так и есть, CreateDIBSection в CopyBitmap.

Это уже лучше. Осталось загрузить имеющийся тифф в этот битмап. Спасибо.

В него битмап из файла не получается загрузить. Все тот же TStream больше 2 гигов не умеет. Весело!
22 фев 21, 23:44    [22284980]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
ъъъъъ
rgreat
пропущено...

Такая веселая хрень имхо вообще только в дельфи комьюнити и существует. ;)


Да ладно. К нам один человечек на работу устраиваться приходил, он на C++ пишет, использует MS VS 6.0, и (по его словам) контора, где он раньше работал.

Так это ключевые слова! Раньше = 20 лет назад.
22 фев 21, 23:46    [22284981]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
rgreat
Member

Откуда:
Сообщений: 6564
ъъъъъ
К нам один человечек на работу устраиваться приходил
Как пришел так и ушел? ;)
22 фев 21, 23:48    [22284982]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
ъъъъъ
Member

Откуда:
Сообщений: 1776
rgreat
ъъъъъ
К нам один человечек на работу устраиваться приходил
Как пришел так и ушел? ;)

Зачем нам сипипишники.
23 фев 21, 00:03    [22284986]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Sapersky
Member

Откуда:
Сообщений: 82
Flying-home
В него битмап из файла не получается загрузить. Все тот же TStream больше 2 гигов не умеет. Весело!
Вам же говорили, что с какой-то версии проблему со стримом исправили - я правда не знаю с какой, у меня XE8 и там не исправлено.
Или смотреть сторонние библиотеки для загрузки Tiff, которые не используют стримы. FreeImage вроде не использует, ImagingLib и т.д. Хотя у них могут быть свои проблемы с загрузкой огромных картинок - что поделаешь, специфическая задача, мало кому это нужно.
23 фев 21, 01:03    [22284999]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2469
Да не может gdi с подобной размерностью нормально работать. Прими как данность. Это уже много раз обсасывалось. Конкретно на своём компе я как-то вычислял максимальный размер битмапа, правда уже не помню точно, но до 30000 точно не дошло. Все подобные вещи рисуются по кускам/тайлам, как уже ранее сказали
23 фев 21, 02:28    [22285011]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Мудроглюков
Member

Откуда:
Сообщений: 8319
Flying-home,

Одной из генеральных задач при создании FireMonkey было предоставление возможностей
для создания богатого графического интерфейса и конечно добавлена работа
с большими графическими файлами.
Есть вот специально для больших изображений TBitmapSurface (совместимый с TBitmap).
...
PS Про TBitmapSurface так заявлено разработчиками FireMonkey.

//////////////////////////////////////
PS Скажи - это КАРТУ рисуешь? Для карт есть специальные типы.
PS Почему кусками не отрабатываешь? Лень думать над алгоритмом?
23 фев 21, 10:34    [22285040]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
Мудроглюков
Flying-home,

Одной из генеральных задач при создании FireMonkey было предоставление возможностей
для создания богатого графического интерфейса и конечно добавлена работа
с большими графическими файлами.
Есть вот специально для больших изображений TBitmapSurface (совместимый с TBitmap).
...
PS Про TBitmapSurface так заявлено разработчиками FireMonkey.

//////////////////////////////////////
PS Скажи - это КАРТУ рисуешь? Для карт есть специальные типы.
PS Почему кусками не отрабатываешь? Лень думать над алгоритмом?


На спутниковом снимке хочу рисовать.

Я готов смириться с разбиением на куски. Но не хочу зависеть от видюшки. Хочу рисовать в ОЗУ средствами ЦПУ.
23 фев 21, 12:39    [22285080]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
Мудроглюков
TBitmapSurface

Пацаны говорят, что не получается на ней рисовать. Приходится бить на куски, загружать в обычный TBitmap и рисовать на нем.
https://stackoverflow.com/questions/51523321/how-to-draw-fmx-surface-tbitmapsurface-on-fmx-graphics-tbitmap

Сообщение было отредактировано: 23 фев 21, 13:08
23 фев 21, 13:14    [22285101]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
defecator
Member

Откуда:
Сообщений: 39692
Flying-home
Мудроглюков
TBitmapSurface

Пацаны говорят, что не получается на ней рисовать. Приходится бить на куски, загружать в обычный TBitmap и рисовать на нем.
https://stackoverflow.com/questions/51523321/how-to-draw-fmx-surface-tbitmapsurface-on-fmx-graphics-tbitmap


Graphics32 попробуй.
23 фев 21, 14:15    [22285133]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
Sapersky
Flying-home,

Если PixelFormat задан конкретный (не pfDevice по умолчанию), то должен создаваться DIB через CreateDIBSection.
Заглянул в потроха - так и есть, CreateDIBSection в CopyBitmap.

CreateDIBSection тоже не работает. Сделал картинку 25000 на 25000, сохранил в файл, а там меньше 2ГБ. Сделал 30000 на 30000, поймал ту же ошибку.
23 фев 21, 15:12    [22285169]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
А нет ли случайно в природе решений вроде виртуальной видеокарты? Чтобы подсистема GDI думала, что работает с видюшкой, а на самом деле использовалась обычная память компа?
23 фев 21, 15:29    [22285178]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2469
Flying-home
А нет ли случайно в природе решений вроде виртуальной видеокарты? Чтобы подсистема GDI думала, что работает с видюшкой, а на самом деле использовалась обычная память компа?
Значит только проктостоматология?...
23 фев 21, 15:39    [22285184]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
defecator
Flying-home
пропущено...

Пацаны говорят, что не получается на ней рисовать. Приходится бить на куски, загружать в обычный TBitmap и рисовать на нем.
https://stackoverflow.com/questions/51523321/how-to-draw-fmx-surface-tbitmapsurface-on-fmx-graphics-tbitmap


Graphics32 попробуй.

Он закончился на XE2 и, похоже, не 64-битный. Да на нем это и написано.
https://graphics32.github.io/Docs/Installation.htm
Написано только, что в критических секциях может использовать инструкции x64 процессоров.
23 фев 21, 15:55    [22285189]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
white_nigger
Flying-home
А нет ли случайно в природе решений вроде виртуальной видеокарты? Чтобы подсистема GDI думала, что работает с видюшкой, а на самом деле использовалась обычная память компа?
Значит только проктостоматология?...

Если такое решение будет простым и надежным, пуркуа бы не па?

Можно попытаться уточнить формулировку задачи:

Есть много больших картинок (> 2ГБ), на которых надо рисовать объекты размером с эти картинки. Есть много памяти и ядер, но мало видеокарт и мало видеопамяти.

Если я пойду путем разбиения картинки на приемлемые для GDI кусочки, я потеряю в производительности, потому что один поток будет ждать, пока предыдущий освободит видеопамять.
23 фев 21, 16:07    [22285197]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
А все эти современные новомодные процессоры с графическими ядрами ограничены по объему памяти, которую могут использовать? Я могу им в биосе отдать 60 ГБ ОЗУ?
23 фев 21, 16:15    [22285200]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52451

Flying-home
Есть много больших картинок (> 2ГБ), на которых надо рисовать объекты размером с эти
картинки. Есть много памяти и ядер, но мало видеокарт и мало видеопамяти.

Делаешь из объекта, который надо рисовать, поток пикселей. Потом просто складываешь два
потока любым удобным способом, это не требует затрат памяти.

Posted via ActualForum NNTP Server 1.5

23 фев 21, 16:52    [22285216]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
Я, похоже, зря паникую. Вот этот код работает.
  SetLength(b, 10);
  for i := 0 to 9 do begin
    b[i] := TBitmap.Create;
    b[i].PixelFormat := pf24Bit;
    b[i].SetSize(25000, 25000);
    b[i].Canvas.Pen.Color := clBlack;
    b[i].Canvas.MoveTo(1, 1);
    b[i].Canvas.LineTo(24999, 24999);
    Memo1.Lines.Add(IntToStr(i) + ' done');
    Application.ProcessMessages;
  end;

И картинки сохраняются в BMP чуть меньше 2 гигов. В принципе, это меня устроит, если заработает в десяти потоках. Остается открытым вопрос откуда GDI взяло это ограничение на 2 гига? Неужели все-таки это объем видеопамяти?
Ща потоки запилю, подождите.
23 фев 21, 17:08    [22285225]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 2469
У нас есть коммерческий продукт для работы с географическими сервисами. И там именно поточно блочная архитектура. Если бы он всю память отжирал, им бы никто не рискнул пользоваться)) ...и да вас это тоже касается))
23 фев 21, 17:25    [22285232]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
rgreat
Member

Откуда:
Сообщений: 6564
defecator
Graphics32 попробуй.
Хочу Graphics32 под линукс.
23 фев 21, 18:03    [22285248]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Sapersky
Member

Откуда:
Сообщений: 82
Flying-home
Он закончился на XE2 и, похоже, не 64-битный. Да на нем это и написано
Видимо, устарела эта страница. Самое актуальное сейчас на Гитхабе. Есть пакеты для всех версий:
https://github.com/graphics32/graphics32/tree/master/Source/Packages
и 64 бита тоже, судя по исходникам. Странно, если бы не было - это же самая популярная граф. библиотека для Дельфи.

Ограничения в GDI связаны скорее всего с его возрастом, во времена проектирования считали, что "High(Integer) хватит всем".
23 фев 21, 18:03    [22285249]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
white_nigger
У нас есть коммерческий продукт для работы с географическими сервисами. И там именно поточно блочная архитектура. Если бы он всю память отжирал, им бы никто не рискнул пользоваться)) ...и да вас это тоже касается))

Я ж могу заранее сказать, сколько памяти отжирать.
23 фев 21, 18:04    [22285250]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
rgreat
Member

Откуда:
Сообщений: 6564
Flying-home
defecator
пропущено...


Graphics32 попробуй.

Он закончился на XE2 и, похоже, не 64-битный. Да на нем это и написано.
https://graphics32.github.io/Docs/Installation.htm
Написано только, что в критических секциях может использовать инструкции x64 процессоров.

https://github.com/graphics32/graphics32
23 фев 21, 18:04    [22285251]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
В потоках все отработало на ура. Только при сохранении битмапа он еще столько же памяти отжирает. Но это решаемо.
23 фев 21, 18:05    [22285252]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
white_nigger
У нас есть коммерческий продукт для работы с географическими сервисами. И там именно поточно блочная архитектура. Если бы он всю память отжирал, им бы никто не рискнул пользоваться)) ...и да вас это тоже касается))

Че за продукт? Можно посмотреть?
23 фев 21, 18:06    [22285253]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
Sapersky
Ограничения в GDI связаны скорее всего с его возрастом, во времена проектирования считали, что "High(Integer) хватит всем".

Было бы интересно попытать владельцев разных видюшек выполнить это.
b := TBitmap.Create;
b.PixelFormat := pf24Bit;
b.SetSize(25000, 25000);

25000 - меньше 2 гигов, 30000 - больше 2 гигов.
23 фев 21, 18:09    [22285255]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
Sapersky
Flying-home
Он закончился на XE2 и, похоже, не 64-битный. Да на нем это и написано
Видимо, устарела эта страница. Самое актуальное сейчас на Гитхабе. Есть пакеты для всех версий:
https://github.com/graphics32/graphics32/tree/master/Source/Packages
и 64 бита тоже, судя по исходникам. Странно, если бы не было - это же самая популярная граф. библиотека для Дельфи.

Ограничения в GDI связаны скорее всего с его возрастом, во времена проектирования считали, что "High(Integer) хватит всем".

Круто. Наверное, заюзаю. Пока заметил, что они линии без пикселизации рисуют, это хорошо.
23 фев 21, 18:17    [22285261]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
Всем спасибо. Пока выбрал такой путь:
Разбивать тифы на куски не больше 2 гигов, рисовать на них, потом склеивать обратно.
23 фев 21, 18:28    [22285271]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
DHDD
Member

Откуда:
Сообщений: 47
Flying-home,

win64, 10.3.3, RAM 12Gb, Video Internal max 1849 Mb (Windows 7x64)

25000x25000: ошибок нет, сохранение на диск 1 875 000 054 bytes.

30000x30000: raised exception class EOutOfResources with message 'Параметр задан неверно.'

Сообщение было отредактировано: 23 фев 21, 18:44
23 фев 21, 18:49    [22285283]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52451

Flying-home
Пока выбрал такой путь:
Разбивать тифы на куски не больше 2 гигов, рисовать на них, потом склеивать обратно.

Я не скажу за JPEG, но все остальные поддерживаемые TIFF-ом форматы, описанные в
википузии, способны обрабатываться последовательно, не требуя затрат памяти вообще.

Просто попробуй свои "куски" сделать один пиксель высотой.

Posted via ActualForum NNTP Server 1.5

23 фев 21, 19:20    [22285304]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
defecator
Member

Откуда:
Сообщений: 39692
Flying-home
defecator
пропущено...


Graphics32 попробуй.

Он закончился на XE2 и, похоже, не 64-битный. Да на нем это и написано.


Он прекрасно работает в x64, а "32" в названии - это то, что он работает с 32-ухбитными картинками
23 фев 21, 19:57    [22285323]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
defecator
Flying-home
пропущено...

Он закончился на XE2 и, похоже, не 64-битный. Да на нем это и написано.


Он прекрасно работает в x64, а "32" в названии - это то, что он работает с 32-ухбитными картинками
Да, я уже понял.
23 фев 21, 20:47    [22285343]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
Dimitry Sibiryakov
Flying-home
Пока выбрал такой путь:
Разбивать тифы на куски не больше 2 гигов, рисовать на них, потом склеивать обратно.

Я не скажу за JPEG, но все остальные поддерживаемые TIFF-ом форматы, описанные в
википузии, способны обрабатываться последовательно, не требуя затрат памяти вообще.

Просто попробуй свои "куски" сделать один пиксель высотой.
На манер "сканера"? Да, интересное решение. Но сперва мне надо будет на чем-то нарисовать свои лайн-ту/мув-ту. А потом уже накладывать два изображения построчно.
23 фев 21, 20:51    [22285346]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52451

Flying-home
Но сперва мне надо будет на чем-то нарисовать свои лайн-ту/мув-ту.

А надо ли? Проще завести список координат пикселей, которые надо портить в картинке.

Posted via ActualForum NNTP Server 1.5

23 фев 21, 21:07    [22285353]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Sapersky
Member

Откуда:
Сообщений: 82
Flying-home
Было бы интересно попытать владельцев разных видюшек выполнить это.
25000 - меньше 2 гигов, 30000 - больше 2 гигов.
Не зависит это от видюшки. У меня 8 Гб видеопамяти, но 30000*30000 вылетает.
DIB-ы всегда в системной памяти создавались, они же device-independent.

Если интересны картографические проекты, то есть SAS.Planet с открытыми исходниками. Использует, кстати, Graphics32.
https://github.com/sasgis/sas.planet.src
Правда, официальный сайт с бинарниками у них сейчас лежит, но можно на ютубе посмотреть, как оно выглядит.
23 фев 21, 21:09    [22285355]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
Dimitry Sibiryakov
Flying-home
Но сперва мне надо будет на чем-то нарисовать свои лайн-ту/мув-ту.

А надо ли? Проще завести список координат пикселей, которые надо портить в картинке.
Думаю, надо. Если у меня есть координаты двух точек, между которыми надо нарисовать линию, то нахождение всех пикселей, "которые надо испортить" делается как раз лайнту.
23 фев 21, 21:32    [22285363]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
Sapersky
Flying-home
Было бы интересно попытать владельцев разных видюшек выполнить это.
25000 - меньше 2 гигов, 30000 - больше 2 гигов.
Не зависит это от видюшки. У меня 8 Гб видеопамяти, но 30000*30000 вылетает.
DIB-ы всегда в системной памяти создавались, они же device-independent.

Если интересны картографические проекты, то есть SAS.Planet с открытыми исходниками. Использует, кстати, Graphics32.
https://github.com/sasgis/sas.planet.src
Правда, официальный сайт с бинарниками у них сейчас лежит, но можно на ютубе посмотреть, как оно выглядит.
Я давно на сасгисе зареган. Лет 8 наверно. Грандиозный проект по выкачиванию всякого интересного.
23 фев 21, 21:34    [22285364]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52451

Flying-home
Думаю, надо. Если у меня есть координаты двух точек, между которыми надо нарисовать линию,
то нахождение всех пикселей, "которые надо испортить" делается как раз лайнту.

Ну смотри: вот есть у тебя линия от 0,0 до 99,99. Битмап с этой линией займёт 10000
пикселей. Просто пиксели линии - 100. Экономия памяти на два порядка.

Posted via ActualForum NNTP Server 1.5

23 фев 21, 22:57    [22285389]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
Dimitry Sibiryakov
Flying-home
Думаю, надо. Если у меня есть координаты двух точек, между которыми надо нарисовать линию,
то нахождение всех пикселей, "которые надо испортить" делается как раз лайнту.

Ну смотри: вот есть у тебя линия от 0,0 до 99,99. Битмап с этой линией займёт 10000
пикселей. Просто пиксели линии - 100. Экономия памяти на два порядка.

Да я не собираюсь экономить память. Я думал, что ограничения в 2 ГБ связаны с количеством видеопамяти. Оказалось, что нет.

Судя по всему, память под битмап под рисование примитивов выделяется хоть и видеодрайвером, но в обычном ОЗУ и в ней можно рисовать средствами GDI. И выделять ее можно сколько угодно (сколько угодно кусков по 2ГБ) и работать с ней многопоточно. Это все, что мне надо.

Но это не точно. Надо будет еще несколько проверок сделать.
23 фев 21, 23:14    [22285397]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
Sapersky
Правда, официальный сайт с бинарниками у них сейчас лежит...

Что-то долго лежит...
вчера, 22:26    [22287185]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Flying-home
Member

Откуда: kart.vrostove.net
Сообщений: 14999
Flying-home
Судя по всему, память под битмап под рисование примитивов выделяется хоть и видеодрайвером, но в обычном ОЗУ и в ней можно рисовать средствами GDI. И выделять ее можно сколько угодно (сколько угодно кусков по 2ГБ) и работать с ней многопоточно. Это все, что мне надо.

Не работает в дополнительных потоках. Это то, чего я опасался изначально. Начинает рисовать, потом в какой-то момент перестает без всяких ошибок и предупреждений. Как-будто игнорирует код. При этом поток продолжает работать, что-то считать, сохранять битмап в файл. И еще не освобождает память, выделенную под картинку. Если не трудно, посмотрите, пожалуйста, код. Может, я чего намудрил? Может, чего не вижу или не знаю?

Очередной поток запускается кнопкой, чтоб остановить его, надо выбрать его номер в комбобоксе. После выбора нужно время чтобы поток сохранил файл. В Unit2 две константы, размер битмапа и место куда сохранять.

Для того, чтобы убедиться, что не работает, достаточно одного потока (у меня по крайней мере). В диспетчере задач пока он рисует, работает ядро (красненький график). Как перестает рисовать, остается только зелененький. После сохранения картинки в отчете пишется, сколько проходов было сделано. А на самой картинке два числа, второе - количество проходов, которые реально рисовались.

После остановки потоков приложение надо закрывать.

К сообщению приложен файл (first.zip - 86Kb) cкачать
сегодня, 17:08    [22287330]     Ответить | Цитировать Сообщить модератору
 Re: Картинки больше 2ГБ  [new]
Sapersky
Member

Откуда:
Сообщений: 82
Flying-home,

Вроде бы в VCL рисование не потокобезопасное, какие-то глобальные переменные используются, что ли (точно не помню, давно TBitmap не использую).
То есть от размера битмапов это скорее всего не зависит.
сегодня, 18:45    [22287344]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3 4      [все]
Все форумы / Delphi Ответить