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的Django框架使用入门指引
Apr 15 Python
python获取本地计算机名字的方法
Apr 29 Python
python如何派生内置不可变类型并修改实例化行为
Mar 21 Python
django rest framework 数据的查找、过滤、排序的示例
Jun 25 Python
python 借助numpy保存数据为csv格式的实现方法
Jul 04 Python
Selenium的使用详解
Oct 19 Python
对django后台admin下拉框进行过滤的实例
Jul 26 Python
Pandas聚合运算和分组运算的实现示例
Oct 17 Python
Series和DataFrame使用简单入门
Nov 13 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
Aug 11 Python
PyQt实现计数器的方法示例
Jan 18 Python
Python中的协程(Coroutine)操作模块(greenlet、gevent)
May 30 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
JpGraph php柱状图使用介绍
2011/08/23 PHP
PHP 登录记住密码实现思路
2013/05/07 PHP
php过滤html标记属性类用法实例
2014/09/23 PHP
Codeigniter(CI)框架分页函数及相关知识
2014/11/03 PHP
PHP利用APC模块实现文件上传进度条的方法
2015/01/26 PHP
必须收藏的php实用代码片段
2016/02/02 PHP
javascript 常用关键字列表集合
2007/12/04 Javascript
Jquery带搜索框的下拉菜单
2013/05/06 Javascript
JS获取月的最后一天与JS得到一个月份最大天数的实例代码
2013/12/16 Javascript
jQuery UI插件自定义confirm确认框的方法
2015/03/20 Javascript
jquery实现带缩略图的可定制高度画廊效果(5种)
2015/08/28 Javascript
微信小程序获取手机号授权用户登录功能
2017/11/09 Javascript
移动前端图片压缩上传的实例
2017/12/06 Javascript
详解javascript函数写法大全
2019/03/25 Javascript
基于Vue实现电商SKU组合算法问题
2019/05/29 Javascript
深入浅析vue中cross-env的使用
2019/09/12 Javascript
微信小程序使用蓝牙小插件
2019/09/23 Javascript
JavaScript, select标签元素左右移动功能实现
2020/05/14 Javascript
vue使用exif获取图片经纬度的示例代码
2020/12/11 Vue.js
使用pyecharts无法import Bar的解决方案
2020/04/23 Python
Python-copy()与deepcopy()区别详解
2019/07/12 Python
django获取from表单multiple-select的value和id的方法
2019/07/19 Python
Django获取该数据的上一条和下一条方法
2019/08/12 Python
对YOLOv3模型调用时候的python接口详解
2019/08/26 Python
Python 项目转化为so文件实例
2019/12/23 Python
解决使用Pandas 读取超过65536行的Excel文件问题
2020/11/10 Python
在PyCharm中安装PaddlePaddle的方法
2021/02/05 Python
Perry Ellis官网:美国男士品味服装
2016/12/09 全球购物
以设计师精品品质提供快速时尚:PopJulia
2018/01/09 全球购物
大学生毕业自我鉴定范文
2013/09/19 职场文书
医学专业毕业生个人求职信
2013/12/25 职场文书
幼儿园安全检查制度
2014/01/30 职场文书
高中生物教学反思
2014/02/05 职场文书
创业融资计划书
2014/04/25 职场文书
企业党建工作总结2015
2015/05/26 职场文书
Mysql Show Profile
2021/04/05 MySQL