Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
8 / 8 / 0
Регистрация: 29.07.2010
Сообщений: 47

Как создать большой bitmap и избежать переполнения памяти

19.03.2011, 02:34. Показов 4293. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня такая проблема - нужно создать большой bitmap, размером так 15000x15000. Вызывает ошибку =) Из-за нагрузки на память, видимо, поскольку меньший размер прорисовывается нормально.
Можете посоветовать, как здесь можно поступить?
Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.03.2011, 02:34
Ответы с готовыми решениями:

Как избежать переполнения при работе с большими числами
При написании программы возникла проблема с большими числами. У меня есть число, которое копится в регистре di, его необходимо сравнивать...

Избежать переполнения float
Ребят подскажите как после вычисления переменной, в массив записывать не все число(так как там вещественной число с N-ым кол знаков поосле...

Как избежать утечки памяти при данном выделении памяти?
Всем привет. В проекте MFC делаю следующие манипуляции MY_STRUCT *ms = new MY_STRUCT(); m_tree_control.SetItemData(hChild,...

11
 Аватар для antsa
19 / 19 / 4
Регистрация: 04.07.2010
Сообщений: 86
19.03.2011, 08:26
Когда я работал с Delphi у меня была подобная ошибка, только размер был меньше гораздо, около 1024х768. Я решил проблему просто, вместо 1 элемента использовал 2 по 512х768. И все заработало. Попробуйте может так. А если не секрет, зачем Вам 15000x15000?
1
 Аватар для servitola
60 / 60 / 6
Регистрация: 07.09.2010
Сообщений: 259
19.03.2011, 08:30
Lottarend, возможно использовать DirectX библиотеки. Сам не знаю - предполагаю ))
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
19.03.2011, 08:36
Lottarend, математика простая: 15000x15000х4=900 000 000 Байт. ~900МБ ОЗУ сжирает только твоя картинка, если учесть, что прога жрет и другие ресурсы.... Короче ставь в комп 16ГБ ОЗУ и все будет нормально.
А вот действительно, зачем тебе картинка на 225 мегапикселей весом почти 1 ГБ?
2
8 / 8 / 0
Регистрация: 29.07.2010
Сообщений: 47
19.03.2011, 14:11  [ТС]
Да просто делаю прорисовку карты, с разным уровнем детализации. Масштаб нужен покрупнее =)
А разбивать карту на отдельные картинки... Как-то сложно. Все данные ведь сначала из текстовика берутся, потом по ним делается прорисовка. Даже и понять не могу, как туда все это зафигачить.
Ладно, буду думать.
0
I ♥ C#
 Аватар для Delog
470 / 262 / 25
Регистрация: 07.05.2010
Сообщений: 567
19.03.2011, 15:53
Карты надо рисовать в векторе.
0
2 / 2 / 0
Регистрация: 05.01.2011
Сообщений: 16
19.01.2012, 13:29
Цитата Сообщение от Delog Посмотреть сообщение
Карты надо рисовать в векторе.
Например карты генштаба перерисовать в векторе, удачи.
0
8 / 8 / 0
Регистрация: 29.07.2010
Сообщений: 47
20.01.2012, 03:16  [ТС]
Теме сто лет уже, я тогда вообще только начинал =)
0
 Аватар для ibmpc
