Текущий архив: 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.47 MB
Время: 0.044 c