Последние записи
- Windows 10 сменить администратора
- Рандомное слайдшоу
- Событие для произвольной области внутри TImage
- Удаление папки с файлами
- Распечатка файла
- Преобразовать массив байт в вещественное число (single)
- TChromium (CEF3), сохранение изображений
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
18th
Ноя
GetDIBits пишет за буфер => Heap corruption detected.
Posted by maloy under Win Api
Twix
Неделю назад написал такую функцию:
void Bmp2Mat(HDC hDC, HBITMAP hBmp, cv::Mat &img8UC3)
{
int size=3*img8UC3.cols*img8UC3.rows;
BYTE *bmpData = new BYTE[size];
BITMAPINFOHEADER bmi={0};
bmi.biSize = sizeof(BITMAPINFOHEADER);
bmi.biPlanes = 1;
bmi.biBitCount = 24;
bmi.biWidth = img8UC3.cols;
bmi.biHeight = -img8UC3.rows;
bmi.biCompression = BI_RGB;
GetDIBits(hDC, hBmp, 0, img8UC3.rows, bmpData, (BITMAPINFO*)&bmi, DIB_RGB_COLORS);
memcpy(img8UC3.data, bmpData, size);
delete [] bmpData;
}
Вытаскивал матрицу из HDC… Работала (да и до сих пор работает) без пререканий, но только на одном окне (мне в принципе другие не нужны, но разобраться хочется). Сегодня решил потестить для окна калькулятора…
И что я увидел? Ошибку «Heap corruption detected»… Оказалось, что GetDIBits каким-то образом пишет за пределы массива… Гуглил-гуглил и вот что нашёл: http://www.rsdn.ru/forum/winapi/111983.flat.aspx
Там похожая проблема, но только для 4 бит (сказали, что функа ещё палитру пытается всунуть). Мне добавить в bmi массив размера 2^24????
На msdn вроде написано, что палитру не должно записывать =\
Да и почему для одного окна работает, а для другого сыпется?
UPD: Оказалось, что везде работает, кроме калькулятора (win7). У него с шириной какая-то бага. По факту она 1 пиксель больше чем выдаёт GetWindowRect/GetClientRect
ZahAlex
Попробуй обнулить всё в структуре BITMAPINFO, кроме размера структуры (28h).
waleri
Размер строки должна быть кратной 32битам.
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)