C# GDI+导入图片如何让背景透明

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# GDI+导入图片如何让背景透明相关的知识,希望对你有一定的参考价值。

我有一图片背影是单色的,主体是一红苹果,如可让运行程序中只显示红苹果呢?(不能用TransparencyKey,因为有的电脑上不能透明背景)

GDI+中这个重载函数可以实现
Graphics.DrawImage ( _
image As Image, _
destRect As Rectangle, _
srcX As Integer, _
srcY As Integer, _
srcWidth As Integer, _
srcHeight As Integer, _
srcUnit As GraphicsUnit, _
imageAttr As ImageAttributes _
)

ImageAttributes有个成员方法.SetColorKey (Color, Color) ,可以设置透明色范围.如果你要做渐变透明也可以修改其他属性.比如使用颜色替换,背景色替换成半透明色
参考技术A 软糖来告诉你把~
⒈ 建立一个 Bitmap 位图对象以导入图片。

Bitmap 位图 = new Bitmap(@"C:\图片路径\123.png");
⒉ 将左上角坐标 (0, 0) 的颜色设置为透明色。
位图.MakeTransparent(位图.GetPixel(0, 0));
至此该位图已经变为透明了,你可以通过下面语句设置窗体的透明背景。
Form1.BackgroundImage = 位图;
// 最后调整一下背景图的拉伸模式
Form1.BackgroundImageLayout = ImageLayout.Stretch;
参考技术B 看不明白你的意思,你是要用 GDI+ 处理图片呢? 还是要把 作为背景图片的背景色去掉?

C语言API如何让窗口里的部分背景透明?

比如窗口的一个矩形让它透明掉可以看到桌面,其他不透明,还有就是怎么把窗口的边框透明掉?

先把需要透明的地方填充成某一颜色,然后用SetLayeredWindowAttributes函数指定要透明的颜色,这一块区域就被透明了
如果要边框透明掉,只需要把窗口的边框和标题栏去掉就可以了.追问

怎么去掉边框?我在CreateWindow里去掉了Border样式,可是那边框还是有,还有就是,SetLayeredWindowAttributes会不会把所有的指定的颜色都透明掉?比如我指定红色,那窗口里面的所有红色都透明了?

追答

//创建一个带有 WS_EX_LAYERED 扩展样式的,无标题栏,无框的窗口

   hWnd = CreateWindowEx(WS_EX_LAYERED, szWindowClass, szTitle, WS_POPUP,

      CW_USEDEFAULT, CW_USEDEFAULT, 600, 400, NULL, NULL, hInstance, NULL);


你可以指定一种不常用的颜色,比如品红色 RGB(0xff, 0, 0xff)

如果你窗口内的颜色不是太丰富的话可以用这种方法


写了一个例子,可以参考一下,有什么不懂的可以追问.


追问

嗯嗯,厉害!我想再问一个,就是用GetSystemMetrics函数来获取边框的宽度是1,怎么在程序里面显示的边框却不是1px的?该怎么得到左右边框具体的宽度和上下边框具体的高度?

追答

获取边框宽度可以用
SM_CYSIZEFRAME
SM_CXSIZEFRAME
SM_CYFRAME
SM_CXFRAME
不知道你用的是哪一个
这几个的值都是一样的

追问

用的是SM_CXBORDER

追答

SM_CXBORDER 这个代表3D样式边的宽度

参考技术A 用路径层切割,切割掉的部分不会显示,但还是存在的,也就是鼠标可以点到,如果不想点到,还要另加程序,这我也不太会,都是GUI里的API用去来很麻烦。。。。追问

能告诉我切割的具体函数吗

参考技术B 用背景色画一个大方块。方块原点 0,0,长等于窗宽,高等于窗高。
API 函数
int FillRect(HDC hDC, CONST RECT *lprc, HBRUSH hbr);

试一下追问

那那个画刷用什么画刷?

追答

NULL_BRUAH你查一下MSDN

追问

这个我用过啊,矩形是透明,但窗口是白色底的,窗口这一部分依旧没有变透明啊

追答

调节窗体透明度可以先使用SetWindowLong为窗体加上WS_EX_LAYERED属性,再使用来SetLayeredWindowAttributes指定窗体的透明度。这样就可以在程序运行时动态的调节窗体的透明度了。
下面先介绍下SetWindowLong和SetLayeredWindowAttributes函数。
SetWindowLong可以用来设置窗口的一些属性,其函数原型如下:
LONGSetWindowLong(
HWNDhWnd,
int nIndex,
LONGdwNewLong
);
第一个参数表示窗口句柄。
第二个参数代表要设置的哪一种值,如GWL_STYLE表示将设置窗口的风格,这个参数还可以取GWL_EXSTYLE,GWL_WNDPROC,DWL_DLGPROC,GWL_HINSTANCE,GWL_USERDATA等等。
第三个参数表示要设置的值。
比如要设置对话框也能够可调节窗口大小,可以用:
// 设置对话框大小可调节
SetWindowLong(hDlg, GWL_STYLE, GetWindowLong(hDlg, GWL_STYLE) | WS_SIZEBOX);

以上是关于C# GDI+导入图片如何让背景透明的主要内容,如果未能解决你的问题,请参考以下文章

c++gdi如何让图片透明

怎么让JPG或BMP格式的背景变透明,麻烦有详细步骤,我是初级学者

visual studio 2010如何导入透明背景图片,或者说可以导入啥格式的图片,最后成为透明背景。

在C#.net代码中如何生成透明背景的png图片

C语言API如何让窗口里的部分背景透明?

word文档如何设置图片背景透明