Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.23;
Скачать: CL | DM;

Вниз

Проблема с переполнением памяти   Найти похожие ветки 

 
TkN ©   (2006-12-12 19:02) [0]

Есть фунция конвертации с png в ico файл. При многократном вызове функции, происходит ошибка. Думаю что наверно переполнение памяти.

Ошибка происходит в этом месте  

hNewBitmap := CreateDIBSection( DC,PBitmapInfo(BitmapHeader)^, DIB_RGB_COLORS,Bits,0,0);

Просто при выполнении этой строки происходит выдиление некой области памяти.  При завершении фунции область не очищается.
Может есть какие-то мысли?
Вот код:

//Функция которая преобразовывает png в ico и возвр. результат HICON
function PNGtoIcon(   str : string;
                     ACursor : Boolean = false;
                     AHotSpotX : Integer = 0;
                     AHotSpotY : Integer = 0) : HICON;
var
 APNG : TPNGObject;
 Width, Height : Integer;
 BitmapHeader  : PBitmapV5Header;
 hNewBitmap, hMonoBitmap   : HBITMAP;
 Bits          : Pointer;
 x, y          : Integer;
 DC            : HDC;
 IconInfo      : _ICONINFO;
 Pixel         : ^Integer;
 ScanLine      : PRGBTriple;
 AlphaScanline : pByteArray;
begin

 APNG := TPNGObject.Create;

 APNG.LoadFromFile(str);
 Width := APNG.Width;
 Height := APNG.Height;
 New(BitmapHeader);
 BitmapHeader.bV5Size := sizeof(BITMAPV5HEADER);
 BitmapHeader.bV5Width := Width;
 BitmapHeader.bV5Height := -Height;
 BitmapHeader.bV5Planes := 1;
 BitmapHeader.bV5BitCount := 32;
 BitmapHeader.bV5Compression := BI_BITFIELDS;
 BitmapHeader.bV5RedMask := $00FF0000;
 BitmapHeader.bV5GreenMask := $0000FF00;
 BitmapHeader.bV5BlueMask := $000000FF;
 BitmapHeader.bV5AlphaMask := $FF000000;

 DC := GetDC(0);
 hNewBitmap := CreateDIBSection( DC,PBitmapInfo(BitmapHeader)^, DIB_RGB_COLORS,Bits,0,0);
 Dispose(BitmapHeader);
 ReleaseDC(0,dc);
 hMonoBitmap:=CreateBitmap(Width,Height,1,1,nil);

 Pixel := Bits;
 for y := 0 to Height-1 do
 begin
   ScanLine := APNG.Scanline[y];
   AlphaScanline := APNG.AlphaScanline[y];
   for x := 0 to Width - 1 do
   begin

     Pixel^ := AlphaScanLine[x];
     Pixel^ := Pixel^ shl 8;
     Inc(Pixel^, Scanline^.rgbtRed);
     Pixel^ := Pixel^ shl 8;
     Inc(Pixel^, Scanline^.rgbtGreen);
     Pixel^ := Pixel^ shl 8;

     Inc(Pixel^, Scanline^.rgbtBlue);
     Inc(Pixel);
     Inc(ScanLine);
   end;
 end;

 IconInfo.fIcon := not ACursor;
 if ACursor then
 begin

   IconInfo.xHotspot := AHotSpotX;
   IconInfo.yHotspot := AHotSpotY;
 end;

 IconInfo.hbmMask := hMonoBitmap;
 IconInfo.hbmColor := hNewBitmap;
 Result := CreateIconIndirect(IconInfo);
 DeleteObject(hNewBitmap);
 DeleteObject(hMonoBitmap);

 APNG.Free;
end;


 
grisme ©   (2006-12-12 20:57) [1]

чем является возвращаемое значение функции CreateDIBSection()? выводы?


 
TkN ©   (2006-12-13 19:14) [2]


> grisme ©   (12.12.06 20:57) [1]
> чем является возвращаемое значение функции CreateDIBSection()?
>  выводы?

Может я что-то туплю, можно по подробней. Какие выводы?


 
Stexen ©   (2006-12-16 04:58) [3]


>
> Может я что-то туплю, можно по подробней. Какие выводы?

Хендлер наверное закрывать надо...


 
Stexen ©   (2006-12-16 05:02) [4]


> DeleteObject(hNewBitmap);

Упс, сори, вроде что то похожее на освобождение памяти...
А какая хоть ошибка то?


 
TkN ©   (2006-12-16 16:54) [5]

divizion by zero
при чем выбивает по разному, при приминении одного цикла
например, может выдать один раз на 5, второй - на 10


 
Stexen ©   (2006-12-17 01:31) [6]


> при чем выбивает по разному, при приминении одного цикла
> например, может выдать один раз на 5, второй - на 10

Хм... странные какие то проблеммы...
У меня было что то подобное, честно говоря, не помню как решил данную проблему.

А CreateDIBSection это виндовая функция???


 
TkN ©   (2006-12-17 13:09) [7]


> А CreateDIBSection это виндовая функция???


Функция CreateDIBSection создает аппаратно-независимый растровый формат (DIB), который приложения могут записывать непосредственно. Функция дает Вам указатель на расположение значений битов растра. Вы можете поставить дескриптор объекта "проекция файла в память", который функция использует для создания точечного рисунка, или Вы можете дать возможность системе выделить память для него.



Страницы: 1 вся ветка

Текущий архив: 2007.09.23;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.106 c
1-1184231813
Phoenix
2007-07-12 13:16
2007.09.23
rtf файлы и колонтитулы.


15-1188192985
TUser
2007-08-27 09:36
2007.09.23
Звуковые устройства


2-1188554563
БарЛог
2007-08-31 14:02
2007.09.23
Как узнать свободное место на удалённом компьютере?


15-1187965934
AntiUser
2007-08-24 18:32
2007.09.23
Курьёзный случай произошел в США


3-1179734128
dmitrigan
2007-05-21 11:55
2007.09.23
не удаляются записи из таблицы