Возникает ошибка "недостаточно памяти"

Федор_Федор
Дата: 14.11.2007 00:09:11
Программа создает тестовые изображения. Возникла такая проблема - если указать разрешение битмапа Res>5000, то возникает ошибка "Недостаточно памяти для обработки команды". Если запущено много других программ, то ошибка вроде бы появляется при меньшем значении Res.
Если убрать строку
b.Width:=Res; b.Height:=Res;
то вроде бы все работает как обычно, что-то вычисляется, но рисунок не формируется...

В чем может быть дело?
Спасибо.

Procedure CreateBitmap;
var
i,j:integer;
L:byte;
BEGIN
      
      b.Width:=Res; b.Height:=Res;
      For i:=0 to Res do
      For j:=0 to Res do
         begin
                  L:= Bright(i,j, Res,Res, N);//Для каждой точки рассчитываем ее яркость
                  b.Canvas.Pixels[i,j]:=RGB(L,L,L);//Формируем битмап
        end;{For}
END;{Of Create Bitmap}

b - это битмап.
Anatoly Podgoretsky
Дата: 14.11.2007 00:14:27
Это как минимум 100 мб и это должна быть свободная оперативная память.

Posted via ActualForum NNTP Server 1.4

Федор_Федор
Дата: 14.11.2007 00:20:18
Anatoly Podgoretsky
Это как минимум 100 мб и это должна быть свободная оперативная память.
Posted via ActualForum NNTP Server 1.4


А почему 100 Мб? Если чисто данные посчитать, получается меньше вроде бы:
5000*5000*3/(1024*1024)=72 MB.
Оперативки у меня вроде бы хватает (768 MB). А как можно посмотреть, сколько оперативки под что выделено? Если через дисппетчер задач, то показывает доступно 400 с лишним MB.

А в кореле и фотошопе вроде получается и по 20 000 на 20 000 создавать. Или там используется файл подкачки на винчестере?
Anatoly Podgoretsky
Дата: 14.11.2007 00:31:26
А ты посмотри, что такое TColor
Федор_Федор
Дата: 14.11.2007 00:34:19
Anatoly Podgoretsky
А ты посмотри, что такое TColor

Спасибо. Сейчас посмотрю. Если получится :0)

А можно ли как-нибудь избежать этой ошибки?
Например, посчитать примерный объем требуемой оперативки и сравнить с доступной.

Try....except почему-то не работает...
A.K.
Дата: 14.11.2007 00:42:15
Немного не по теме (а может, кстати, и по теме), но глаз резануло:
Федор_Федор
                  b.Canvas.Pixels[i,j]:=RGB(L,L,L);//Формируем битмап

Вам не надоедает чай пить, пока этот цикл выполняется?
Использование Bitmap.Canvas.Pixels для обращения к пикселям - это очень медленно и ресурсоемко.
Обязательно разберитесь с Bitmap.ScanLine - жизнь станет веселее.
Федор_Федор
Дата: 14.11.2007 00:46:17
A.K.
...Вам не надоедает чай пить, пока этот цикл выполняется?...

:) Да, действительно, не очень быстро работает. Сейчас почитаю. Спасибо.
Федор_Федор
Дата: 14.11.2007 00:48:02
C try...except все получилось. Оказалось между ними нужно вставить эту процедуру, а я пытался внутри процедуры эту конструкцию использовать.

Буду предупреждать пользователя, что большой рисунок сделать не получится.
A.K.
Дата: 14.11.2007 00:48:16
Anatoly Podgoretsky
Это как минимум 100 мб и это должна быть свободная оперативная память.

Думаю, дело не в отсутствии свободной ОП, а в каких-то переполнениях на уровне ресурсов GDI.
Пару лет назад я много бился, пытаясь заставить FastReport 3.09 заставить печатать отчеты с битмапами в высоком разрешении на фотопринтере. Четыре битмапа 1600х1200 - и все, приехали, вылетала именно эта ошибка. Программа при этом жрала прилично памяти - но не так, чтобы всю.
A.K.
Дата: 14.11.2007 00:50:22
Федор_Федор
Буду предупреждать пользователя, что большой рисунок сделать не получится.

Будь я Вашим пользователем - Вы бы от меня так не отвязались
Да и на стандартном TBitmap для работы с растрами Imho свет клином не сошелся.