Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.08.23;
Скачать: [xml.tar.bz2];

Вниз

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

 
Priest   (2009-06-23 17:52) [0]

Есть у меня процедура вида
TSampleGrabber.GetBitmap(Bitmap:....)
Получает битмап и записывает в него изображение с УСБ видеокамеры. И этой процедуре есть строчки вида

BitmapHandle := CreateDIBSection(0, PBitmapInfo(BIHeaderPtr)^,
                                        DIB_RGB_COLORS, DIBPtr, 0, 0);
..................................
hr := SampleGrabber.GetCurrentBuffer(BufferLen, DIBPtr);
........................................................................
Bitmap.Handle := BitmapHandle;


Получается, что в DIBPtr выделяется память а затем у меня происходит утечка, т.к.  я вызываю TSampleGrabber.GetBitmap несколько раз. Как корректно очистить  этот указатель?


 
Игорь Шевченко ©   (2009-06-23 19:47) [1]

мало строчек для ответа на вопрос


 
Sapersky   (2009-06-24 14:39) [2]

Получается, что в DIBPtr выделяется память а затем у меня происходит утечка

Предположительно или точно происходит?
По-моему TBitmap.SetHandle должен прибить предыдущий битмап по его хэндлу (указатель для этого необязательно иметь), так что ничего не утечёт. Другое дело, что нет особого смысла перевыделять битмап для каждого кадра. Может, получать картинку прямо в TBitmap, ну там на первом кадре установить ему размеры на основе BIHeaderPtr и потом подсовывать вместо DIBPtr Bitmap.Scanline[Height-1].


 
Priest   (2009-06-24 15:15) [3]

ПРоблема в следующем. Вызываю TSampleGrabber.GetBitmap(Bitmap:....) если при вызове процедуры не происходит ошибок (нехватка памяти), то в конце работы с Битмапом я вызываю


procedure ClearBitmap(B:TBitmap);
 begin
  if not B.HandleAllocated then Exit;
  B.Dormant;
  B.FreeImage;
  DeleteObject(B.Handle);
  B.ReleaseHandle;
 end;

Эта последовательность очищает битмап. НО если происходит ошибка нехватки памяти, то на строчке B.Dormant; у меня происходит исключение и в памяти остаётся картинка. Затем я считываю повторно и всё нормально вывожу. НО в памяти так и не могу удалить предыдущее изображение. ЧТо делать?


 
Sapersky   (2009-06-24 15:48) [4]

Не знаю, не разбираюсь я в TBitmap и не понимаю, зачем все эти пляски с бубном. FreeImage разве не достаточно?
Но в любом случае лучше заранее выделить битмап (см. [2]) для всех кадров, чем выделять/освобождать каждый кадр.



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

Форум: "Начинающим";
Текущий архив: 2009.08.23;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.04 c
2-1245838548
Uno-84
2009-06-24 14:15
2009.08.23
Отрисовка ProgressBar в ListView


15-1245680323
Пит
2009-06-22 18:18
2009.08.23
Существует в Дельфи функция IIF ?


2-1245692591
Новичок
2009-06-22 21:43
2009.08.23
Что делаю не так?


2-1245924610
webpauk
2009-06-25 14:10
2009.08.23
Определение процедуры


2-1245831668
Polkin
2009-06-24 12:21
2009.08.23
Убрать XPManifest





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский