简单介绍img2html的用法,安装就不用说了pip。这个包现只支持python2,支持python的话需改下源码这几个部分:

  加注释的是修改的地方

  1. #!/usr/bin/env python
  2. # encoding=utf-8
  3.  
  4. from __future__ import print_function, unicode_literals
  5.  
  6. from collections import namedtuple
  7. from itertools import cycle
  8.  
  9. import jinja2
  10. from PIL import Image
  11.  
  12. Point = namedtuple('Point', ['x', 'y'])
  13. Pixel = namedtuple('Pixel', ['r', 'g', 'b'])
  14. RenderItem = namedtuple('RenderItem', ['color', 'char'])
  15. RenderGroup = list
  16. HTMLImage = list
  17.  
  18. TEMPLATE = '''
  19. <html>
  20. <head>
  21. <meta charset="utf-8">
  22. <title>{{ title }}</title>
  23. <style type="text/css">
  24. body {
  25. margin: 0px; padding: 0px; line-height:100%; letter-spacing:0px; text-align: center;
  26. min-width: {{width}}px;
  27. width: auto !important;
  28. font-size: {{size}}px;
  29. background-color: #{{background}};
  30. font-family: {{font_family}};
  31. }
  32. </style>
  33. </head>
  34. <body>
  35. <div>
  36. {% for group in html_image %}
  37. {% for item in group %}<font color="#{{ item.color }}">{{ item.char }}</font>{% endfor %}
  38. <br>
  39. {% endfor %}
  40. </div>
  41. </body>
  42. </html>'''
  43.  
  44. _c = cycle(r'/-\|')
  45.  
  46. def _progress_callback(percent):
  47. if percent == 100:
  48. print('\rDone! ')
  49. else:
  50. import sys, time
  51. lca = getattr(_progress_callback, '_last_call_at', 0)
  52. if time.time() - lca > 0.1:
  53. _progress_callback._last_call_at = time.time()
  54. # _c.next() => next(_c)
  55. sys.stdout.write('\r{} progress: {:.2f}%'.format(next(_c), percent))
  56. sys.stdout.flush()
  57.  
  58. class Img2HTMLConverter(object):
  59. def __init__(self,
  60. font_size=10,
  61. char='䦗',
  62. background='#000000',
  63. title='img2html by xlzd',
  64. font_family='monospace',
  65. progress_callback=None):
  66. self.font_size = font_size
  67. self.background = background
  68. self.title = title
  69. self.font_family = font_family
  70. # if isinstance(char, str):
  71. # char = char.decode('utf-8')
  72. self.char = cycle(char)
  73. self._prg_cb = progress_callback or _progress_callback
  74.  
  75. def convert(self, source):
  76. image = Image.open(source)
  77.  
  78. width, height = image.size
  79. row_blocks = int(round(float(width) / self.font_size))
  80. col_blocks = int(round(float(height) / self.font_size))
  81.  
  82. html_image = HTMLImage()
  83. progress = 0.0
  84. step = 1. / (col_blocks * row_blocks)
  85. # xrange => range
  86. for col in range(col_blocks):
  87. render_group = RenderGroup()
  88. for row in range(row_blocks):
  89. pixels = []
  90. for y in range(self.font_size):
  91. for x in range(self.font_size):
  92. point = Point(row * self.font_size + x, col * self.font_size + y)
  93. if point.x >= width or point.y >= height:
  94. continue
  95. pixels.append(Pixel(*image.getpixel(point)[:3]))
  96. average = self.get_average(pixels=pixels)
  97. color = self.rgb2hex(average)
  98. # render_item = RenderItem(color=color, char=self.char.next())
  99. render_item = RenderItem(color=color, char=next(self.char))
  100. render_group.append(render_item)
  101.  
  102. progress += step
  103. self._prg_cb(progress * 100)
  104.  
  105. html_image.append(render_group)
  106.  
  107. self._prg_cb(100)
  108. return self.render(html_image)
  109.  
  110. def render(self, html_image):
  111. template = jinja2.Template(TEMPLATE)
  112. return template.render(
  113. html_image=html_image,
  114. size=self.font_size,
  115. background=self.background,
  116. title=self.title,
  117. font_family=self.font_family,
  118. width=self.font_size * len(html_image[0]) * 2
  119. )
  120.  
  121. @staticmethod
  122. def rgb2hex(pixel):
  123. return '{:02x}{:02x}{:02x}'.format(*pixel)
  124.  
  125. @staticmethod
  126. def get_average(pixels):
  127. r, g, b = 0, 0, 0
  128. for pixel in pixels:
  129. r += pixel.r
  130. g += pixel.g
  131. b += pixel.b
  132. base = float(len(pixels))
  133. return Pixel(
  134. r=int(round(r / base)),
  135. g=int(round(g / base)),
  136. b=int(round(b / base)),
  137. )

  具体实现代码如下:

  1. # -*- coding: utf-8 -*-
  2. # Nola
  3. """
  4. img2html : Convert image to HTML
  5.  
  6. optional arguments:
  7. -b #RRGGBB, --background #RRGGBB background color (#RRGGBB format)
  8. -s (4~30), --size (4~30) font size (int)
  9. -c CHAR, --char CHAR characters
  10. -t TITLE, --title TITLE html title
  11. -f FONT, --font FONT html font
  12. -i IN, --in IN 要转换的图片
  13. -o OUT, --out OUT 输出文件名
  14. $ img2html -i timg.jpg -o timg_html.html
  15. """
  16. from img2html.converter import Img2HTMLConverter
  17.  
  18. converter = Img2HTMLConverter(char='爱',title='金木研')
  19. html = converter.convert('timg.jpg')
  20. with open('timg_html.html',mode='w',encoding='utf-8') as f:
  21. f.write(html)

  准备一张图片,编写py文件,生成html文件,文件结构如图:

  前后对比效果如图:

  密密麻麻的爱字,看起来着实有点像十字绣,也许你会发现这个包更有趣的实用之处。

