Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > C/C++: Системное программирование и WinAPI > Изменение размеров изображения |
Автор: k.sovailo 03.05.18, 20:06 |
Доброго времени суток и заранее извините за тупой вопрос. Имеется проект >8000 строк на Делфи и маленькая Dll на C++, о которой и пойдёт речь. В VCL какой-то косяк с ресайзом и я решил сделать костыль, но быстренько не вышло. Вот это выдаёт 32-битный битмап правильного размера, но с Альфа = 255: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> extern "C" __declspec(dllexport) BOOL __stdcall ResizeImage(HBITMAP hbitin, HPALETTE hpalin, HBITMAP *hbitout, int width, int height) { Gdiplus::Bitmap inbitmap(hbitin, hpalin); Gdiplus::Bitmap outbitmap(width, height); Gdiplus::Graphics graphics(&outbitmap); Gdiplus::Color color(0, 0, 0, 0); graphics.Clear(color); return((graphics.DrawImage(&inbitmap, 0, 0, width, height)==Gdiplus::Ok) &&((outbitmap.GetHBITMAP(color, hbitout)) == Gdiplus::Ok)); } Вопрос: почему и как исправить? Да, в интернете пруд пруди информации, но у меня не работает. Прошу не ругаться за этот ужасный костыль, я обещаю, я перепишу весь проект на С++, но сейчас надо решить проблему быстро. |
Автор: B.V. 04.05.18, 12:13 |
Что передаётся в функцию и что ожидается на выходе? |
Автор: LMM 04.05.18, 12:37 |
Альфа в функцию вообще не передаётся. |
Автор: k.sovailo 04.05.18, 13:14 |
B.V., в функцию передаётся хендл исходного битмапа (TBitmap) и его палитры (у TBitmap в хелпе написано, что TBitmap — инкапсуляция HBITMAP и HPALETTE). И размеры конечного изображения. И указатель на HBITMAP, чтобы вернуть HBITMAP конечного изображения. После этого в программе воссоздаётся TBitmap по переданному HBITMAP (и проблема не тут, так как в другой части такая же операция работает нормально). А возвращает функция, успешно ли всё прошло. |
Автор: k.sovailo 04.05.18, 18:39 |
Я немного уточню проблему. Я решил просто поиграться и передать изображение в DLL и обратно. Вот это делает альфа = 255: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> extern "C" __declspec(dllexport) BOOL __stdcall ResizeImage(HBITMAP hbitin, HPALETTE hpalin, HBITMAP *hbitout, int width, int height) { Gdiplus::Color color(0, 0, 0, 0); Gdiplus::Bitmap inbitmap(hbitin, hpalin);//альфа теряется тут return(outbitmap.GetHBITMAP(color, hbitout) == Gdiplus::Ok);//потому что это работает уже пол года } А вот это возвращает изображение с альфа = 0, которое по понятным причинам не отрисовывается: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> extern "C" __declspec(dllexport) BOOL __stdcall ResizeImage(HBITMAP hbitin, HPALETTE hpalin, HBITMAP *hbitout, int width, int height) { Gdiplus::Color color(0, 0, 0, 0); Gdiplus::Bitmap inbitmap(width, height, PixelFormat32bppARGB);//чтоб уточнить формат Gdiplus::Graphics graphics(&inbitmap); graphics.Clear(color); inbitmap.FromHBITMAP(hbitin, hpalin); return(outbitmap.GetHBITMAP(color, hbitout) == Gdiplus::Ok); } |
Автор: Twilight 23.05.18, 07:49 |
При конструировании Bitmap из HBITMAP альфа теряется и поделать с этим ничего нельзя. Поэтому остается переносить данные в Bitmap вручную через LockBits/UnlockBits |