使用python生成excel格式的图片

使用Python生成Excel格式的图片

分类: Python 100人阅读 评论(0) 收藏 举报
之前曾看到过 一篇报道,说有个日本人利用Excel作画。他把每个单元格填充上颜色,缩小显示比例,就展现出一幅画。记者采访他,他说因为买不起正版的Photoshop,才委曲求全用Excel将就。

当时看着几百乘几百的单元格里,填满眼花缭乱的的颜色,心想这得花多大的精力啊?

后来想想,要是用编程来实现,普通人几分钟之内也可以完成几幅,甚至可以达到照片级,呵呵~

先看个效果图,Excel格式的图片,够Geek吧。




用Python来实现,是很简单的,我的平台是:
Python 2.7.5;
PIL 1.1.7;
XlsxWriter 0.3.5;

需要说明的是,之所以选择XlsxWriter,而不是常用的xlwt,是因为前者可以操作Excel2007版本的xlsx文件。它拥有更多的行和列。

主要思路,就是使用PIL打开图片文件,读出每个像素点的RGB值,再填充Excel文件。

需要注意的是,Excel2007对于单元格样式的种类也是有要求的,貌似最多65536种。因此有可能需要对颜色进行圆整。我也曾想使用PIL预先将图片的颜色转为65536色(16 bit),但是貌似PIL对65536色不太支持,所以只能出此下策。

  1. # coding: utf-8
  2. from PIL import Image
  3. from xlsxwriter.workbook import Workbook
  4. class ExcelPicture(object):
  5. FORMAT_CONSTRAINT = 65536
  6. def __init__(self, pic_file, ratio = 1.0):
  7. self.__pic_file = pic_file
  8. self.__ratio = ratio
  9. self.__zoomed_out = False
  10. self.__formats = dict()
  11. # 缩小图片
  12. def zoom_out(self, _img):
  13. _size = _img.size
  14. _img.thumbnail((int(_img.size[0] * self.__ratio), int(_img.size[1] * self.__ratio)))
  15. self.__zoomed_out = True
  16. # 对颜色进行圆整
  17. def round_rgb(self, rgb, model):
  18. return tuple([int(round(x / model) * model) for x in rgb])
  19. # 查找颜色样式,去重
  20. def get_format(self, color):
  21. _format = self.__formats.get(color, None)
  22. if _format is None:
  23. _format = self.__wb.add_format({'bg_color': color})
  24. self.__formats[color] = _format
  25. return _format
  26. # 操作流程
  27. def process(self, output_file = '_pic.xlsx', color_rounding = False, color_rounding_model = 5.0):
  28. # 创建xlsx文件,并调整行列属性
  29. self.__wb = Workbook(output_file)
  30. self.__sht = self.__wb.add_worksheet()
  31. self.__sht.set_default_row(height = 9)
  32. self.__sht.set_column(0, 5000, width = 1)
  33. # 打开需要进行转换的图片
  34. _img = Image.open(self.__pic_file)
  35. print 'Picture filename:', self.__pic_file
  36. # 判断是否需要缩小图片尺寸
  37. if self.__ratio < 1: self.zoom_out(_img)
  38. # 遍历每一个像素点,并填充对应的颜色到对应的Excel单元格
  39. _size = _img.size
  40. print 'Picture size:', _size
  41. for (x, y) in [(x, y) for x in xrange(_size[0]) for y in xrange(_size[1])]:
  42. _clr = _img.getpixel((x, y))
  43. # 如果颜色种类过多,则需要将颜色圆整到近似的颜色上,以减少颜色种类
  44. if color_rounding: _clr = self.round_rgb(_clr, color_rounding_model)
  45. _color = '#%02X%02X%02X' % _clr
  46. self.__sht.write(y, x, '', self.get_format(_color))
  47. self.__wb.close()
  48. # 检查颜色样式种类是否超出限制,Excel2007对样式数量有最大限制
  49. format_size = len(self.__formats.keys())
  50. if format_size >= ExcelPicture.FORMAT_CONSTRAINT:
  51. print 'Failed! Color size overflow: %s.' % format_size
  52. else:
  53. print 'Success!'
  54. print 'Color: %s' % format_size
  55. print 'Color_rounding:', color_rounding
  56. if color_rounding: print 'Color_rounding_model:', color_rounding_model
  57. if __name__ == '__main__':
  58. r = ExcelPicture('b022_c.jpg', ratio = 0.5)
  59. r.process('b022_c.xlsx', color_rounding = True, color_rounding_model = 5.0)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值