文件可视化的脚本

BIN2BMP是一个将文件可视化的脚本,在此基础上,做了一些简化。做了一个将目录中所有文件可视化的脚本(包含子目录)

'''
created by iloveacm
2020-8-15
'''

class bin2bmp:                              #bin2bmp类转化二进制文件到png图片
    out_file = None
    input_file = None
    width = 128 
    im = None

    def __init__(self, output_file, input_file, output_type, width):        
        self.chunks = 0
        self.output_type = output_type
        self.width = 1024
        self.basename = None
        self.set_output_type(output_type)


    def set_output_file(self, basename):
        self.basename = basename
        if basename != None:
            self.output_file = basename + '.' + 'png'
        
    def set_output_type(self,output_type):
        if output_type == 'PNG':
            self.output_type = 'PNG'
            self.output_ext = 'png'
            self.input_colors = 'RGB'
            self.white = (255,255,255)
        self.set_output_file(self.basename)



    def create_image(self, buffer):             #创建二进制图片
        self.chunks = len(buffer)/3             #计算文件总像素个数
        self.width = int(math.sqrt(self.chunks))
        if self.chunks % self.width == 0:       #计算图片宽和高
            height = int(self.chunks / self.width)
        else:
            reschunks = self.chunks - (self.width*self.width)
            if reschunks % self.width == 0:
                height = int(self.width + reschunks / self.width)
            else:
                height = int(self.width + reschunks / self.width + 1)
            
        self.im = Image.new(self.input_colors, (self.width, height), self.white)
        i = 1
        for x in range(width):
            for y in range(height):
                if i <= self.chunks - 1:
                    color = (buffer.pop(), buffer.pop(), buffer.pop())
                    self.im.putpixel((x, y), color)
                    i+=1
                

    def write_image(self):              #保存图片
        self.im.save(self.out_file, self.output_type, quality=100)



if __name__ == '__main__':
    import PIL.Image as Image, os, sys, array, math

    def get_dir_filenames(path):        #得到目录内所有文件
        L = []
        for root, dirs, files in os.walk(path):
            for filename in files:
                L.append(os.path.join(root, filename))
        return L
    
    filelists = get_dir_filenames("C:\Users\iloveacm\Pictures\paper")           #文件夹路径

    for filepath in filelists:

        output_file, input_file, output_type, width = None, None, 'PNG', 1024
        b = bin2bmp(output_file, input_file, output_type, width)
        b.input_file = filepath
        #print b.input_file
        filename = os.path.split(b.input_file)[1]
        #print filename
        fileobj = open(b.input_file, mode='rb')                   #以二进制读取文件
        buffer = array.array('B', fileobj.read())
        buffer.reverse()
        #print buffer
        print filename + ':', len(buffer), "bytes"

        b.create_image(buffer)
        b.out_file = 'D:/aaa/' + filename + '.' + b.output_ext              #文件名
        b.write_image()


posted @ 2020-08-15 22:49  iloveacm  阅读(364)  评论(0编辑  收藏  举报