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

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

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

请教高手解决方案,在线等。
c++

3个回答

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

wbin6510
幸福快乐着 您的回答给了我启发,
12 个月之前 回复
#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);

}
wbin6510
幸福快乐着 谢谢,您说的很有道理,由于我写的程序对显示速度有要求,所以保能尽量使用GDI,要在速度与程序设计难度中取平衡,所以有些用了gdi,也有用天+
12 个月之前 回复
qq_35623926
n00bzx 直接用公式混合不好吗?
12 个月之前 回复
wbin6510
幸福快乐着 谢谢您的支持,我需要生成一个HDC,(现在只能用内存位图)然后传给其它组件的绘图函数,然后由其它函数进行绘图。
12 个月之前 回复

你用的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

wbin6510
幸福快乐着 回复幸福快乐着: 尽管未完全解决我问题,依然感谢谢朋友们的支持,先结题了,但只能给一位朋友,其他朋友见谅。再次谢谢!
11 个月之前 回复
wbin6510
幸福快乐着 谢谢,您说的很有道理,由于我写的程序对显示速度有要求,所以保能尽量使用GDI,要在速度与程序设计难度中取平衡,所以有些用了gdi,也有用GDI+的
12 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