如何获得许多字节的最低有效位?

2024-10-03 13:31:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着从图像的线条中得到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代码,无论如何,我不知道我怎么能做到这一点,我不认为这是最好的方法(也许它甚至是无效的)。你知道吗

我有一个2944x1912的.png图像,其中包含隐藏在最低有效位中的信息,我输入的第一个代码是我正在开发的脚本,到目前为止,它所做的是获取第310行中红色通道像素的信息,并将其转换为二进制。你知道吗

第二个代码是获取我需要在第一个代码中实现的一个字节的lsb的代码,因此第二个代码应该以某种方式将所有位组合在8中,并选择最后一个位,以便我保存在一个变量中,从而得到(2944/8=368=368字节)


Tags: 代码图像imageimportfor字节pnggreen
2条回答

我想到的解决方案可能不是最理想的。如果还不够,我会寻找更好的解决方案,但同时:

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

# output: 1

它工作,这就是代码

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

谢谢!你知道吗

相关问题 更多 >