Здравствуйте, Misha30, Вы писали:
M>Добрый вечер. Обращаюсь к Вам за помощью ибо начинаю медленно сходить с ума. Пытаюсь сохранить раннее полученный HBITMAP в файл. Размер картинки 160*160. При глубине цвета 16 и 32 бита на пиксел работает на ура (выделяю естественно не 160*160 а 160*160*2 и 160*160*4 соответственно). А вот при 8bpp выдает ошибку "stack around variable 'a' was corrupted". Где вообще появляется мифическая переменная 'а' я так и не понял. Надеюсь на Вашу помощь.
У 8-битного битмапа после Infoheader-а идет палитра.
На запись в файл её отсутствие не влияет — ну будет пока некорректный битмап. Так что надо проверять то, что делается до записи — GetDiBits ?
Похоже не существует варианта DIB_RGB_COLORS для biBitCount = 8;
Нужно указывать DIB_PAL_COLORS и задать палитру, в которой будет получено изображение.
Добрый вечер. Обращаюсь к Вам за помощью ибо начинаю медленно сходить с ума. Пытаюсь сохранить раннее полученный HBITMAP в файл. Размер картинки 160*160. При глубине цвета 16 и 32 бита на пиксел работает на ура (выделяю естественно не 160*160 а 160*160*2 и 160*160*4 соответственно). А вот при 8bpp выдает ошибку "stack around variable 'a' was corrupted". Где вообще появляется мифическая переменная 'а' я так и не понял. Надеюсь на Вашу помощь.
Здравствуйте, icWasya, Вы писали:
W>Похоже не существует варианта DIB_RGB_COLORS для biBitCount = 8; W>Нужно указывать DIB_PAL_COLORS и задать палитру, в которой будет получено изображение.
Это не то — DIB_RGB_COLORS и DIB_PAL_COLORS показывают, как интерпретировать палитру (первое — в ней содержатся непосредственно цвета)
А вот то, что GetDiBits пытается записать много в маленький кусок памяти — вполне вероятная причина вылета.
W>Похоже не существует варианта DIB_RGB_COLORS для biBitCount = 8; W>Нужно указывать DIB_PAL_COLORS и задать палитру, в которой будет получено изображение.
Именно так. По крайней мере когда писал код сохранения из HICON в ico-файл, там приходилось с битмапами именно так сохраняться (а в ico по сути и лежат 2 битмапа + еще инфа).
Всем спасибо, отчасти все были правы.
Итак для тех, кто вдруг наткнется на эту ветку с поиском такого же ответа.
Делать GetDIBits надо с флагом DIB_PAL_COLORS, но это лишь требование для получения корректной битмапы. Ошибка же заключалось в том — что если у нас палитра (а она будет для 256-разрядных изображний) объявление BITMAPINFO bmi не выделит нам достаточно места для хранения всей битмапинфы, так как она просто не знает, сколько выделять под палитру и выделит лишь под BITMAPINFOHEADER — известное заранее значение. Выход из этой ситуации — использовать указатель на структуру PBITMAPINFO и выделять —
pbmi = (PBITMAPINFO) LocalAlloc(LPTR,sizeof(BITMAPINFOHEADER)+ sizeof(RGBQUAD) * (2^(SIZE)));
где SIZE — размер картинки.