Python语言实现将图片转化为html页面


Posted in Python onDecember 06, 2017

PIL 图像处理库

PIL(Python Imaging Library) 是 Python 平台的图像处理标准库。不过 PIL 暂不支持 Python3,可以用 Pillow 代替,API是相同的。

安装 PIL 库

如果你安装了 pip 的话可以直接输入 pip install PIL 命令安装 Pillow。

或者在 PyCharm 中打开 [File] >> [settings] >> [project github] >> [project interpreter] 添加标准库:

Python语言实现将图片转化为html页面

↑ 搜索 Pillow 包,选中 Pillow,点击 Install Package 安装

PIL 使用方法

from PIL import Image

img = Image.open('source.jpg') # 打开图片
width, height = img.size # 图片尺寸

img.thumbnail((width / 2, height / 2)) # 缩略图
img = img.crop((0, 0, width / 2, width / 2)) # 图片裁剪
img = img.convert(mode='L') # 图片转换
img = img.rotate(180) # 图片旋转
img.save('output.jpg') # 保存图片

↑ PIL 常用模块:Image, ImageFilter, ImageDraw, ImageFont, ImageEnhance, ImageFilter...

图片处理过程

图片转换成网页的过程,可以分成五个步骤。首先要选择一个合适的HTML模板,控制好字体的大小和字符间的间距。

然后通过 Python 的 网络访问模块,根据URL获取图片。接着使用 PIL 模块载入二进制图片,将图片压缩到合适的尺寸。

遍历图片的每一个像素,得到该像素的颜色值,应用到HTML的标签上。最后把字符串信息输出到文件中,生成HTML文档。

定制模板

TEMPLATE = '''
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>{title}</title>
  <style>
    body {{
      line-height: 1em;
      letter-spacing: 0;
      font-size: 0.6rem;
      background: black;
      text-align: center;
    }}
  </style>
</head>
<body>
  {body}
</body>
</html>
'''

↑ 大括号代表一个占位符,最后会被替换成实际内容,双大括号中的内容则不会被替换。

获取图片

from urllib import request
url = 'https://pic.cnblogs.com/avatar/875028/20160405220401.png'
binary = request.urlopen(url).read()

↑ 通过 URL 得到 byte 数组形式的图片。

处理图片

from PIL import Image
from io import BytesIO
img = Image.open(BytesIO(binary))
img.thumbnail((100, 100)) # 图片压缩

↑ byte 类型的 图片需要通过 BytesIO 转换为 string 类型,才能被 PIL 处理。

生成HTML

piexl = img.load() # 获取像素信息
width, height = img.size # 获取图像尺寸
body, word = '', '博客园'
font = '<font color="{color}">{word}</font>'
for y in range(height):
  for x in range(width):
    r, g, b = piexl[x, y] # 获取像素RGB值
    body += font.format(
      color='#{:02x}{:02x}{:02x}'.format(r, g, b),
      word=word[((y * width + x) % len(word))]
    )
  body += '\n<br />\n'

↑ 使用<font>标签包裹文字,并根据相应像素的RGB值,设置<font>标签的color属性。

导出网页

html = TEMPLATE.format(title=word, body=body)
fo = open('index.html', 'w', encoding='utf8')
fo.write(html)
fo.close()

↑向HTML模板中填充处理完成的数据,使用文件流将字符串以utf8格式输出到文档。

img2html

wo把上面五个步骤封装了起来,这样一来就可以很方便的调用了。

from io import BytesIO
from PIL import Image
from PIL import ImageFilter
from urllib import request

TEMPLATE = '''
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>{title}</title>
  <style>
    body {{
      line-height: 1em;
      letter-spacing: 0;
      font-size: 0.6rem;
      background: black;
      text-align: center;
      min-width: {size}em;
    }}
  </style>
</head>
<body>
  {body}
</body>
</html>
'''
class Converter(object):
  def __init__(self, word='田', size=100):
    self.word, self.size = word, size
    self.font = '<font color="{color}">{word}</font>'

  # 读取url内容
  def __network(self, url):
    return request.urlopen(url).read()

  # 处理图片信息
  def __handle(self, binary):
    img = Image.open(BytesIO(binary)) # 打开制图片
    img.thumbnail((self.size, self.size)) # 压缩图片
    img.filter(ImageFilter.DETAIL) # 图片增强
    return img

  # 分析图片像素
  def __analysis(self, img):
    body = ''
    piexls = img.load()
    width, height = img.size
    for y in range(height):
      for x in range(width):
        r, g, b = piexls[x, y]
        body += self.font.format(
          color='#{:02x}{:02x}{:02x}'.format(r, g, b),
          word=self.word[((y * width + x) % len(self.word))]
        )
      body += '\n<br />\n'
    return body
  # 写入文件内容
  def __writefile(self, file, str):
    fo = open(file, 'w', encoding='utf8')
    try:
      fo.write(str)
    except IOError:
      raise Exception
    finally:
      fo.close()

  # 生成html文档
  def buildDOC(self, url, output):
    try:
      binary = self.__network(url)
      img = self.__handle(binary)
      html = TEMPLATE.format(
        title=self.word,
        body=self.__analysis(img),
        size=self.size
      ) # 向模板中填充数据
      self.__writefile(output, html)
    except Exception as err:
      print('Error:', err)
      return False
    else:
      print('Successful!')
      return True

