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 相关文章推荐
linux系统使用python监测系统负载脚本分享
Jan 15 Python
python实现八大排序算法(1)
Sep 14 Python
无法使用pip命令安装python第三方库的原因及解决方法
Jun 12 Python
python生成密码字典的方法
Jul 06 Python
python集合比较(交集,并集,差集)方法详解
Sep 13 Python
Django框架模板介绍
Jan 15 Python
opencv python统计及绘制直方图的方法
Jan 21 Python
利用Python查看微信共同好友功能的实现代码
Apr 24 Python
Django实现文件上传下载功能
Oct 06 Python
基于Python实现签到脚本过程解析
Oct 25 Python
python+opencv3生成一个自定义纯色图教程
Feb 19 Python
Python pytesseract验证码识别库用法解析
Jun 29 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
Windows PHP5和Apache的安装与配置
2009/06/08 PHP
js模拟实现Array的sort方法
2007/12/11 Javascript
JavaScript使用过程中需要注意的地方和一些基本语法
2010/08/26 Javascript
Extjs TimeField 显示正常时间格式的代码
2011/06/28 Javascript
jquery 插件学习(一)
2012/08/06 Javascript
改变隐藏的input中value值的方法
2014/03/19 Javascript
Javascript闭包(Closure)详解
2015/05/05 Javascript
Jquery ajax基础教程
2015/11/20 Javascript
JavaScript常用基础知识强化学习
2015/12/09 Javascript
Bootstrap整体框架之CSS12栅格系统
2016/12/15 Javascript
nodejs开发——express路由与中间件
2017/03/24 NodeJs
vue2.0在table中实现全选和反选的示例代码
2017/11/04 Javascript
实现div内部滚动条滚动到底部和顶部的代码
2017/11/15 Javascript
JavaScript实现新年倒计时效果
2018/11/17 Javascript
深入理解 ES6中的 Reflect用法
2020/07/18 Javascript
解决pyttsx3无法封装的问题
2018/12/24 Python
Python利用lxml模块爬取豆瓣读书排行榜的方法与分析
2019/04/15 Python
Python threading的使用方法解析
2019/08/28 Python
python实现静态服务器
2019/09/05 Python
Python线程指南分享
2019/11/19 Python
Python笔记之观察者模式
2019/11/20 Python
python导入库的具体方法
2020/06/18 Python
Canvas中设置width与height的问题浅析
2018/11/01 HTML / CSS
英国二手物品交易网站:Preloved
2017/10/06 全球购物
GUESS Factory加拿大:牛仔裤、服装及配饰
2019/09/20 全球购物
戴尔荷兰官方网站:Dell荷兰
2020/10/04 全球购物
.NET remoting中对象激活的两种方式
2015/06/08 面试题
教学改革实施方案
2014/03/31 职场文书
高三毕业典礼演讲稿
2014/05/13 职场文书
创建绿色社区汇报材料
2014/08/22 职场文书
学校法制宣传日活动总结
2014/11/01 职场文书
2014年企业工会工作总结
2014/11/12 职场文书
2014年优质护理服务工作总结
2014/11/14 职场文书
三国演义读书笔记
2015/06/25 职场文书
文案策划岗位个人自我评价(范文)
2019/08/08 职场文书
导游词之岳阳楼
2019/09/25 职场文书