笔记8:Color

在Pen及Brush中都会用到Color结构


常用的是由ARGB组成。A表明透明度,R红色,G绿色,B蓝色。


系统又定义了很多种颜色。


Color属性


'01.Color的构造与方法
'构造:已知构造与自定义构造
Imports System.Drawing
Imports System.Drawing.Text

Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click
        Dim col1 As Color = Color.Red
        Dim col2 As Color = Color.FromArgb(100,Color.Blue)
        Dim col3 As Color = Color.FromKNownColor(KNownColor.Chocolate) '从已知颜色中获取(如:系统标题色,窗体背景色等)
        Dim col4 As Color = Color.FromName("InfoText") '取kNownColor中字串颜色,若无此字串,则取色为FromArgb(0,0)

        Dim br1 As New SolidBrush(col1)
        Dim br2 As New SolidBrush(col2)
        Dim br3 As New SolidBrush(col3)
        Dim br4 As New SolidBrush(col4)

        Dim s As String
        Dim gr As Graphics = Me.CreateGraphics

        gr.FillEllipse(br1,New Rectangle(0,100,100))
        gr.FillEllipse(br2,New Rectangle(50,100))
        gr.FillEllipse(br3,New Rectangle(25,50,100))

        s = "亮度:" & col1.GetBrightness & vbCrLf _
            & "哈希码:" & col1.GetHashCode & vbCrLf _
            & "色调:" & col1.GetHue & vbCrLf _
            & "饱合度:" & col1.GetSaturation & vbCrLf _
            & "32位ARGB:" & col1.ToArgb & vbCrLf _
            & "实例Type:" & col1.GetType.ToString & vbCrLf _
            & "可读字串:" & col1.ToString
        gr.DrawString(s,Me.Font,br4,New Point(10,150))
    End Sub
End Class





'02、枚举颜色
'KNownColor是枚举类型,索引0-167,通过FromKNownColor把索引转成对应颜色Color
Imports System.Drawing
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click
        Dim col(15) As KNownColor
        Dim count As Int32 = 0
        Dim myColor As Color = Color.FromArgb(255,200,100)
        Dim sel As KNownColor
        Dim oneColor As Color

        Dim gr As Graphics = Me.CreateGraphics
        For sel = 0 To KNownColor.YellowGreen '枚举从0索引,每次增1递加(kNowncolor共168种,最后yellowgreen为167)
            oneColor = Color.FromKNownColor(sel)
            If oneColor.GetBrightness < myColor.GetBrightness Then
                col(count) = sel
                count += 1
                If count > 15 Then Exit For
            End If
        Next

        Dim x,y As Int32
        x = y = 0
        For count = 0 To 15
            Dim br As New SolidBrush(Color.FromKNownColor(col(count))) 'kNownColor实质上int32
            gr.FillRectangle(br,New Rectangle(x,y,20))
            If y < 210 Then
                y += 30
            Else
                x = 100
                y += 30 - 210
            End If
        Next
    End Sub
End Class








ToArgb方法
方法返回Color对象的32位Argb值(int32),32位的Argb值的字节顺序是AARRGGBB,
其中:AA是alpha分量值,r,g,b分别对应红、绿、蓝分量





RGB色及多色渐变
可以用FromArgb取得自定义颜色
通过ColorBlend设置好多色及位置数组后,在渐变笔刷中设置Interpolation多色渐变


Imports System.Drawing
Imports System.Drawing.drawing2d

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click
        Dim gr As Graphics = Me.CreateGraphics

        '渐变方向(由起点到终点)
        Dim StartPoint As New Point(20,110)
        Dim EndPoint As New Point(140,110)

        '多色数组及位置比例数组
        Dim myColors As Color() = {Color.FromArgb(0,255,255),Color.FromArgb(0,_
                                   Color.FromArgb(255,0),Color.FromArgb(255,255)}
        Dim myPositions As Single() = {0.0F,0.2F,0.4F,0.6F,0.8F,1.0F}'0-1,必须从0开始到1结束

        Dim myBlend As New ColorBlend '定义多种颜色及位置比例的对象
        myBlend.Colors = myColors
        myBlend.Positions = myPositions

        Dim lgbr As New LinearGradientBrush(StartPoint,EndPoint,Color.Green,Color.Red)
        lgbr.InterpolationColors = myBlend '设置多色渐变

        gr.FillEllipse(lgbr,100))
        gr.DrawLine(Pens.Black,StartPoint,EndPoint)
    End Sub
