Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4   вперед  Ctrl      все
 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]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4   вперед  Ctrl      все
Все форумы / Delphi Ответить