最早的显示器是单色的,只能显示文本,每行最多显示80个字符。想看图片只能用针式打印机打印在两侧穿孔的宽行打印纸上,每个像素用一个字符表示,不同的字符代表不同的灰度,就像下图这个样子。

有没有感觉到浓郁古风呢?其实,随便一张照片,十几行Python代码,你也可以打印出这样的效果,还可以保存成文件。下面,我就一步一步地演示一下。

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

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'

2. 改变分辨率

打印字符图片,需要考虑显示器每行显示的字符个数。

假定屏幕水平分辨率为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)

3. 反白处理

灰度模式下,每个像素的值域范围是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

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

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

本案使用了下面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)

5. 灰度转字符

接下来需要将值域范围在0~7之间的每一个像素转为灰度-字符映射表中对应的字符。

同样的,我们可以用两层嵌套的循环结构来完成,不过更好的选择是用NumPy数组的矢量化特性来实现。本例展示了NumPy数组非常少见的一种应用方式,我很少见到有人这样应用。>>> arr = chs[arr]

>>> arr.shape

(152, 120)

>>> arr.dtype

dtype('

6. 打印

有了上述铺垫,打印自然是水到渠成了:>>> for i in range(arr.shape[0]):

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

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

print()

7. 保存为文件

如果在显示终端上打印不方便观看的话,还可以将字符数据保存成文件:>>> with open('xufive.txt', 'w') as fp:

for line in arr.tolist():

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

fp.write('\n')

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

8. 完整代码

在不同的运行环境中,最终图像显示的宽高比和原图会有差异。为了抵消差异,我在下面的代码中增加了一个矫正系数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怎么打印图片_Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头...

    一. 打印图片属性.设置图片存储路径 代码如下: #打印图片的属性.保存图片位置 import cv2 as cv import numpy as np #numpy是一个开源的python科学计算库 ...

  2. python怎么打印图片_Python如何使用字符打印照片

    这篇文章主要介绍了Python如何使用字符打印照片,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1. 前言 第一次在学校机房里见到计算机,还是上古 ...

  3. python打印机打印图片_python连接打印机实现打印文档、图片、pdf文件等功能

    引言 python连接打印机进行打印,可能根据需求的不同,使用不同的函数模块. 如果你只是简单的想打印文档,比如office文档,你可以使用ShellExecute方法,对于微软office的文档.p ...

  4. js控制台 console 骚操作-打印图片-自定义样式-字符画

    目录 控制台打印骚操作 自定义样式 打印(输出)图片 借助平台打印字符(符号组成) Lunicode 平台操作 图片转字符打印 控制台打印骚操作二 效果图 代码实现 错误案例 方式一(感觉有点乱) 方 ...

  5. python实现 发送图片到打印机 进行打印

    前言 环境 操作系统:win10 python:3.8.16 依赖 pip install openpyxl qrcode pillow pypiwin32 reportlab 功能 python p ...

  6. python实践输出星星_python中怎么打印星星

    for循环: 1.有大括号与无大括号的区别: 循环体只能有一条语句, 如果需要执行的语句超过一条,就要加大括号将它们变为一条复合语句.//for循环如此,while循环也是如此. for(int i= ...

  7. python pdf处理 图片_python PDF文件合并、图片处理

    一.合并多个PDF文件 实例: #导入模块import codecs import os import PyPDF2 as PyPDF2 #建立一个装pdf文件的数组 files = list()#遍 ...

  8. python显示gif图片_Python给gif图片加文字水印

    为了成批地给图像增加水印,我们这里用到了枕头模块.它的英文名为pillow.安装它的方式为用cmd命令打开DOS提示符窗口,然后输入pip install pillow即可.就像下面这样: pytho ...

  9. python获取网页图片_python抓取网页中的图片示例

    python抓取网页中的图片示例 代码如下: #coding:utf8 import re import urllib def getHTML(url): page = urllib.urlopen( ...

最新文章

  1. 搜集《ASP.NET中常用的26个优化性能方法》
  2. 【Android 逆向】IDA 工具使用 ( 同步指定的 IDA View 视图 | Hex View 数据格式 | 过滤设置 )
  3. Python过渡性模块重载(递归重载模块)
  4. Hologres揭秘:如何支持超高QPS在线服务(点查)场景
  5. Intel(R)Turbo Boost Technology Driver上面显示为感叹号
  6. vue sync用法
  7. php spl_autoload_register() 函数
  8. oracle 如何形成死锁,Oracle数据表中的死锁情况解决方法
  9. sqllite查询数据量_详解SQLite中的查询规划器
  10. 宋宝华:评Linux 5.13内核
  11. python与html5_python前端HTML和CSS入门
  12. 任天堂 虚拟主机服务器,任天堂 虚拟主机服务器
  13. 4.2 文本特征抽取的两种方式CountVectorizer与TfidfVectorizer
  14. MongoDB 可视化管理工具 MongoCola-1.1.0 测试版发布
  15. python实现arxiv论文数据解析处理
  16. python 使用多线程进行压力测试
  17. 计算机组装与维护致谢,浅谈计算机组装与维护的教学改革-毕业论文致谢
  18. 苹果手机数据线充不了电_自动洗地机充不了电,洗地机厂家
  19. 使用数字滤波器处理音频噪声(附Matlab程序)
  20. 【小白到大牛之路】-开发环境搭建

热门文章

  1. 一个简单的员工薪资管理系统(大一\二实训课)
  2. 环境配置 龙书dx12_DX12龙书实践——DirectX3D初始化
  3. Foresight AI 创始人袁昌:搭建3D视觉数据平台,助推自动驾驶商业化
  4. 隐式龙格库塔法举例说明
  5. LiteOS内存管理
  6. windos 为什么会突然服务停止了_Win7系统print spooler服务总是自动停止怎么办?
  7. 洛谷 P1610 鸿山洞的灯
  8. Python: PS 滤镜特效 -- Marble Filter
  9. DC/DC电源模块直流升压线性可调正负输出5v12v24v转0-±50v/±110v/±200v/±250v/±360v/±500v
  10. python开源ide_前5个开源Python IDE