На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Функция CBitmap в прозрачный CBitmap. Не работает с любыми битмапами., В функцию входит CBitmap и выходит CBitmap, но падает с некоторыми битмапами.
    Есть функция преобразования входного битмапа в прозрачный битмап:
    ExpandedWrap disabled
      CBitmap * CreateDIB(CBitmap *m_fgBmp)
      {
          BITMAPINFO bmi;
          BITMAP bm;
          int sx, sy;
       
          HDC tempDC = GetDC(0);
          m_fgBmp->GetBitmap(&bm);
          sx = bm.bmWidth;
          sy = bm.bmHeight;
          bmi.bmiHeader.biSize = sizeof bmi.bmiHeader;
          bmi.bmiHeader.biWidth = sx;
          bmi.bmiHeader.biHeight = sy;
          bmi.bmiHeader.biPlanes = 1;
          bmi.bmiHeader.biBitCount = 32;
          bmi.bmiHeader.biCompression = BI_RGB;
          bmi.bmiHeader.biSizeImage = 0;
          RGBQUAD *buffer, pixel;
          RGBTRIPLE *t1, *T1;
          HBITMAP hDIB = CreateDIBSection(tempDC, &bmi, DIB_RGB_COLORS,
              (void**)&buffer, 0, 0);
          if (buffer == NULL)
              buffer = NULL;
          bmi.bmiHeader.biBitCount = 24;
          bmi.bmiHeader.biClrUsed = 0;
          int widthBytes = sx * 3 + (sx * 3) % 4;
          char* bits1 = new char[widthBytes*sy];
          GetDIBits(tempDC, *m_fgBmp, 0, sy, bits1, &bmi, DIB_RGB_COLORS);
          T1 = (RGBTRIPLE*)(bits1);
          for (int i = 0; i<sy; i++)
          {
              t1 = (RGBTRIPLE*)(bits1 + widthBytes*i);
              for (int j = 0; j<sx; j++)
              {
                  if (isWhite(t1, T1))
                  {
                      BYTE alpha = 0;
                      pixel.rgbBlue = alpha;
                      pixel.rgbGreen = alpha;
                      pixel.rgbRed = alpha;
                      pixel.rgbReserved = alpha;
                  }
                  else
                  {
                      pixel.rgbBlue = t1->rgbtBlue;
                      pixel.rgbGreen = t1->rgbtGreen;
                      pixel.rgbRed = t1->rgbtRed;
                      pixel.rgbReserved = 255;
                  }
                  *buffer++ = pixel;
                  t1++;
              };
          };
          CBitmap *m_alphaBmp=new CBitmap;///
          m_alphaBmp->Attach(hDIB);
          ReleaseDC(0, tempDC);
          delete[] bits1;  ///  Вот здесь падает с некоторыми битмапами.
          return(m_alphaBmp);
      };

    Функцию вынул из проекта в интернете. С некоторыми битмапами работает нормально, а с некоторыми падает.
    Где грабли?
    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script Execution time: 0,0723 ]   [ 18 queries used ]   [ Generated: 14.10.19, 05:45 GMT ]