80 / 78 / 10
Регистрация: 29.12.2011
Сообщений: 183
21.01.2012, 13:29
Цитата Сообщение от Lottarend Посмотреть сообщение
А разбивать карту на отдельные картинки... Как-то сложно.
Это самый удобный способ погрузки таких изображений. Не зря же его Google Maps и прочие используют. Тема по этой задаче была по моему на http://habrahabr.ru. Было связано с работой с крупными изображениями. Все таки не у всех есть достаточный объем ОЗУ для хранения таких больших изображений.
0
8 / 8 / 0
Регистрация: 29.07.2010
Сообщений: 47
24.01.2012, 12:30  [ТС]
Да, я знаю, там действительно ничего сложного нет, особенно в разбиении обычных картинок. У битмапа, по моему, есть метод, который позволяет взять кусок в пикселях, и сохранить его куда-нибудь. Это что касается нарезки.
Когда происходит сохранение на файл, я их сохранял таким образом. Допустим, имя файла: R1C1, что значит, строка 1, столбец 1. Т.е., как бы, виртуально представляется такая мозаика. При определении координат карты нужны некие статические оси х и y, к которым будут прибавляться координаты сдвига (т.е., пошевелил пользователь мышью вправо, прибавил к переменной столько то пикселей). Координату по х делим на размер одного квадрата, получаем номер столбца, по y - номер строки. Дробная часть отвечает за смещение внутри зоны. Если это растровые картинки, то здесь лучше подгружать их маленькими кусочками, например, 256x256, в некоторой области вокруг текущего квадрата местоположения, чтобы ускорить загрузку.
Для вектора смысла нету в большом количестве маленьких зон, нужны максимально большие зоны, на которых перемещение и масштабирование не тормозит, т.к. векторная графика обычно представлена в текстовом формате, который хорошо сжимается, и весит совсем немножко.
Ну, это если кому-то эта тема покажется нужной, то я набросал, как я делал это.
1
 Аватар для Syrax
28 / 19 / 16
Регистрация: 09.12.2009
Сообщений: 135
07.04.2015, 23:09
И все равно не совсем понятно.
То есть получается, что по размеру, занимаемому в памяти, одна картинка 16000х16000 != 64*2000*2000?

Моя проблема в том, что при использовании Bitmap'а размером 704х704 приложение занимает в оперативной памяти ~2Gb, при 512х512 -- ~1Gb, при 256х256 -- ~300Mb. При больших значениях оно даже не запускается, т.е. 495616 пикселей -- предел? У меня 4Gb оперативки в общем.
Немного о приложении: простой тайловый редактор карт, создается для изучения языка, а также для развлечения и последующего написания простой игрули. Написан он, правда, на PascalABC.Net, а не на C#. Но это, как мне кажется, не столь важно.
Я создаю PictureBox, создаю два Bitmap (один большой -- поле, один маленький -- кисть), создаю Graphics. При клике на PictureBox (событие MouseClick) хватаю координаты мыши и в это место сую тайл примерно так:
до процедуры обработки создаю сам bitmap, на котором отображаю карту
Pascal
1
2
3
var size:=32;
var x:=16; var y:=16;
MFP_bmp:=new Bitmap(x*size,y*size);
а это в процедуре обработки нажатия мыши
Pascal
1
2
3
4
brush:=new Bitmap('tile.png');
g.DrawImage(brush,x,y);
brush.Dispose;
PictureBox.Image:=MFP_bmp;
Что я делаю не так? Объясните, пожалуйста.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
07.04.2015, 23:51
Цитата Сообщение от Syrax Посмотреть сообщение
при использовании Bitmap'а размером 704х704 приложение занимает в оперативной памяти ~2Gb
Это ненормально. Должно занимать около 2MB.
Цитата Сообщение от Syrax Посмотреть сообщение
Что я делаю не так? Объясните, пожалуйста.
Dispose() вызываете у PictureBox.Image перед присвоением?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.04.2015, 23:51
Помогаю со студенческими работами здесь

Как создать bitmap из области (по координатам пикселей) другого bitmap
Здравствуйте. Подскажите пожалуйста как создать bitmap из области(по координатам пикселей) другого bitmap. Вообщем обрезать.

Как избавиться от ошибки переполнения памяти?
Считываю данные short из файла 29 мб и затем вывожу их на график: private void file_read(string file_name) { try ...

Как избавиться от переполнения памяти при очистке большого html файла?
Всем привет. Имею текстовый фаил объемом 100 мегабайт. В html коде. Там большой набор статичтических данных. Начинаю его чистить выдает...

Утечка памяти в программе , как избежать или как правильно уничтожить объект?
Ребят помогите создал класс , вызываю его Creat после destroy ,проект работает только вот память используемая потихоньку растет через пять...

Как избежать утечки памяти: нюансы использования QList
class T { QList<bitset<32> > bits; QList<bitset<32> > newList() { return QList<bitset<32> >(); } void...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru