改变图像的颜色

时间:2013-10-05 20:08:12

标签: vb.net

我正在使用vb.net 2008创建一个Windows应用程序,因为我想以编程方式更改图像的颜色。对于例如将白色更改为绿色。你能帮我么。提前谢谢。

2 个答案:

答案 0 :(得分:6)

这是基本的想法,您可以根据自己的需要进行修改。创建一个名为pic的按钮和图片框。将此代码放在按钮单击事件中,并用您选择的图像替换路径。您只需要在if语句中更改代码以创建某些颜色的阈值。要计算出阈值的RGB值,您可以使用绘画程序或在线颜色来找到所需颜色范围的正确值。

    Dim x As Integer
    Dim y As Integer
    Dim red As Byte
    Dim green As Byte
    Dim blue As Byte

    Dim img As Bitmap = New Bitmap("D:\dump\raycaster\Debug\pics\redbrick.png")

    For x = 0 To img.Width - 1
        For y = 0 To img.Height - 1
            red = img.GetPixel(x, y).R
            green = img.GetPixel(x, y).G
            blue = img.GetPixel(x, y).B
            If red > 128 Then
                img.SetPixel(x, y, Color.Green)
            End If
            If blue > 200 And green > 200 Then
                img.SetPixel(x, y, Color.Red)
            End If
        Next
    Next

    pic.Image = img

特别是将白色变为绿色,就像你说的那样:

If red > 240 And green > 240 And blue > 240 Then
    img.SetPixel(x, y, Color.Green)
End If

我做了240,因为很多时候你不会有纯白色。

答案 1 :(得分:1)

Synaps3提供了一种很好的逐像素方法,该方法最适合固定调色板调整,但是如果您想给整个图像绘制多种不同阴影,同时又保留这些差异,则需要创建一个颜色矩阵您稍后将其分配为any of the various overloads of DrawImage的“ imageattributes”参数。

ImageAttributes变量到底是什么?这只是一种特殊的数据类型,它指定图像对象的重新着色和伽玛信息。)

颜色矩阵必须是5 x 5的单格网格,可以像这样一口气声明和定义:

Private ReadOnly normal_cm As New Drawing.Imaging.ColorMatrix(New 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, 1}})

上面的颜色矩阵是应用于您所做的所有操作的“默认”颜色矩阵,所有颜色(和alpha)都以其原始颜色100%显示,并且不进行任何修改或旋转。第一个single()是红色缩放因子,第二个是绿色的缩放因子,第二个是蓝色的缩放因子,第二个是alpha通道和the last are your translation scaling factors。如果您希望白色变为绿色,则有多种实现方法,但是最简单的方法是尝试使用第二个内部单点数组中的值,例如:

Private ReadOnly green_cm As New Drawing.Imaging.ColorMatrix(New Single()() _
    {New Single() {0.8, 0, 0, 0, 0},  ' reduces red values by 20%
    New Single() {0, 1.2, 0, 0, 0},   ' increases green by 20%
    New Single() {0, 0, 0.8, 0, 0},   ' reduces blue by 20%
    New Single() {0, 0, 0, 1, 0},     ' transparency stays the same
    New Single() {0, 0, 0, 0, 1}})

一旦准备好颜色矩阵,就需要一个适当的图像属性变量:

Private myImgAttr As New Drawing.Imaging.ImageAttributes

我通常会在我的方法内部通过程序逻辑来决定使用哪种颜色矩阵,如果您在运行过程中“变暗”了变量,则以后需要处置ImageAttributes以避免内存泄漏。我将颜色矩阵应用于图像属性变量,然后将图像属性传递给DrawImage命令,如下所示:

Dim baseImage As Drawing.Image = Drawing.Image.FromFile("base\image\file.png")
Dim gfx As Drawing.Graphics = Drawing.Graphics.FromImage(baseImage )
myImgAttr.SetColorMatrix(green_cm)
gfx.DrawImage(Drawing.Image.FromFile("path\to\file.png"), targetRectangle,
    0, 0, srcImageWidth, srcImageHeight,
    Drawing.GraphicsUnit.Pixel, myImgAttr)

我有时还会使用其他一些DrawImage重载,但总的来说,这是最灵活的。如果您要制作游戏,则可以使用第一个BaseImage从角色的身体精灵开始,然后可以在顶部绘制白色服装图片,作为团队的颜色,变成绿色,红色或您喜欢的任何颜色,然后返回baseImage可以将其分配给您的单位或在地图上绘制等等。