2017-02-04 74 views
0

我需要設置某些字節(來自圖像)的最低有效位。更改像素中的最低有效位

例如,我有一個寬度爲w和高度爲h的圖像。每個元素[w] [h]是一個像素。

對於紅色信道的樣本數據(其中,我想要設置的比特):

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

我想改變該位以粗體到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") 

我該怎麼做?

+0

我有點重新寫你的問題,以使其更清晰。如果你覺得它不代表你想問什麼,請隨時編輯它。 –

+0

您可能會發現[將圖像RGB值的lsb值給出不一致的值](http://stackoverflow.com/a/26616856/1115360)可用。 –

回答

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 

你沒有說你想設置的位哪種方式從r所以我通過使用值到設置它的最高位來完成第一個字節。如果你希望他們反過來修改代碼。

真的不想將字節轉換爲字符串來執行位操作,因爲它會很慢。

[我用VS 2017年RC的二進制文字的方便 - 我包括爲十六進制格式的意見,爲您測試這個]