0

我正在尝试使用 Feistel 密码对图像进行编码。这个想法是获取一个图像文件,逐字节读取图像,用我的 Feistel 密码对每个字节进行编码,然后用密码生成的编码字节重新创建一个新图像。

不幸的是,我发现大多数常见的图像格式都使用标头,一旦编码,就会使编码的图像损坏。

查看 PIL 包,我发现该PIL.Image.frombytes函数能够在给定对象的情况下创建图像BytesIO对象。使用图像对象,我可以使用save函数重新创建图像

我现在的问题是,如何打开图像并读取我需要使用 Feistel 密码处理的实际图像有效负载(以字节为单位)。

如果我使用代码

with open('image.jpg', 'rb') as file:
    data = file.read()

我阅读了整个文件,包括我不需要的标题

4

1 回答 1

0

最好的解决方案是自己对图像的每个像素进行编码,然后用编码的新像素重新创建图像

#open image file to process
im = Image.open(file_name, 'r')
#get pixel value
pix_val = list(im.getdata())
#get dimensions 
width, height = im.size

tmp = 0
#create image file processed
imge = Image.new("RGB", (width, height))
pix = imge.load()  #load the new pixel color

# create image encoded
for x in range(height):
  for y in range(width):
    #double loop to encode every pixel
    pix[y,x] = (encode(pix_val[tmp][0]),encode(pix_val[tmp][1]),encode(pix_val[tmp][2]))
    tmp += 1

请注意,该函数encode应该是您的 Feistel 密码函数。在这种情况下,它需要一个 8 位整数并返回一个 8 位整数(这是每个像素颜色的表示,但可以根据您的需要进行编辑

于 2021-04-22T21:33:01.257 回答