Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как освободить память после вызова функции?


Вася ©   (2013-10-04 14:57:00) 

после каждого вызова функции отхватывается кусок памяти
сама функция:
function set_brignes(aBitMap: TBitmap; k:integer):TBitmap;     //установка яркости
var
Count, v:integer;
pix3in: ^TRGBtriple;
pix4in: ^TRGBQuad;
pix_p:Pointer;
begin
   result:=Tbitmap.Create;
   result.Assign(aBitMap);
   Count:=aBitmap.Height*aBitmap.Width;
   result.BeginUpdate(false);
if aBitMap.pixelformat=pf32bit then
 begin
   pix_p:=result.RawImage.data;
   pix4in:=pix_p;
   repeat
   v:=pix4in^.rgbBlue+k;
   if v<0 then v:=0;
   if v>255 then v:=255;
   pix4in^.rgbBlue:=v;
   pix4in^.rgbGreen:=v;
   pix4in^.rgbRed:=v;
   inc(pix4in);
   dec(count);
   until count<=0;
 end;

if aBitMap.pixelformat=pf24bit then
 begin
   pix_p:=result.RawImage.data;
   pix3in:=pix_p;
   repeat
   v:=pix3in^.rgbtBlue+k;
   if v<0 then v:=0;
   if v>255 then v:=255;
   pix3in^.rgbtBlue:=v;
   pix3in^.rgbtGreen:=v;
   pix3in^.rgbtRed:=v;
   inc(pix3in);
   dec(count);
   until count<=0;
 end;
result.EndUpdate(false);
pix3in:=nil;
pix4in:=nil;
pix_p:=nil;
end;                


вызов ее:
image1.Picture.Bitmap.Assign(set_brignes(WorkBMP, TrackBar1.Position));

P.S. FPC 2.6


Вася   (2013-10-04 15:52:00) [1]

да, действительно, каждый раз новый битмап создается, спасибо, понял


Dimka Maslov   (2013-10-04 15:46:00) [2]


>   result:=Tbitmap.Create;


Если создаёшь объект внутри функции, где ты его уничтожаешь?


Вася   (2013-10-04 15:44:00) [3]


> Выделять не нужно.

Тоесть получается при
image1.Picture.Bitmap.Assign(set_brignes(WorkBMP, TrackBar1.Position));данные не копируются, а просто указатель меняется?
Извините если вопросы идиотские, учусь :)


Sapersky   (2013-10-04 15:27:00) [4]

Выделять не нужно.
Сделай set_brignes(Src, Dst: TBitmap; k:integer), в Dst передавай image1.Picture.Bitmap.

Вообще, посмотрел бы ты FastLIB что ли, или ещё какую-нибудь библиотеку (Graphics32? хотя она сложновата изнутри, на мой вкус). Если уж не в смысле использовать, то хотя бы в качестве образца, как надо делать. Да и всякая яркость-контраст и проч. велосипеды там давно уже изобретены.


Наверх

Титульная страница Поиск, карта сайта Написать письмо