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 相关文章推荐
Python中zfill()方法的使用教程
May 20 Python
Python机器学习之决策树算法实例详解
Dec 06 Python
Python Pandas批量读取csv文件到dataframe的方法
Oct 08 Python
Python Unittest根据不同测试环境跳过用例的方法
Dec 16 Python
Django项目使用CircleCI的方法示例
Jul 14 Python
python文件操作的简单方法总结
Nov 07 Python
解决Opencv+Python cv2.imshow闪退问题
Apr 24 Python
python获取本周、上周、本月、上月及本季的时间代码实例
Sep 08 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
Nov 25 Python
Python 转移文件至云对象存储的方法
Feb 07 Python
python pygame 开发五子棋双人对弈
May 02 Python
Python面试不修改数组找出重复的数字
May 20 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
PHP extract 将数组拆分成多个变量的函数
2010/06/30 PHP
php array_filter除去数组中的空字符元素
2020/06/21 PHP
APACHE的AcceptPathInfo指令使用介绍
2013/01/18 PHP
浅析php变量修饰符static的使用
2013/06/28 PHP
THINKPHP3.2使用soap连接webservice的解决方法
2017/12/13 PHP
ThinkPHP5.1框架页面跳转及修改跳转页面模版示例
2019/05/06 PHP
Nodejs实现的一个静态服务器实例
2014/12/06 NodeJs
浅析Node.js中使用依赖注入的相关问题及解决方法
2015/06/24 Javascript
简介AngularJS中$http服务的用法
2016/02/06 Javascript
快速实现JS图片懒加载(可视区域加载)示例代码
2017/01/04 Javascript
angularjs实现的购物金额计算工具示例
2018/05/08 Javascript
JS事件绑定的常用方式实例总结
2019/03/02 Javascript
element-ui中Table表格省市区合并单元格的方法实现
2019/08/07 Javascript
layui数据表格 table.render 报错的解决方法
2019/09/29 Javascript
element-ui 远程搜索组件el-select在项目中组件化的实现代码
2019/12/04 Javascript
微信小程序request请求封装,验签代码实例
2019/12/04 Javascript
python二分法实现实例
2013/11/21 Python
python socket 超时设置 errno 10054
2014/07/01 Python
Python冒泡排序注意要点实例详解
2016/09/09 Python
老生常谈Python之装饰器、迭代器和生成器
2017/07/26 Python
python多线程socket编程之多客户端接入
2017/09/12 Python
让代码变得更易维护的7个Python库
2018/10/09 Python
django echarts饼图数据动态加载的实例
2019/08/12 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
2020/06/01 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
2020/06/03 Python
Keras 快速解决OOM超内存的问题
2020/06/11 Python
美国时尚假发购物网站:Wigsbuy
2019/04/06 全球购物
美国Curacao百货连锁店网站:iCuracao.com
2019/07/20 全球购物
this关键字的含义
2015/04/08 面试题
写自荐信三大法宝
2014/01/24 职场文书
《傅雷家书》教学反思
2014/04/20 职场文书
初中班主任评语
2014/04/24 职场文书
医学求职信
2014/05/28 职场文书
经济国贸专业求职信
2014/06/18 职场文书
售票员岗位职责
2015/02/15 职场文书
2015年社区教育工作总结
2015/05/13 职场文书