上一章说了用Bitmap.LockBits来做图片框透明(图片透明),从运行效果上看效率一般般,差强人意,不过勉强可以使用,这一章来写一个高大上的,效率杠杠的
需要用到的东西有色彩矩阵,没错就是这玩意——ColorMatrix
ColorMatrix提供一个RGBA的5*5色彩矩阵,你可以通过它来调节整幅图像的颜色比例从而做到对图像色彩的调节
先来介绍一下ColorMatrix里的最重要的构造函数的入口参数,顾名思义既然是5*5的色彩矩阵,当然要传入一个5*5的二维数组了(手动打脸——废话),这个二维数组由5个由Single类型组成的拥有5个元素的数组组成,具体就是这样写
Dim CColorMatrix()() As Single = {New Single() {1, 0, 0, 0, 0}, New Single() {0, 1, 0, 0, 0}, _
New Single() {0, 0, 1, 0, 0}, New Single() {0, 0, 0, 1, 0}, New Single() {0, 0, 0, 0, 0}}
(额,好像有点乱,这全是数字弄啥嘞,不过还是慢慢来看吧)
首先我们看第一个元素New Single() {1, 0, 0, 0, 0},这个元素在矩阵内充当第一行,也就是色彩R(红色)这一行,这里有疑问,为什么一个红色需要有5个元素来描述他,我们再来拆分,看第一个元素1,这个1的含义简述来说就是在当前红色分量上的红色分量的比例(……表达有限,看下一个),第二个元素0,表示当前红色分量上绿色分量的比例,以此类推第三个就是当前红色分量上蓝色分量的比例,之后是透明也就是Alpha通道分量的比例,最后一个0则是翻转参数,这里我们不详细介绍,主要是用来做反色功能
好,看到我这个数组中第一位是1,那就说明红色分量全部都是红色,简单来说就是关于这个矩阵里红色啥都不动
之后我们再把第二个元素提出来New Single() {0, 1, 0, 0, 0},这个元素在矩阵内充当第二行,也就是色彩G(绿色)这一行,然后后面的就不一一介绍了,能看懂上面这里也就能看懂了,没看懂的就无限循环上面一段,总之这里的意思就是绿色分量也不动
这一次我们最重要的是操作这个参数New Single() {0, 0, 0, 1, 0},透明分量,这里的1就是全部不透明,0就是全透明,中间的范围是一个Single类型,我们只需要改这个参数就可以使图片透明,好说了这么多废话,下面上代码,这里的代码也是全部放到PictureBox的Paint事件中的
Dim CColorMatrix()() As Single = {New Single() {1, 0, 0, 0, 0}, New Single() {0, 1, 0, 0, 0}, _
New Single() {0, 0, 1, 0, 0}, New Single() {0, 0, 0, OPacitys, 0}, New Single() {0, 0, 0, 0, 0}} '初始化颜色比例参数,用OPacitys属性来代替透明度,最大为1,最小为0
Dim CM As ColorMatrix = New ColorMatrix(CColorMatrix) '用颜色比例参数去实例化颜色矩阵
If Bitmaps Is Nothing Then Return '如果没有图片资源,则退出过程
Dim BBitmap As Bitmap = Bitmaps.Clone '制作一个当前图像的浅表副本
Dim IA As New ImageAttributes '实例化一个图像辅助类(包含了图像属性)
IA.SetColorMatrix(CM, ColorMatrixFlag.Default, ColorAdjustType.Bitmap) '定义图像属性
e.Graphics.DrawImage(BBitmap, New Rectangle(0, 0, BBitmap.Width, BBitmap.Height), 0, 0, BBitmap.Width, BBitmap.Height, GraphicsUnit.Pixel, IA) '利用设定好的图像属性去画出源图像