Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.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
Цитата k.sovailo @
Вот это выдаёт 32-битный битмап правильного размера, но с Альфа = 255:

Что передаётся в функцию и что ожидается на выходе?

Автор: LMM 04.05.18, 12:37
Цитата B.V. @
Что передаётся в функцию и что ожидается на выходе?

Альфа в функцию вообще не передаётся.

Автор: 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

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)