将“1”和“0”转换为其二进制等效值以生成JPG

时间:2013-11-23 11:57:55

标签: python image-processing jpeg binary-data

我想将包含“1”和“0”的二进制等效文件重新转换回其JPG格式(或将其转换回二进制格式)

即我有一个文件,其中包含我使用以下函数从jpg图像转换的所有1和0

    def convert_binary(inpath, outpath):
    byte2str = ["{:08b}".format(i) for i in range(256)]
    with open(inpath, "rb") as fin:
        with open(outpath, "w") as fout:
            data = fin.read(1024) 
            while data:
                for b in map(ord, data):
                    fout.write(byte2str[b])
                data = fin.read(1024)

    convert_binary("image.jpg", "binary_file.txt")

感谢Tim Peters

我现在想要将它(1和0)转换回原始图像,任何帮助都会感激不尽。

P.S:我真的很抱歉这些琐碎的问题,我是一个生物技术专业,python编程不是我的强项。我正在为我的论文试验一个应用程序并且卡住了。

2 个答案:

答案 0 :(得分:1)

与史蒂夫的回答一脉相承:

with open('input', 'rb', 1024) as fin, open('output', 'wb') as fout:
    fout.writelines(chr(int(chunk, 2)) for chunk in iter(lambda: fin.read(8), ''))

答案 1 :(得分:0)

您可以使用x = byte2str[b]撤消int(x,2),然后使用ord撤消chr。您的.txt文件包含原始jpg每个字节的8个字符。所以你的代码应该是这样的:

data = fin.read(1024)
while data:
    for i in range(0, len(data), 8):
        fout.write(chr(int(data[i:i+8], 2)))
    data = fin.read(1024)

不幸的是,read不能保证准确返回您要求的字节数,因此允许返回更少的字节数。所以我们需要使事情复杂化:

data = fin.read(1024)
while data:
    if len(data) % 8 != 0:
        # partial read
        endidx = len(data) - len(data) % 8
        leftover = data[endidx:]
        data = data[:endidx]
        if len(data) == 0:
            raise ValueError('invalid file, length is not a multiple of 8')
    for i in range(0, len(data), 8):
        fout.write(chr(int(data[i:i+8], 2)))
    data = leftover + fin.read(1024)

有更好的方法可以将二进制文件表示为文本,例如base64编码。