怎么用python打印照片_[宜配屋]听图阁
这篇文章主要介绍了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打印照片_[宜配屋]听图阁相关推荐
- python写词法分析器_[宜配屋]听图阁
编译原理老师要求写一个java的词法分析器,想了想决定用python写一个. 目标 能识别出变量,数字,运算符,界符和关键字,用excel表打印出来. 有了目标,想想要怎么实现词法分析器. 1.先进行 ...
- python 判断节假日_[宜配屋]听图阁
不废话,直接上代码Python3.6 签到代码,只需修改url,账号,密码即可,此处是登录时无验证登录,有验证码的自行补充 # -*- coding:utf-8 -*- import json imp ...
- python 内推_[宜配屋]听图阁
本文实例为大家分享了网易有道2017内推编程题:洗牌,供大家参考,具体内容如下 ''' [编程题] 洗牌 时间限制:1秒 空间限制:32768K 洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程 ...
- python文件传输模块_[宜配屋]听图阁 - python 使用poster模块进行http方式的文件传输到服务器的方法...
这几天帮内部人员做一个文件传输的小工具,要用http的方式,在用django搭建了个小框架之后,如何进行传输,特别是大文件的传输,成为主要问题.经过查资料,最后选择了通过poster这个模块来进行文件 ...
- python中控脚本_[宜配屋]听图阁
由于考勤机与OA对接,OA会在每天定时取考勤机数据,但是需要考勤机是连接状态,所以搜索了下相关教程,写了个脚本自动连接.完全是个Python小白,代码烂,仅作为笔记. 理论上支持所有程序的每天自动开启 ...
- python计算方位角_[宜配屋]听图阁
知道两点坐标,怎么计算两点方向的方位角? 答:首先计算坐标增量dx,dy(两个对应坐标分量相减,终点的减始点的). 若dx,dy中有一个为零时,根据另一个的正负决定方位角(0,90,180,270这四 ...
- 用python画雨滴_[宜配屋]听图阁
本文实例为大家分享了python实现雨滴下落到地面效果的具体代码,供大家参考,具体内容如下 本程序在Windows 64位操作系统下,安装的是Anaconda3-4.2.0 import numpy ...
- python 艺术照片滤镜_[宜配屋]听图阁 - Python实现PS滤镜Fish lens图像扭曲效果示例...
本文实例讲述了Python实现PS滤镜Fish lens图像扭曲效果.分享给大家供大家参考,具体如下: 这里实现 PS 滤镜中的一种几何变换– Fish lens, 对图像做扭曲,感觉就像通过一个凸镜 ...
- python开发一个彩票系统_[宜配屋]听图阁
本文为大家分享了python实现彩票系统的具体代码,供大家参考,具体内容如下 功能:1.注册 2.登录 3.充钱 4.提现 5.下注 6.开奖 7.退出 简述:彩民需要用身份证号码开户注 ...
最新文章
- php 导出excel 特殊字符,export 导出的excel sheet名字包含特殊字符
- python基本使用-Python time库基本使用方法分析
- NARF(Normal Aligned Radial Feature)关键点
- PAT甲级1134 Vertex Cover :[C++题解]顶点覆盖、图论、用结构体存边,bool数组判断
- php5.5 mysql网站空间_PHP环境配置IIS5.0+PHP5.23+MYSQL5+phpMyAdmin
- RSA javascript加密 lua解密
- 怎样把java项目转换成web项目_Eclipse中将Java项目转换成Web项目的方法
- 热门项目:高精度图像分类全流程开发
- Fragment与FragmentActivity通信封装
- 装机防骗武器——鲁大师
- HDU 2186--
- VC++、MFC Sqlite3数据库的使用
- mybatis的一级缓存和二级缓存
- 华为/荣耀 笔记本 HiboardDataReport.exe应用程序错误
- 色拉英语第2集第4幕: Cheers! ….hiccup
- 国产手机再次发力,是否可以阻击三星苹果
- [七夕节]——一款基于canvas绘制五颜六色线条合成一个爱心发光动画特效
- dart后端之jaguar基础配置
- 递归全排列 python实现
- 大数据主要有什么用,入行大数据,需要学哪个专业?