[英]Choosing color for new bitmap based on another two bitmaps
我正在尝试创建一个基本的隐写术程序。 基本上,我将一张图片上传到两个picture boxes
。 我用它们两个创建了一个位图,并能够通过单击以下代码来更改第二个picture box
的颜色:
Private Sub PictureBox1_MouseClick(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseClick
Dim MyColor As Color
Dim bm As Bitmap = Me.PictureBox1.Image
Dim bm2 As Bitmap = Me.PictureBox2.Image
MyColor = bm.GetPixel(e.X, e.Y)
Dim g As Graphics = PictureBox2.CreateGraphics
bm2.SetPixel(e.X, e.Y, Color.Black)
PictureBox2.Image = bm2
MessageBox.Show( _
"Pixel x=" & e.X & ", y=" & e.Y & ", color=" & MyColor.ToString, _
"Color", _
MessageBoxButtons.OK, _
MessageBoxIcon.Information)
End Sub
这可以更改第二个位图的像素。 当存储像素时,我使用以下代码:
Private Sub SaveToArray_Click(sender As Object, e As EventArgs) Handles SaveToArray.Click
Dim bm As Bitmap = Me.PictureBox1.Image
Dim bm2 As Bitmap = Me.PictureBox2.Image
ReDim ColorArray(bm.Size.Height - 1, bm.Size.Width - 1)
ReDim colorarray2(bm2.Size.Height - 1, bm2.Size.Width - 1)
Dim i, j, k As Integer
For i = 0 To bm.Size.Height - 1
For j = 0 To bm.Size.Width - 1
ColorArray(i, j) = bm.GetPixel(j, i)
colorarray2(i, j) = bm2.GetPixel(j, i)
Next
Next
End Sub
上面的两个代码都可以正常工作。 问题是当我想比较位图中的两个数组时。 我想比较数组,对于每个相同颜色的像素,我希望像素颜色等于第三个数组的color.black。 如果像素颜色不匹配,我希望第三个数组的像素颜色等于color.white。 然后,我想采用该第三数组并绘制第三位图。 以下代码是我遇到的麻烦:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim i, j As Integer
Dim bm As Bitmap = Me.PictureBox1.Image
Dim bm2 As Bitmap = Me.PictureBox2.Image
For i = 0 To bm.Size.Height - 1
For j = 0 To bm.Size.Width - 1
If ColorArray(i, j) = colorarray2(i, j) Then
checkarray(i, j) = Color.Black
Else
checkarray(i, j) = Color.White
End If
Next
Next
Dim bm3 As Bitmap
For i = 0 To bm.Size.Height - 1
For j = 0 To bm.Size.Width - 1
bm3.SetPixel(i, j, checkarray(i, j))
Next
Next
PictureBox2.Image = bm3
End Sub
我特别在以下方面遇到问题:
For i = 0 To bm.Size.Height - 1
For j = 0 To bm.Size.Width - 1
If ColorArray(i, j) = colorarray2(i, j) Then
checkarray(i, j) = Color.Black
Else
checkarray(i, j) = Color.White
End If
Next
Next
我得到未处理的NullReferenceException和对象引用未设置为对象的实例。
任何帮助将不胜感激。 谢谢!
编辑:
我这样声明数组:
Dim ColorArray(,) As Color
Dim colorarray2(,) As Color
Dim checkarray(,) As Color
您应该设置检查数组的大小:
ReDim checkarray(bm.Size.Height - 1, bm.Size.Width - 1)
另外,由于尚未创建对象,因此您将遇到“ bm3”问题。 将其更改为:
Dim bm3 As Bitmap = new Bitmap(bm.Size.Width, bm.Size.Height)
编辑:
您还必须切换i和j:
更改:
bm3.SetPixel(i, j, checkarray(i, j))
至:
bm3.SetPixel(j, i, checkarray(i, j))
通过首先切换i和j的大部分并将问题中的最后一个代码块更改为此,我发现这要容易得多:
Dim i, j As Integer
Dim bm As Bitmap = Me.PictureBox1.Image
Dim bm2 As Bitmap = Me.PictureBox2.Image
Dim bm3 As Bitmap = Me.PictureBox2.Image
ReDim checkarray(bm.Size.Width - 1, bm.Size.Height - 1)
For i = 0 To bm.Size.Height - 1
For j = 0 To bm.Size.Width - 1
If ColorArray(j, i) = colorarray2(j, i) Then
bm3.SetPixel(j, i, Color.Black)
Else
bm3.SetPixel(j, i, Color.White)
End If
Next
Next
PictureBox2.Image = bm3
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.