【问题标题】:Changing least significant bit in pixel更改像素中的最低有效位
【发布时间】:2017-02-07 03:36:00
【问题描述】:

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

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

红色通道的样本数据(我想设置位):

[0][0] = 01010111
[0][1] = 01010110
[0][2] = 01011110
[0][3] = 11111011
[0][4] = 01011010
[0][5] = 01100110
[0][6] = 01010101
[0][7] = 11010101

我想把粗体字改成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")

我该怎么做?

【问题讨论】:

标签: vb.net


【解决方案1】:

鉴于您的评论“我需要更改最后一位”,您需要做的是从图像中获取字节,将其最低位设置为零(And &amp;FE),从字节中提取适当的位您想将最低位设置为(将&gt;&gt;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

您没有说要从替换中设置位的方式,所以我使用 values-to-set-it-to 中的最高位作为第一个字节。如果您希望反过来,请适当修改代码。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-23
    • 2020-09-07
    • 2014-05-20
    • 1970-01-01
    • 2010-10-19
    • 2015-05-07
    • 1970-01-01
    • 2017-04-24
    相关资源
    最近更新 更多