导入 img2html.Converter,调用 buildDOC(url, out) 方法

from img2html import Converter
conv = Converter('卷福', 120)
url = 'http://www.sznews.com/ent/images/attachement/jpg/site3/20140215/001e4f9d7bf91469078115.jpg'
out = 'index.html'
conv.buildDOC(url, out)

↑ 程序会在当前目录生成 index.html 文件,需要用浏览器打开后才可以看到效果。

转换效果

原始图片 输出HTML

总结

以上就是本文关于Python实现将图片转化为html页面的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
下载给定网页上图片的方法
Feb 18 Python
Python中统计函数运行耗时的方法
May 05 Python
window下eclipse安装python插件教程
Apr 24 Python
Python Socket实现简单TCP Server/client功能示例
Aug 05 Python
通过Python模块filecmp 对文件比较的实现方法
Jun 29 Python
python实现维吉尼亚算法
Mar 20 Python
Python一行代码实现快速排序的方法
Apr 30 Python
解决keras backend 越跑越慢问题
Jun 18 Python
详解Python3 定义一个跨越多行的字符串的多种方法
Sep 06 Python
Python通过format函数格式化显示值
Oct 17 Python
Django利用elasticsearch(搜索引擎)实现搜索功能
Nov 26 Python
Python中Pyspider爬虫框架的基本使用详解
Jan 27 Python
Python实现比较扑克牌大小程序代码示例
Dec 06 #Python
Python3简单实例计算同花的概率代码
Dec 06 #Python
Python基于回溯法解决01背包问题实例
Dec 06 #Python
Python基于动态规划算法解决01背包问题实例
Dec 06 #Python
Python机器学习之决策树算法实例详解
Dec 06 #Python
快速入门python学习笔记
Dec 06 #Python
Python中django学习心得
Dec 06 #Python
You might like
星际中一些鲜为人知的详细资料
2020/03/04 星际争霸
PHP与SQL注入攻击防范小技巧
2011/09/16 PHP
php curl的深入解析
2013/06/02 PHP
PHP+Mysql+Ajax+JS实现省市区三级联动
2014/05/23 PHP
PHP中使用break跳出多重循环代码实例
2015/01/21 PHP
PHP实现事件机制实例分析
2015/06/26 PHP
PHP实现长文章分页实例代码(附源码)
2016/02/03 PHP
php删除二维数组中的重复值方法
2018/03/12 PHP
为你的 Laravel 验证器加上多验证场景的实现
2020/04/07 PHP
javascript 当前日期转化为中文的实现代码
2010/05/13 Javascript
分享27个jQuery 表单插件集合推荐
2011/04/25 Javascript
JS 毫秒转时间示例代码
2013/09/22 Javascript
Javascript中this的用法详解
2014/09/22 Javascript
Node.js 的异步 IO 性能探讨
2014/10/08 Javascript
浅析四种常见的Javascript声明循环变量的书写方式
2015/10/14 Javascript
bootstrap组件之按钮式下拉菜单小结
2017/01/19 Javascript
微信JSAPI Ticket接口签名详解
2020/06/28 Javascript
Vue中的无限加载vue-infinite-loading的方法
2018/04/08 Javascript
解决element-ui中下拉菜单子选项click事件不触发的问题
2018/08/22 Javascript
微信小程序上线发布流程图文详解
2019/05/06 Javascript
[02:14]2016国际邀请赛中国区预选赛Ehome晋级之路
2016/07/01 DOTA
python 接口_从协议到抽象基类详解
2017/08/24 Python
通过 Django Pagination 实现简单分页功能
2019/11/11 Python
opencv 查找连通区域 最大面积实例
2020/06/04 Python
Python try except else使用详解
2021/01/12 Python
利用CSS3实现的文字定时向上滚动
2016/08/29 HTML / CSS
HTML5制作表格样式
2016/11/15 HTML / CSS
英国评分最高的女性剃须刀订阅盒:FFS Beauty
2018/01/25 全球购物
卡骆驰德国官方网站:Crocs德国
2019/03/29 全球购物
工程测量与监理专业应届生求职信
2013/11/27 职场文书
人力资源部门的主要职能
2014/02/22 职场文书
送温暖献爱心活动总结
2014/07/08 职场文书
敬老月活动总结
2014/08/28 职场文书
超市员工辞职信范文
2015/05/12 职场文书
2019通用版新员工入职培训方案!
2019/07/11 职场文书
浅析Python实现DFA算法
2021/06/26 Python