На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
  
> Изменение размеров изображения, при помощи GDI+
    Доброго времени суток и заранее извините за тупой вопрос. Имеется проект >8000 строк на Делфи и маленькая Dll на C++, о которой и пойдёт речь. В VCL какой-то косяк с ресайзом и я решил сделать костыль, но быстренько не вышло. Вот это выдаёт 32-битный битмап правильного размера, но с Альфа = 255:

    ExpandedWrap disabled
      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));
      }


    Вопрос: почему и как исправить? Да, в интернете пруд пруди информации, но у меня не работает. Прошу не ругаться за этот ужасный костыль, я обещаю, я перепишу весь проект на С++, но сейчас надо решить проблему быстро.
    Сообщение отредактировано: k.sovailo -
      Цитата k.sovailo @
      Вот это выдаёт 32-битный битмап правильного размера, но с Альфа = 255:

      Что передаётся в функцию и что ожидается на выходе?
      char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
      for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;


      user posted image Чат Исходников в СкайпеЧат Исходников в ДискордеНе проходим, а заходим!
        Цитата B.V. @
        Что передаётся в функцию и что ожидается на выходе?

        Альфа в функцию вообще не передаётся.
        ...one shot at glory in the crossfire overhead...© JP
          B.V., в функцию передаётся хендл исходного битмапа (TBitmap) и его палитры (у TBitmap в хелпе написано, что TBitmap — инкапсуляция HBITMAP и HPALETTE). И размеры конечного изображения. И указатель на HBITMAP, чтобы вернуть HBITMAP конечного изображения. После этого в программе воссоздаётся TBitmap по переданному HBITMAP (и проблема не тут, так как в другой части такая же операция работает нормально). А возвращает функция, успешно ли всё прошло.
          Сообщение отредактировано: k.sovailo -
            Я немного уточню проблему. Я решил просто поиграться и передать изображение в DLL и обратно. Вот это делает альфа = 255:
            ExpandedWrap disabled
              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, которое по понятным причинам не отрисовывается:

            ExpandedWrap disabled
              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);
              }
              При конструировании Bitmap из HBITMAP альфа теряется и поделать с этим ничего нельзя. Поэтому остается переносить данные в Bitmap вручную через LockBits/UnlockBits
              Don't talk to strangers
              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script Execution time: 0,0850 ]   [ 17 queries used ]   [ Generated: 23.09.18, 02:44 GMT ]