Vb.net 改变图像的颜色

Vb.net 改变图像的颜色,vb.net,Vb.net,我正在使用vb.NET2008制作一个windows应用程序,因为我想通过编程更改图像的颜色。例如,将白色改为绿色。你能帮帮我吗。提前感谢。这是基本想法,您可以根据需要进行修改。创建一个按钮和一个名为pic的pic框。将此代码放置在按钮单击事件中,并用您选择的图像替换路径。您只需要修改if语句中的代码,以创建特定颜色的阈值。要计算阈值的RGB值,您可能可以使用绘制程序或联机颜色工具为所需的颜色范围找到正确的值 Dim x As Integer Dim y As Integer

我正在使用vb.NET2008制作一个windows应用程序,因为我想通过编程更改图像的颜色。例如,将白色改为绿色。你能帮帮我吗。提前感谢。

这是基本想法,您可以根据需要进行修改。创建一个按钮和一个名为pic的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,是因为很多时候你不会选择纯白色。

这里是基本的想法,你可以根据自己的需要进行修改。创建一个按钮和一个名为pic的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,是因为很多时候你不会选择纯白色。

Synaps3提供了一种很好的逐像素方法,它最适合固定调色板调整,但如果你想在保持这些差异的同时,对许多不同色调的整张图像进行着色,您需要创建一个颜色矩阵,稍后将其指定为的“imageattributes”参数

ImageAttributes变量是什么?它只是一种专门的数据类型,用于指定图像对象的重新着色和gamma信息。)

颜色矩阵必须是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%的原始颜色显示,并且不会以任何方式修改或旋转。第一个单个()是红色的比例因子,下一个是绿色的,下一个是蓝色的,下一个是alpha通道的和。如果您希望白色变为绿色,有几种方法可以实现,但最简单的方法是尝试第二个单选内部数组中的值,如下所示:

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重载,但总的来说,这是最灵活的。如果你正在制作一个游戏,你可以使用第一个基本图像从你的角色的身体精灵开始,然后你可以在上面画一张白色的衣服图片作为你团队的颜色,颜色可以是绿色或红色或任何你喜欢的颜色,然后你返回你的基本图像将其分配给你的单位或在地图上绘制,等等

Synaps3提供了一种很好的逐像素方法,它最适合固定调色板调整,但是如果您只想在保留这些差异的同时为许多不同色调的整个图像着色,您需要创建一个颜色矩阵,稍后将其指定为的“imageattributes”参数

ImageAttributes变量是什么?它只是一种专门的数据类型,用于指定图像对象的重新着色和gamma信息。)

颜色矩阵必须是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%的原始颜色显示,并且不会以任何方式修改或旋转。第一个单个()是红色的比例因子,下一个是绿色的,下一个是蓝色的,下一个是alpha通道的和。如果您希望白色变为绿色,有几种方法可以实现,但最简单的方法是尝试第二个单选内部数组中的值,如下所示:

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重载,但总的来说,这是最灵活的。如果你正在制作一个游戏,你可以使用第一个基本图像从你的角色的身体精灵开始,然后你可以在上面画一张白色的衣服图片作为你团队的颜色,颜色可以是绿色或红色或任何你喜欢的颜色,然后你返回你的基本图像将其分配给你的单位或在地图上绘制,等等

你的问题相当复杂(得到准确的结果)。这里不仅列出了大量明确定义的颜色,还有大量你称之为“绿色”的组合。做一些研究,自己做一些努力,当你的想法更清晰时(并能展示你所做的事情)最好回到这里。看看我的答案,这是c#的,但你应该能从中得到一些想法。你的问题相当复杂(得到准确的结果)。这里不仅列出了大量明确定义的颜色,而且还有大量你所称的颜色组合