python怎么打印图片_Python:使用字符打印照片
最早的显示器是单色的,只能显示文本,每行最多显示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:使用字符打印照片相关推荐
- python怎么打印图片_Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头...
一. 打印图片属性.设置图片存储路径 代码如下: #打印图片的属性.保存图片位置 import cv2 as cv import numpy as np #numpy是一个开源的python科学计算库 ...
- python怎么打印图片_Python如何使用字符打印照片
这篇文章主要介绍了Python如何使用字符打印照片,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1. 前言 第一次在学校机房里见到计算机,还是上古 ...
- python打印机打印图片_python连接打印机实现打印文档、图片、pdf文件等功能
引言 python连接打印机进行打印,可能根据需求的不同,使用不同的函数模块. 如果你只是简单的想打印文档,比如office文档,你可以使用ShellExecute方法,对于微软office的文档.p ...
- js控制台 console 骚操作-打印图片-自定义样式-字符画
目录 控制台打印骚操作 自定义样式 打印(输出)图片 借助平台打印字符(符号组成) Lunicode 平台操作 图片转字符打印 控制台打印骚操作二 效果图 代码实现 错误案例 方式一(感觉有点乱) 方 ...
- python实现 发送图片到打印机 进行打印
前言 环境 操作系统:win10 python:3.8.16 依赖 pip install openpyxl qrcode pillow pypiwin32 reportlab 功能 python p ...
- python实践输出星星_python中怎么打印星星
for循环: 1.有大括号与无大括号的区别: 循环体只能有一条语句, 如果需要执行的语句超过一条,就要加大括号将它们变为一条复合语句.//for循环如此,while循环也是如此. for(int i= ...
- python pdf处理 图片_python PDF文件合并、图片处理
一.合并多个PDF文件 实例: #导入模块import codecs import os import PyPDF2 as PyPDF2 #建立一个装pdf文件的数组 files = list()#遍 ...
- python显示gif图片_Python给gif图片加文字水印
为了成批地给图像增加水印,我们这里用到了枕头模块.它的英文名为pillow.安装它的方式为用cmd命令打开DOS提示符窗口,然后输入pip install pillow即可.就像下面这样: pytho ...
- python获取网页图片_python抓取网页中的图片示例
python抓取网页中的图片示例 代码如下: #coding:utf8 import re import urllib def getHTML(url): page = urllib.urlopen( ...
最新文章
- 搜集《ASP.NET中常用的26个优化性能方法》
- 【Android 逆向】IDA 工具使用 ( 同步指定的 IDA View 视图 | Hex View 数据格式 | 过滤设置 )
- Python过渡性模块重载(递归重载模块)
- Hologres揭秘:如何支持超高QPS在线服务(点查)场景
- Intel(R)Turbo Boost Technology Driver上面显示为感叹号
- vue sync用法
- php spl_autoload_register() 函数
- oracle 如何形成死锁,Oracle数据表中的死锁情况解决方法
- sqllite查询数据量_详解SQLite中的查询规划器
- 宋宝华:评Linux 5.13内核
- python与html5_python前端HTML和CSS入门
- 任天堂 虚拟主机服务器,任天堂 虚拟主机服务器
- 4.2 文本特征抽取的两种方式CountVectorizer与TfidfVectorizer
- MongoDB 可视化管理工具 MongoCola-1.1.0 测试版发布
- python实现arxiv论文数据解析处理
- python 使用多线程进行压力测试
- 计算机组装与维护致谢,浅谈计算机组装与维护的教学改革-毕业论文致谢
- 苹果手机数据线充不了电_自动洗地机充不了电,洗地机厂家
- 使用数字滤波器处理音频噪声(附Matlab程序)
- 【小白到大牛之路】-开发环境搭建
热门文章
- 一个简单的员工薪资管理系统(大一\二实训课)
- 环境配置 龙书dx12_DX12龙书实践——DirectX3D初始化
- Foresight AI 创始人袁昌:搭建3D视觉数据平台,助推自动驾驶商业化
- 隐式龙格库塔法举例说明
- LiteOS内存管理
- windos 为什么会突然服务停止了_Win7系统print spooler服务总是自动停止怎么办?
- 洛谷 P1610 鸿山洞的灯
- Python: PS 滤镜特效 -- Marble Filter
- DC/DC电源模块直流升压线性可调正负输出5v12v24v转0-±50v/±110v/±200v/±250v/±360v/±500v
- python开源ide_前5个开源Python IDE