Как получить младшие значащие биты из многих байтов? - PullRequest
1 голос
/ 06 апреля 2019

Я пытаюсь получить lsb из строки изображения, мне удалось получить здесь:

from PIL import Image
import sys

challengeImg = Image.open('image.png')
pixels = challengeImg.load()
for x in range(2944):
    red = (pixels[x,310][0])
    bred = format(red,"b")
    #print(green)
    #print(bred)
    green = (pixels[x,310][1])
    bgreen = format(green,"b")
    #print(bgreen)
    #print(green)

Ну, до этого я все в порядке, но теперь моя проблема, мне удалось создатьследующий код:

num = 10100001
n = 0
lsb = num >> n &1
print(lsb)

Это работает, но только с одним байтом, я полагаю, что с for я могу достичь чего-то, но я очень новичок, и мне не удалось заставить его работать, как яможно сделать, чтобы извлечь lsb из каждого байта в строке пикселей красного канала (или зеленого цвета, я думаю, что это та же самая процедура)?

Мне кажется, что я мог бы использовать словарь длясгруппировать биты в байтах (1: 10011001, 2: 01100110 ...) и затем использовать цикл для применения кода lsb в каждом байте, в любом случае, я не знаю, как я могу это сделать, и я не думаю, что это лучший способ (может быть, это даже не верно).

У меня есть .png изображение 2944x1912, которое содержит информацию, скрытую в младших разрядах, первый код, который я помещаю, - это сценарий, который я разрабатываю, и пока чтоэто получить информацию о пикселеs красного канала в строке 310 и преобразуйте их в двоичный.

Второй код - это код для получения lsb байта, который мне нужно реализовать в первом коде, поэтому второй код должен как-тосгруппируйте все биты в 8 и выберите последний, который я сохраняю в переменной, в результате (2944/8 = 368 = 368 байт.)

Ответы [ 2 ]

0 голосов
/ 06 апреля 2019

Это работает, вот код;

from PIL import Image
import sys

challengeImg = Image.open('challenge.png')
pixels = challengeImg.load()
for x in range(2944):
    red = (pixels[x,310][0])
    bred = format(red,"b")
    #print(green)
    #print(bred)
    green = (pixels[x,310][1])
    bgreen = format(green,"b")
    #print(bgreen)
    #print(green)
    rnum = format(red,"b")
    rnum_string = str(rnum)
    rlsb_string = rnum_string[len(rnum_string)-1]
    rlsb = int(rlsb_string)
    print(rlsb, end="")

Спасибо!

0 голосов
/ 06 апреля 2019

Решение, которое пришло ко мне, может быть не самым оптимальным.Я буду искать лучшее решение, если оно не достаточно, но в то же время:

num = 10100001
num_string = str(num)
lsb_string = num_string[len(num_string)-1]
lsb = int(lsb_string)
print(lsb)

# output: 1
...