向图像png添加一些比特流

Add some bit stream to image png

我已经使用以下程序将 png 图像转换为基本 2 位序列

from PIL import Image, ImageFile
from io import BytesIO
out = BytesIO()

with Image.open("download.png") as img:
img.save(out, format="png")
image_in_bytes = out.getvalue()
encoded_b2 = "".join([format(n, '08b') for n in image_in_bytes])
w = open("bitofimage", "w")
w.write(encoded_b2)

因此,是一个基数为 2 的位序列

我创建了一个 CRC 过程并在其后面的位缝中添加了 8 位。

然后使用此代码转换回 PNG 图片

a = open("bitadd_crc","r") //This Stream of bit has add with 8 bit crc
konv = a.read()
decoded_b2 = [int(konv[i:i + 8], 2) for i in range(0, len(konv), 8)]
with open('YANGDIKIRIM.png', 'wb') as f:
f.write(bytes(decoded_b2))

f.close()
w.close()

再次转换成图片后可以,但是当我再次解压成一系列bits时,之前添加的8位CRC无法读取,变成了图片的一部分。谁能帮我找到解决办法? 希望对我完成期末作业有所帮助

感谢您的帮助

您可以将 CRC 附加到 PNG 文件(作为二进制文件)的末尾,而不是将 CRC 添加到图像数据。
读取新文件(末尾有几个字节)的应用程序将忽略冗余字节。

  • 将download.png的内容复制到bitadd_crc.png
  • 将 CRC(两位十六进制数字或其他格式)写入 bitadd_crc.png 文件的末尾。

bitadd_crc.png 和 download.png 的唯一区别是最后两个字节。


这是一个代码示例:

from PIL import Image, ImageFile
from io import BytesIO
import crc8

out = BytesIO()

with Image.open("download.png") as img:
    img.save(out, format="png")
    image_in_bytes = out.getvalue()
    encoded_b2 = "".join([format(n, '08b') for n in image_in_bytes])
    #w = open("bitofimage", "w")
    #w.write(encoded_b2)

hash = crc8.crc8()
hash.update(image_in_bytes)  # Compute CRC using crc8 https://pypi.org/project/crc8/ (just for the example).
crc = hash.hexdigest().encode('utf8')

# Writing the CRC to bitadd_crc.png
################################################################################
# Copy the content of download.png to bitadd_crc.png and Write the CRC as two HEX digits, to the end of bitadd_crc.png file
# The only difference of bitadd_crc.png and download.png is going to be the last two bytes
with open('bitadd_crc.png', 'wb') as f:
    with open('download.png', 'rb') as orig_f:
        f.write(orig_f.read())  # Read the content of download.png and write it to bitadd_crc.png

    f.write(crc) # Write the CRC as two HEX digits, to the end of bitadd_crc.png file


# Reading the CRC from bitadd_crc.png
################################################################################
with open('bitadd_crc.png', 'rb') as f:
    f.seek(-2, 2)  # # Go to the 2rd byte before the end
    crc_read = f.read(2)  # Read the last two bytes from the binary file.

print('crc = ' + crc.decode('utf8'))
print('crc_read = ' + crc_read.decode('utf8'))

思考点:
考虑在解码后的 PNG 像素(以字节为单位)上计算 CRC:

  • 按照 here 所述将图像转换为 NumPy 数组。
  • 计算扁平化 NumPy 数组的 CRC。
  • 将 CRC 添加为描述的文件元数据

在建议的过程中,CRC 仅应用图像的像素(不适用于 PNG 文件的二进制内容)。