img2html实现将图片转换成网页的更多相关文章

  1. 使用CSS将图片转换成黑白(灰色、置灰)z转

    小tip: 使用CSS将图片转换成黑白(灰色.置灰) by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.c ...

  2. [转]C#将image中的显示的图片转换成二进制

    本文转自:http://www.cnblogs.com/shuang121/archive/2012/07/09/2582654.html .将Image图像文件存入到数据库中 我们知道数据库里的Im ...

  3. 小tip: 使用CSS将图片转换成模糊(毛玻璃)效果

    去年盛夏之时,曾写过“小tip: 使用CSS将图片转换成黑白”一文,本文的模式以及内容其实走得是类似路线.CSS3 → SVG → IE filter → canvas. 前段时间,iOS7不是瓜未熟 ...

  4. ABBYY如何把图片转换成pdf格式

    在制作工作文件的时候,有时候会遇到需要进行文件格式转换的情况,比较常见的文件格式转换就包含了Office与pdf格式之间的转换.但除此之外,图片与pdf格式也是可以进行转换的,那么图片要怎么操作,才能 ...

  5. [转] 小tip: 使用CSS将图片转换成模糊(毛玻璃)效果 ---张鑫旭

    by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=3804 去年盛夏之时, ...

  6. C#将image中的显示的图片转换成二进制

    原文:C#将image中的显示的图片转换成二进制 1.将Image图像文件存入到数据库中 我们知道数据库里的Image类型的数据是"二进制数据",因此必须将图像文件转换成字节数组才 ...

  7. 【caffe-windows】 caffe-master 之 训练自己数据集(图片转换成lmdb or leveldb)

    前期准备: 文件夹train:此文件夹中按类别分好子文件夹,各子文件夹里存放相应图片 文件夹test:同train,有多少类就有多少个子文件夹 trainlabels.txt : 存的是训练集的标签  ...

  8. 运用C语言将图片转换成16进制的字符串(base64)

    最近在写手机端的性能测试脚本的时候,发现手机在上传图片数据时,先将图片转换成一堆16进制的字符,将字符传输过去,服务器再将字符解码成图片 我们在loadrunner中测试时,就需要用C语言将图片编码. ...

  9. jpg、png格式的图片转换成webp后颜色失真的问题

    今天简单的试用了一下 cweb.exe 将 jpg, png 格式的图片转换成 webp 格式. 我今天下载的是当前最新版:1.0.0 cwebp 3.jpg  -q 85 -o 3.webp 发现图 ...

随机推荐

  1. git批量删除文件和批量提交

    1. 单个删除文件: ① 通常直接在文件管理器中把没用的文件删了,或者用rm命令删了:(可选操作,可直接执行②删除) $ rm test.txt ② 确实要从版本库中删除该文件,那就用命令git rm ...

  2. 学习笔记25—python基本运算法则

    1.矩阵的点乘: a*b, 矩阵乘法:dot(a*b),矩阵的次方:a**num (num = 2,表示2次)2.数组的并集,交集: >>> a = [1,2,3] >> ...

  3. django数据库的增、删、改、查

    1.增加 第一种:save 通过创建模型类对象,执行对象的save()方法保存到数据库中. 第二种:create 2.修改 3.查询 get 查询单一结果,如果不存在会抛出模型类.DoesNotExi ...

  4. MYSQL常用函数(时间和日期函数)Java中

    CURDATE()或CURRENT_DATE() 返回当前的日期 CURTIME()或CURRENT_TIME() 返回当前的时间 DATE_ADD(date,INTERVAL int keyword ...

  5. Codeforces 1053 C - Putting Boxes Together

    C - Putting Boxes Together 思路: 求带权中位数 用树状数组维护修改 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) ...

  6. Asp.net core 学习笔记 ( Router 路由 )

    和之前的一样用法. public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory log ...

  7. fiddler学习笔记&&基本使用

    周末在网上找了些fiddler相关的资料来看,学习下如何使用这个工具(平时接口测试用得比较多,在没有接口文档的情况下,可以通过抓包工具来提取需要测试的接口,ps.好久没写博客了,争取5月结束前再写2篇 ...

  8. 《HTTP 权威指南》笔记:第十三章 摘要认证体制

    前言 基本认证存在缺陷,摘要认证为了解决基本认知的一些缺陷,进行了进一步的完善,更加安全. 流程 摘要认证的特点是:永远不会以明文方式在网络上发送密码原理:通过发送一个「指纹」或者「密码的摘要」来验证 ...

  9. 雷林鹏分享:jQuery EasyUI 窗口 - 自定义窗口工具栏

    jQuery EasyUI 窗口 - 自定义窗口工具栏 默认情况下,窗口(window)有四个工具:collapsible.minimizable.maximizable 和 closable.比如我 ...

  10. canvas学习之折线图

    接着上一张柱状图讲,我们是使用折线图: import {canvasPoint} from '../../assets/js/canvas';import {basicInfo,histogramMo ...