我正在使用vb.net 2008创建一个Windows应用程序,因为我想以编程方式更改图像的颜色。对于例如将白色更改为绿色。你能帮我么。提前谢谢。
答案 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可以将其分配给您的单位或在地图上绘制等等。