1

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

4

2 回答 2

7

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

于 2013-10-06T06:54:07.897 回答
2

Synaps3 提供了一种很好的逐像素方法,最适合固定调色板调整,但是如果您只想对具有许多不同阴影的整个图像进行着色,同时仍保留这些差异,您将需要创建一个颜色矩阵稍后将指定为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 通道,最后一个是您的平移缩放因子。如果你想让白色变成绿色,有几种方法可以实现,但最简单的方法是试验第二个内部单数数组中的值,如下所示:

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

我通常在我的方法中通过程序逻辑决定使用哪个颜色矩阵,如果你动态地“调暗”你的变量,你需要在之后 .dispose 处理 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 将其分配给您的单位或将其绘制在地图上等。

于 2020-07-23T19:08:09.673 回答