如何将ascii编码图像数据解码为图像文件?

时间:2018-06-11 20:23:30

标签: python python-3.x image-processing base64 decode

概述

以简洁(相对)全面的方式处理base64编码图像文件的解码。

目标

主要目标

  • 使用python 3.6获取任意base64字符串,无论是作为内存中的'字符串或外部文件,并从中生成有效的图像文件。

次要目标

  • 使用libmagic(或其他一些python库)尽可能确定编码文件的mime类型,以指示正确的文件类型输出。

初步假设

编码有效

  • 小型JPG图像在base64中编码。我已经通过使用浏览器的原生解码设备通过网络浏览器查看编码数据来验证编码是好的。见下文。

这是Python 3.6中的Doable

  • 看来base64包是为此而制作的,除非我离开基地。

尝试解决方案

我创建了一个名为Converter的python类来处理任务,具有以下功能

构造

  • __init__(self, file="none", str_object="none")
    • 采用2个字符串参数。根据所需用途,只能指定一个替换默认值。
    • file="none" - 文件路径,作为基于文件解码的字符串。
    • str_object="none" - 裸编码字符串。

实例方法

  • convert_ascii_to_byte_stream(self)
    • 没有参数
    • 返回base64对象
  • convert_byte_stream_to_jpg(self)
    • 没有参数
    • 打开一个新文件,尝试写入一个字节流(使用convert_ascii_to_byte_stream,然后关闭该文件。
    • 什么都不返回
  • @staticmethod strip_all_whitespace(s)
    • 采用任意长度的单个字符串。
    • 返回一个字符串,其中包含所有空格,换行符,制表符和回车符。

用法

__main__.py

from Converter import *

c = Converter('ascii_image.txt', 'none')  # create Converter instance
# print(c.get_encoding_type()) # attempt to get encoding
c.convert_byte_stream_to_jpg()  # output the decoded data to image file

观察和问题

  • 如果我调用构造函数Converter('none', 'XyZxYzXyZxYzXyZxYz ...),那么转换就会完美无缺。显然写入文件存在问题。
  • 我了解<img>源属性的前缀,data:image/jpg;base64,必须在解码前被删除。因此,使用ascii_image.txt的测试文件已经过编辑以反映这一点。
  • 在原始源中,每行末尾都有换行符,每个后续行的开头都有一个空格。不确定这是否有所不同,特别是考虑到我在尝试解码之前剥离 ALL 空格。
  • 我尝试过使用libmagicpython-libmagicpython-magic-binfile-magic以及各种其他扩展程序包的一系列复杂方法进展。他们中的大多数只是创建了关于缺少依赖项,编译器错误和其他问题的意大利面错误消息流。任何建议都将不胜感激。

相关代码和错误消息

Converter Python类

from io import *
import base64
# import magic


class Converter:

    def __init__(self, file="none", str_object="none"):
        self.file = file
        self.str_object = str_object
        if file == "none" or "":
            self.isFromStringInput = True
            self.asciiString = str_object
        else:
            f = open(file, 'r')
            self.isFromStringInput = False
            # this was the source of the pad error
            #self.asciiString = f.read(file.__len__())
            # changed to ... duh!
            self.asciiString = f.read()
            f.close()

    def convert_byte_stream_to_jpg(self):
        f = open('ascii_image.jpg', 'wb')
        f.write(self.convert_ascii_to_byte_stream())
        f.close()
        return

    def convert_ascii_to_byte_stream(self):
        return base64.b64decode(self.strip_all_whitespace(self.asciiString))

    @staticmethod
    def strip_all_whitespace(s):
        return s.replace('\n', ' ').replace('\r', '').replace('\t', '').replace(' ', '')

    # def get_encoding_type(self):
    #     m = magic.MAGIC_MIME
    #     m.from_bytes(self.convert_ascii_to_byte_stream(), 'little')
    #     return m.file('./' + self.file)

错误消息

Traceback (most recent call last):
  File "/Users/auser/PycharmProjects/btobin/__main__.py", line 5, in <module>
    c.convert_byte_stream_to_jpg()  # output the decoded data to image file
  File "/Users/auser/PycharmProjects/btobin/Converter.py", line 22, in convert_byte_stream_to_jpg
    f.write(self.convert_ascii_to_byte_stream())
  File "/Users/auser/PycharmProjects/btobin/Converter.py", line 27, in convert_ascii_to_byte_stream
    return base64.b64decode(self.strip_all_whitespace(self.asciiString))
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/base64.py", line 87, in b64decode
    return binascii.a2b_base64(s)
binascii.Error: Incorrect padding

正确编码已验证

如果将以下<img>标记放在html文件中并使用浏览器打开它们,则会看到正确解码的图像。 以下是Decoded Image

的示例
<img src="data:image/jpg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNr
 eQABAAQAAAAeAAD/4QOPaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYm
 VnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHht
 bG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzAxNC
 A3OS4xNTY3OTcsIDIwMTQvMDgvMjAtMDk6NTM6MDIgICAgICAgICI+IDxyZGY6UkRGIHhtbG5z
 OnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZG
 Y6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUu
 Y29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS
 4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hh
 cC8xLjAvIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6ZTg0NGJjNjUtYjAzZS
 00ODZiLThlYTctZDFjZTY4OGU5YTc2IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjM4NTBE
 Njg5Mzg2MzExRTZCOEZERTBFNjU0NTg5RUZDIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOj
 M4NTBENjg4Mzg2MzExRTZCOEZERTBFNjU0NTg5RUZDIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2Jl
 IFBob3Rvc2hvcCBDQyAyMDE0IChNYWNpbnRvc2gpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0Um
 VmOmluc3RhbmNlSUQ9InhtcC5paWQ6MjU4YjBiOTEtNGJhMC00NjI0LTg5NTUtYjU2ODg0OWIw
 OWFhIiBzdFJlZjpkb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6ZTllYjAwMGQtOD
 A0My0xMTc5LThhODktZjZmMjZkYTVhZGU1Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpS
 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" />

0 个答案:

没有答案