End Class







复合Alpha (制作透明图)
生成的位图,在另一处显示时,此位图是透明还是不透明。
若要透明则须复合Alpah混合模式控制。


此时,需要构造空白Bitmap对象,并由它构造Graphics对象。
这时的Graphics对象的CompositingMode属性(枚举)指示:
Sourcecopy 指定显示颜色时,将改写背景色(不透明)
SourceOver 指定显示颜色时,将与背景色混合(透明)


'05、复合Alpha,即生成透明图
Imports System.Drawing
Imports System.Drawing.drawing2d
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click
        Dim gr As Graphics = Me.CreateGraphics

        Dim bt As New Bitmap(180,100)
        Dim btgr As Graphics = Graphics.FromImage(bt)

        Dim redbr As New SolidBrush(Color.FromArgb(210,100))
        Dim grebr As New SolidBrush(Color.FromArgb(210,200))

        '在位图上画
        btgr.CompositingMode = drawing2d.CompositingMode.sourceOver '关键:设置透明
        btgr.FillEllipse(redbr,150,70)
        btgr.FillEllipse(grebr,30,70)

        Dim colbr As New SolidBrush(Color.Wheat)
        gr.CompositingQuality = CompositingQuality.GammaCorrected '复合质量控制:灰度校正

        '画三个矩形组成一个大的矩形图,用于后面再成图时显示透明效果
        gr.FillRectangle(colbr,60,100)
        colbr.Color = Color.Black
        gr.FillRectangle(colbr,260,100)
        colbr.Color = Color.Tan
        gr.FillRectangle(colbr,320,100)

        '把位图画上
        gr.DrawImage(bt,0)  '背景为窗体时
        gr.DrawImage(bt,0) '背景为矩形(三个矩形组成)
        PictureBox1.Image = bt
        bt.Save("D:\1.jpg")
    End Sub
End Class







06、颜色矩阵设置图像Alpha值(透明)
Bitmap类(继承自Image类)和ImageAttribute类可设置和获取Alpha值。
1、用ImageAttributes类修改图形的Alpha值
2、用Bitmap类SetPixel设置单个像素值


由于上面修改了Alpha值,所以也可以有透明效果


'06、矩阵调整设置Alpha值,呈现透明效果

Imports System.Drawing
Imports System.Drawing.Imaging
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click
        Dim gr As Graphics = Me.CreateGraphics
        Dim bm As New Bitmap("D:\1.jpg")

        '颜色调整矩阵5X5,分别为A,R,G,B,W,其中W固定为1
        Dim MatrixItems As Single()() = {New Single() {1,0},New Single() {0,1,_
                                         New Single() {0,1}}
        Dim colMatr As New Imaging.ColorMatrix(MatrixItems)
        Dim imageAtt As New ImageAttributes

        imageAtt.SetColorMatrix(colMatr,ColorMatrixFlag.Default,ColorAdjustType.Bitmap)
        gr.DrawLine(New Pen(Color.Black,25),New Point(160,35),New Point(270,35))
        gr.DrawImage(bm,bm.Width,bm.Height),0.0F,bm.Height,GraphicsUnit.Pixel,imageAtt)
    End Sub
End Class







07、线性渐变的Gamma校正

前面多次用线性渐变举例,下面将使用线性渐变笔刷的Gamma校正。
Gamma校正,会使颜色的亮度更均匀。认下,Gamma校正是禁止的。



'07、线性渐变
Imports System.Drawing
Imports System.Drawing.drawing2d
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click
        Dim gr As Graphics = Me.CreateGraphics
        Dim lgbr As New LinearGradientBrush(New Point(0,New Point(300,Color.Black,Color.Wheat)

        gr.FillRectangle(lgbr,10,50))
        lgbr.GammaCorrection = True '启用灰度校正,颜色的亮度更均匀
        gr.FillRectangle(lgbr,70,50))
    End Sub
End Class

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...