微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

笔记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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