Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.223.196.171] |
|
Сообщ.
#1
,
|
|
|
Доброго времени суток и заранее извините за тупой вопрос. Имеется проект >8000 строк на Делфи и маленькая Dll на C++, о которой и пойдёт речь. В VCL какой-то косяк с ресайзом и я решил сделать костыль, но быстренько не вышло. Вот это выдаёт 32-битный битмап правильного размера, но с Альфа = 255:
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)); } Вопрос: почему и как исправить? Да, в интернете пруд пруди информации, но у меня не работает. Прошу не ругаться за этот ужасный костыль, я обещаю, я перепишу весь проект на С++, но сейчас надо решить проблему быстро. |
Сообщ.
#2
,
|
|
|
Цитата k.sovailo @ Вот это выдаёт 32-битный битмап правильного размера, но с Альфа = 255: Что передаётся в функцию и что ожидается на выходе? |
Сообщ.
#3
,
|
|
|
Цитата B.V. @ Что передаётся в функцию и что ожидается на выходе? Альфа в функцию вообще не передаётся. |
Сообщ.
#4
,
|
|
|
B.V., в функцию передаётся хендл исходного битмапа (TBitmap) и его палитры (у TBitmap в хелпе написано, что TBitmap — инкапсуляция HBITMAP и HPALETTE). И размеры конечного изображения. И указатель на HBITMAP, чтобы вернуть HBITMAP конечного изображения. После этого в программе воссоздаётся TBitmap по переданному HBITMAP (и проблема не тут, так как в другой части такая же операция работает нормально). А возвращает функция, успешно ли всё прошло.
|
Сообщ.
#5
,
|
|
|
Я немного уточню проблему. Я решил просто поиграться и передать изображение в DLL и обратно. Вот это делает альфа = 255:
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, которое по понятным причинам не отрисовывается: 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); } |
Сообщ.
#6
,
|
|
|
При конструировании Bitmap из HBITMAP альфа теряется и поделать с этим ничего нельзя. Поэтому остается переносить данные в Bitmap вручную через LockBits/UnlockBits
|