使用Python生成Excel格式的图片,,之前曾看到过 一篇报道,


之前曾看到过 一篇报道,说有个日本人利用Excel作画。 当时看着几百乘几百的单元格里,填满眼花缭乱的的颜色,心想这得花多大的精力啊?后来想想,要是用编程来实现,普通人几分钟之内也可以完成几幅,甚至可以达到照片级,呵呵~.

Python 2.7.5;

PIL 1.1.7;

XlsxWriter 0.3.5;

# coding: utf-8from PIL import Imagefrom xlsxwriter.workbook import Workbookclass ExcelPicture(object):    FORMAT_CONSTRAINT = 65536    def __init__(self, pic_file, ratio = 1.0):        self.__pic_file = pic_file        self.__ratio = ratio        self.__zoomed_out = False        self.__formats = dict()    # 缩小图片        def zoom_out(self, _img):        _size = _img.size        _img.thumbnail((int(_img.size[0] * self.__ratio), int(_img.size[1] * self.__ratio)))        self.__zoomed_out = True    # 对颜色进行圆整        def round_rgb(self, rgb, model):        return tuple([int(round(x / model) * model) for x in rgb])    # 查找颜色样式,去重        def get_format(self, color):        _format = self.__formats.get(color, None)        if _format is None:            _format = self.__wb.add_format({'bg_color': color})            self.__formats[color] = _format        return _format    # 操作流程    def process(self, output_file = '_pic.xlsx', color_rounding = False, \\                color_rounding_model = 5.0):        # 创建xlsx文件,并调整行列属性        self.__wb = Workbook(output_file)        self.__sht = self.__wb.add_worksheet()        self.__sht.set_default_row(height = 9)        self.__sht.set_column(0, 5000, width = 1)        # 打开需要进行转换的图片        _img = Image.open(self.__pic_file)        print 'Picture filename:', self.__pic_file        # 判断是否需要缩小图片尺寸        if self.__ratio < 1: self.zoom_out(_img)        # 遍历每一个像素点,并填充对应的颜色到对应的Excel单元格        _size = _img.size        print 'Picture size:', _size        for (x, y) in [(x, y) for x in xrange(_size[0]) for y in xrange(_size[1])]:            _clr = _img.getpixel((x, y))            # 如果颜色种类过多,则需要将颜色圆整到近似的颜色上,以减少颜色种类            if color_rounding: _clr = self.round_rgb(_clr, color_rounding_model)            _color = '#%02X%02X%02X' % _clr            self.__sht.write(y, x, '', self.get_format(_color))        self.__wb.close()        # 检查颜色样式种类是否超出限制,Excel2007对样式数量有最大限制        format_size = len(self.__formats.keys())        if format_size >= ExcelPicture.FORMAT_CONSTRAINT:            print 'Failed! Color size overflow: %s.' % format_size        else:            print 'Success!'            print 'Color: %s' % format_size            print 'Color_rounding:', color_rounding            if color_rounding: print 'Color_rounding_model:', color_rounding_modelif __name__ == '__main__':    r = ExcelPicture('b022_c.jpg', ratio = 0.5)    r.process('b022_c.xlsx', color_rounding = True, color_rounding_model = 5.0)#该片段来自于http://byrx.net

评论关闭