繁体   English   中英

根据另外两个位图为新的位图选择颜色

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM