Главная страница
    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.47 MB
Время: 0.044 c
2-1188244933
malyar
2007-08-28 00:02
2007.09.23
обработка исключений


2-1187854315
raidersk8
2007-08-23 11:31
2007.09.23
печать stringgrid


2-1188306055
Krants
2007-08-28 17:00
2007.09.23
Field Not Found


15-1187863762
Memed_1971
2007-08-23 14:09
2007.09.23
Fast Report 4.0 install


2-1188231741
Ellita
2007-08-27 20:22
2007.09.23
Я хочу чтобы мое ехе-шное окно не меняло размер





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский