这篇文章主要介绍了Python如何使用字符打印照片,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

1. 前言

第一次在学校机房里见到计算机,还是上古时期。计算机型号大概是LASER-310吧,有点记不清了。那会儿,显示器还是单色的,只能显示文本,每行最多显示80个字符。想看图片,印象中只能用针式打印机打印在两侧穿孔的宽行打印纸上,每个像素用一个字符表示,不同的字符代表不同的灰度,就像下图这个样子。有没有感觉到浓郁古风呢?其实,随便一张照片,十几行Python代码,你也可以打印出这样的效果,还可以保存成文件。下面,我就一步一步地演示一下。

2. 打开图片,转为灰度模式

Python用于图像处理的模块有很多,最常用的当属PIL和PyOpenCV了。本案使用PIL模块来打开图像:

>>> from PIL import Image

>>> im = Image.open('xufive.jpg')

>>> im.size

(979, 1248)

>>> im.mode

'RGB'

im就是打开的图像对象,im.size是图像的分辨率,im.mode是图像模式。我们知道,计算机图像有很多种颜色模式,RGB是最常见的彩色图像模式。打印字符图片的话,需要将RGB模式转为灰度模式:

>>> im = im.convert('L')

>>> im.mode

'L'

3. 改变分辨率

打印字符图片,需要考虑显示器每行显示的字符个数。假定屏幕水平分辨率为1920,每个字符宽度占8个像素,每行可以显示240个字符。综合考量,我们设定每行显示120个字符。这就需要我们将灰度图片的宽度设置为120个像素,那么图像高度的像素数height应为:

width = 120

height = int(width*im.size[1]/im.size[0])

按照新的分辨率生成图像对象:

>>> im = im.resize((width, height))

>>> im.size

(120, 152)

4. 反白处理

灰度模式下,每个像素的值域范围是0~255,共有256级灰度。考虑到屏幕背景色可能是深色的,也可能是浅色的,我们需要提供图像反白处理的手段。所谓反白处理,就是用灰度最大值255减去每一个像素的灰度值作为该像素新的灰度值。遍历每一个像素,固然可以实现反白,但速度会很慢。本案使用NumPy数组的广播技术,可以显著提升处理速度。我们先把PIL图像对象转成NumPy数组:

>>> import numpy as np

>>> arr = np.array(im)

>>> arr.shape

(152, 120)

>>> arr.dtype

dtype('uint8')

需要特别说明的是,PIL对象的图像分辨率是120x152,表示图像宽度120像素,高度152像素;转成NumPy数组之后,数组的shape则是(152,120),表示图像有152行(对应高度),120列(对应宽度)。虽然PIL对象和NumPy数组关于行列的概念不一致,但表达的物理意义是相同的。

利用NumPy数组的广播技术实现反白处理,只需一行代码,并且瞬间完成:

arr = 255 - arr

5. 确定灰度-字符映射表

在显示器上,字符是由点阵组成的。每个字符的亮点(或暗点)不同,可以用来表示不同的灰度。本案使用了下面8个字符表示不同的灰度:

>>> chs = np.array([' ', '.', '-', '+', '=', '*', '#', '@'])

>>> chs.dtype

dtype('

8个不同的字符,只能表示8级灰度,因此需要将像素的256级灰度值转换为8级:

>>> arr = arr/32

>>> arr = arr.astype(np.uint8)

>>> arr.min(), arr.max()

(0, 7)

6. 灰度转字符

接下来需要将值域范围在0~7之间的每一个像素转为灰度-字符映射表中对应的字符。同样的,我们可以用两层嵌套的循环结构来完成,不过更好的选择是用NumPy数组的矢量化特性来实现。本例展示了NumPy数组非常少见的一种应用方式,我很少见到有人这样应用。

>>> arr = chs[arr]

>>> arr.shape

(152, 120)

>>> arr.dtype

dtype('

7. 打印

有了上述铺垫,打印自然是水到渠成了:

>>> for i in range(arr.shape[0]):

for j in range(arr.shape[1]):

print(arr[i,j], end='')

print()

8. 保存为文件

如果在显示终端上打印不方便观看的话,还可以将字符数据保存成文件:

>>> with open('xufive.txt', 'w') as fp:

for line in arr.tolist():

fp.write(''.join(line))

fp.write('\n')

下图是输出到文本文件,在编辑器中显示的效果。

9. 完整代码

在不同的运行环境中,最终图像显示的宽高比和原图会有差异。为了抵消差异,我在下面的代码中增加了一个矫正系数k,可以通过调整这个参数,获得满意的显示效果。

# -*- coding: utf-8 -*-

from PIL import Image

import numpy as np

def print_photo(photo_file, width=120, k=1.0, reverse=False, outfile=None):

"""打印照片,默认120个字符宽度"""

im = Image.open(photo_file).convert('L') # 打开图片文件,转为灰度格式

height = int(k*width*im.size[1]/im.size[0]) # 打印图像高度,k为矫正系数,用于矫正不同终端环境像素宽高比

arr = np.array(im.resize((width, height ))) # 转为NumPy数组

if reverse: # 反色处理

arr = 255 - arr

chs = np.array([' ', '.', '-', '+', '=', '*', '#', '@']) #灰度-字符映射表

arr= chs[(arr/32).astype(np.uint8)] # 灰度转为对应字符

if outfile:

with open(outfile, 'w') as fp:

for row in arr.tolist():

fp.write(''.join(row))

fp.write('\n')

else:

for i in range(arr.shape[0]): # 逐像素打印

for j in range(arr.shape[1]):

print(arr[i,j], end=' ')

print()

if __name__ == '__main__':

print_photo('xufive.jpg', width=360, k=0.5, outfile='xufive.txt')

下图是在命令行窗口显示的效果。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持【听图阁-专注于Python设计】。

怎么用python打印照片_[宜配屋]听图阁相关推荐

  1. python写词法分析器_[宜配屋]听图阁

    编译原理老师要求写一个java的词法分析器,想了想决定用python写一个. 目标 能识别出变量,数字,运算符,界符和关键字,用excel表打印出来. 有了目标,想想要怎么实现词法分析器. 1.先进行 ...

  2. python 判断节假日_[宜配屋]听图阁

    不废话,直接上代码Python3.6 签到代码,只需修改url,账号,密码即可,此处是登录时无验证登录,有验证码的自行补充 # -*- coding:utf-8 -*- import json imp ...

  3. python 内推_[宜配屋]听图阁

    本文实例为大家分享了网易有道2017内推编程题:洗牌,供大家参考,具体内容如下 ''' [编程题] 洗牌 时间限制:1秒 空间限制:32768K 洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程 ...

  4. python文件传输模块_[宜配屋]听图阁 - python 使用poster模块进行http方式的文件传输到服务器的方法...

    这几天帮内部人员做一个文件传输的小工具,要用http的方式,在用django搭建了个小框架之后,如何进行传输,特别是大文件的传输,成为主要问题.经过查资料,最后选择了通过poster这个模块来进行文件 ...

  5. python中控脚本_[宜配屋]听图阁

    由于考勤机与OA对接,OA会在每天定时取考勤机数据,但是需要考勤机是连接状态,所以搜索了下相关教程,写了个脚本自动连接.完全是个Python小白,代码烂,仅作为笔记. 理论上支持所有程序的每天自动开启 ...

  6. python计算方位角_[宜配屋]听图阁

    知道两点坐标,怎么计算两点方向的方位角? 答:首先计算坐标增量dx,dy(两个对应坐标分量相减,终点的减始点的). 若dx,dy中有一个为零时,根据另一个的正负决定方位角(0,90,180,270这四 ...

  7. 用python画雨滴_[宜配屋]听图阁

    本文实例为大家分享了python实现雨滴下落到地面效果的具体代码,供大家参考,具体内容如下 本程序在Windows 64位操作系统下,安装的是Anaconda3-4.2.0 import numpy ...

  8. python 艺术照片滤镜_[宜配屋]听图阁 - Python实现PS滤镜Fish lens图像扭曲效果示例...

    本文实例讲述了Python实现PS滤镜Fish lens图像扭曲效果.分享给大家供大家参考,具体如下: 这里实现 PS 滤镜中的一种几何变换– Fish lens, 对图像做扭曲,感觉就像通过一个凸镜 ...

  9. python开发一个彩票系统_[宜配屋]听图阁

    本文为大家分享了python实现彩票系统的具体代码,供大家参考,具体内容如下 功能:1.注册  2.登录  3.充钱   4.提现  5.下注  6.开奖  7.退出 简述:彩民需要用身份证号码开户注 ...

最新文章

  1. php 导出excel 特殊字符,export 导出的excel sheet名字包含特殊字符
  2. python基本使用-Python time库基本使用方法分析
  3. NARF(Normal Aligned Radial Feature)关键点
  4. PAT甲级1134 Vertex Cover :[C++题解]顶点覆盖、图论、用结构体存边,bool数组判断
  5. php5.5 mysql网站空间_PHP环境配置IIS5.0+PHP5.23+MYSQL5+phpMyAdmin
  6. RSA javascript加密 lua解密
  7. 怎样把java项目转换成web项目_Eclipse中将Java项目转换成Web项目的方法
  8. 热门项目:高精度图像分类全流程开发
  9. Fragment与FragmentActivity通信封装
  10. 装机防骗武器——鲁大师
  11. HDU 2186--
  12. VC++、MFC Sqlite3数据库的使用
  13. mybatis的一级缓存和二级缓存
  14. 华为/荣耀 笔记本 HiboardDataReport.exe应用程序错误
  15. 色拉英语第2集第4幕: Cheers! ….hiccup
  16. 国产手机再次发力,是否可以阻击三星苹果
  17. [七夕节]——一款基于canvas绘制五颜六色线条合成一个爱心发光动画特效
  18. dart后端之jaguar基础配置
  19. 递归全排列 python实现
  20. 大数据主要有什么用,入行大数据,需要学哪个专业?

热门文章

  1. java B2B2C Springcloud电子商城系统-Ribbon设计原理
  2. Spring Boot定时任务应用实践
  3. Vue的百度地图插件尝试
  4. ReentrantLock和synchronized两种锁定机制
  5. 最小化安装linux CentOS-6.6后 部署fastdfs +下载地址 很干很干的干货
  6. 升级gcc后glibc报错
  7. AbstractFactory抽象工厂模式
  8. 30K 月薪运维工程师面试考什么?滴滴17年春招笔试题
  9. 【聚能聊有奖话题】今日头条公布算法原理,你认可他们的理念吗?
  10. 高级运维工程师的打怪升级之路