幸福快乐着
2019-10-23 17:40
采纳率: 66.7%
浏览 433

GDI+绘图问题,内存位图是否支持透明通道

(1)创建一个内存位图和内存DC
HBITMAP Hbitmap = CreateCompatibleBitmap(pDC, bitmapWith, bitmapHight);
HDC tmpDC = CreateCompatibleDC(pDC);
(2)向tmpDC绘图
(3)用内存位图创建纹理画刷
(4)用纹理画刷填充多边形

现在的问题是:
1. 位图不透明,会压盖掉原来的图形
2.填充只有平铺模式,而且位图排列方式也不能设定(GDI+)
3.内存位图是否支持透明通道

请教高手解决方案,在线等。
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • n00bzx 2019-10-24 10:55
    已采纳

    https://www.cnblogs.com/staring-hxs/p/3648561.html 这个函数似乎可以,gdi也行

    已采纳该答案
    打赏 评论
  • infoworld 2019-10-23 22:42

    你用的GDI, 而不是GDI+, 据我所知, GDI不支持透明度混合,GDI+才支持. Gdiplus.lib.
    使用Gdiplus::ImageAttributes. 通过调用imageAtt.SetColorMatrix 设置图片透明模式。
    之后通过相应的重载 graphics.DrawImage 方法把imageAttr传入绘制即可.

    以下是MSDN复制的代码:

    // Create a Bitmap object and load it with the texture image.
    Bitmap bitmap(L"Texture1.jpg");
    Pen pen(Color(255, 0, 0, 0), 25);
    // Initialize the color matrix.
    // Notice the value 0.8 in row 4, column 4.
    ColorMatrix colorMatrix = {1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
                               0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
                               0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
                               0.0f, 0.0f, 0.0f, 0.8f, 0.0f,
                               0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
    // Create an ImageAttributes object and set its color matrix.
    ImageAttributes imageAtt;
    imageAtt.SetColorMatrix(&colorMatrix, ColorMatrixFlagsDefault,
       ColorAdjustTypeBitmap);
    // First draw a wide black line.
    graphics.DrawLine(&pen, Point(10, 35), Point(200, 35));
    // Now draw the semitransparent bitmap image.
    INT iWidth = bitmap.GetWidth();
    INT iHeight = bitmap.GetHeight();
    graphics.DrawImage(
       &bitmap, 
       Rect(30, 0, iWidth, iHeight),  // Destination rectangle
       0,                             // Source rectangle X 
       0,                             // Source rectangle Y
       iWidth,                        // Source rectangle width
       iHeight,                       // Source rectangle height
       UnitPixel, 
       &imageAtt);
    

    参考: gdiplus-using-a-color-matrix-to-set-alpha-values-in-images-use

    打赏 评论
  • dabocaiqq 2019-10-24 00:29
    #include <GdiPlus.h>
    using namespace Gdiplus;
    #pragma comment(lib, "Gdiplus")
    
    int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
    {
     UINT  num = 0;          // number of image encoders
     UINT  size = 0;         // size of the image encoder array in bytes
    
     ImageCodecInfo* pImageCodecInfo = NULL;
    
     GetImageEncodersSize(&num, &size);
     if(size == 0)
      return -1;  // Failure
    
     pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
     if(pImageCodecInfo == NULL)
      return -1;  // Failure
    
     GetImageEncoders(num, size, pImageCodecInfo);
    
     for(UINT j = 0; j < num; ++j)
     {
      if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
      {
       *pClsid = pImageCodecInfo[j].Clsid;
       free(pImageCodecInfo);
       return j;  // Success
      }   
     }
    
     free(pImageCodecInfo);
     return -1;  // Failure
    }
    
     
    
     
    
    {
    
     GdiplusStartupInput gdiplusStartupInput;
     ULONG_PTR           gdiplusToken;
     GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
    
    //1:建立透明内存32位位图文件;
     Bitmap bmp( 1000,1000, PixelFormat32bppARGB );
    
     
    
    //2:刷新32位位图文件为透明;
     Graphics g( &bmp );
    
     Color   myColor(0, 0,0,0 ); 
     g.Clear( myColor );  
    
     
    
    //3:作图:
    
     g.DrawLine( &Pen(Color::Black), 0,0,100,100);
    
     
    
     //4: 显示:
    
    Graphics gwnd(this->m_hWnd);
     gwnd.DrawImage( &bmp, 0,0);
    
     
    
    //5:保存为png图片:
      CLSID pngClsid;
      GetEncoderClsid(L"image/png", &pngClsid);
      bmp.Save(L"F:\\Mosaic2.png", &pngClsid, NULL);
    
    }
    
    打赏 评论

相关推荐 更多相似问题