2017-02-04 6 views
0

Ich muss die niedrigstwertigen Bits einiger Bytes (aus einem Bild) setzen.Ändern des niedrigstwertigen Bits in Pixel

Zum Beispiel habe ich ein Bild der Breite w und Höhe h. Jedes Element [w] [h] ist ein Pixel.

Beispieldaten für den roten Kanal (wobei I die Bits gesetzt werden sollen):

[0] [0] = 0101011
[0] [1] = 0101011
[0] [2] = 0101111
[0] [3] = 1.111.101
[0] [4] = 0 0.101.101
[0] [5] = 0.110.011
[0] [6] = 0101010
[0] [7] = 1101010

I ändern möchten die Bits in fett gedruckten Text in 00101010.

Mein Code so weit:

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") 

Wie kann ich das tun?

+0

ich etwas neu geschrieben Ihre Frage es klarer zu machen. Wenn Sie das Gefühl haben, dass es nicht das darstellt, was Sie fragen wollten, können Sie es gerne weiter bearbeiten. –

+0

Möglicherweise finden Sie [Ändern des lsb-Werts des Bild-rgb-Werts mit inkonsistentem Wert] (http://StackOverflow.com/a/26616856/1115360), um von Nutzen zu sein. –

Antwort

0

Angesichts Ihres Kommentars "Ich muss das letzte Bit ändern", was Sie tun müssen, ist das Byte aus dem Bild nehmen, setzen Sie das niedrigste Bit auf Null (And &FE), extrahieren Sie das entsprechende Bit aus dem Byte Sie wollen die niedrigsten Bits auf (Verschiebung nach rechts >> und And mit 1) dann Or sie zusammen:

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 

Ausgänge:

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

Sie nicht sagen, welche Art und Weise Sie die Bits setzen wollten von der r Ich platziere es, indem ich das höchste Bit aus den Werten für das erste Byte verwende. Ändern Sie den Code entsprechend, wenn Sie umgekehrt möchten.

Sie wirklich möchten nicht Bytes in Zeichenfolgen konvertieren, um Bitoperationen auf ihnen durchzuführen, weil es sehr langsam sein wird.

[I VS 2017 RC für die Bequemlichkeit der binären Literale verwendet. - Ich auch die Kommentare für Hex-Format für Sie, dies zu testen]

Verwandte Themen