更改像素

时间:2017-02-04 15:47:52

标签: vb.net

我需要设置某些字节的最低有效位(来自图像)。

例如,我有宽度为w和高度为h的图像。每个元素[w] [h]都是一个像素。

红色通道的示例数据(我想设置位):

  

[0] [0] = 0101011 1
  [0] [1] = 0101011 0
  [0] [2] = 0101111 0
  [0] [3] = 1111101 1
  [0] [4] = 0101101 0
  [0] [5] = 0110011 0
  [0] [6] = 0101010 1
  [0] [7] = 1101010 1

我想将粗体文本中的位更改为00101010。

到目前为止我的代码:

  Dim img As New Bitmap(TextBox1.Text)

    For w As Integer = 0 To img.Width - 1
        For h As Integer = 0 To img.Height - 1
            Dim pixel As Color = img.GetPixel(w, h)

            If w < 4 AndAlso h < TextBox2.Text.Length Then
                Dim pix As Integer = pixel.R
                Dim pix2bin As String = Convert.ToString(pix, 2).PadLeft(8, "0")

我该怎么做?

1 个答案:

答案 0 :(得分:0)

根据您的评论“我需要更改最后一位”,您需要做的是从图像中取出字节,将其最低位设置为零(And &FE),从中提取相应的位要设置最低位的字节(向右移>>And用1)然后Or将它们组合在一起:

Option Strict On

Module Module1

    Sub Main()
        ' {&H57, &H56, &H5e, &Hfb, &H5a, &H66, &H55, &Hd5}
        Dim bb As Byte() = {&B1010111, &B1010110, &B1011110, &B11111011, &B1011010, &B1100110, &B1010101, &B11010101}
        Dim lowestBits As Byte = &B101010 ' &H2A

        ' output before state:
        Console.WriteLine(String.Join(" ", bb.Select(Function(b) Convert.ToString(b, 2).PadLeft(8, "0"c))))

        Dim bitPosition = 7
        For i = 0 To bb.Length - 1
            bb(i) = CByte((bb(i) And &HFE) Or ((lowestBits >> bitPosition) And 1))
            bitPosition = (bitPosition + 7) Mod 8 ' equivalent to subtract one and keep it in the range [0, 7]
        Next

        ' output after state:
        Console.WriteLine(String.Join(" ", bb.Select(Function(b) Convert.ToString(b, 2).PadLeft(8, "0"c))))
        Console.ReadLine()

    End Sub

End Module

输出:

01010111 01010110 01011110 11111011 01011010 01100110 01010101 11010101
01010110 01010110 01011111 11111010 01011011 01100110 01010101 11010100

你没有说你想用哪种方式设置替换的位,所以我是通过使用值到set-it-to的第一个字节的最高位来实现的。如果您希望它们相反,请相应地修改代码。

真的不希望将字节转换为字符串来对它们执行位操作,因为它会非常慢。

[我使用VS 2017 RC以方便二进制文字 - 我包含了十六进制格式的注释,供您测试。]