Python--图片转字符画

2018年4月8日

17:30

PS:嗯,作为初学python的第一个练手项目,有一些教程是在Linux下搭建实现的而且有一些还是用的python2实现的,之间也是遇到了一些大大小小的问题。麻雀虽小,五脏俱全,所以就写个教程做心得抑或总结以备忘。(全程是建立在初学者的思维和角度思考问题的,如是老鸟或大神请绕道~~~~)

 

写在开头:哒哒哒,如果正在阅读的是刚将python语法学完的新手,那不得不说这个项目很适合你,虽然整个文件只有50行左右的代码,但是其中需要思考和学习的知识点与细节值得深究。那废话不多说,撸起袖子就是干!!

 

一、实验介绍

1.1实验简介

本实验用50行左右代码完成图片转字符画小工具。通过本实验将学到Python基础知识,pillow库(主要是Image模块)的使用,Image模块的常用方法使用以及pycharm的简单操作。

 

1.2实验知识点

1.python基础

2.pillow库的使用

3.Image常用方法的使用

 

1.3实验环境

  • Windows10
  • Python3.5
  • Pycharm IDE

 

二、实验原理

首先,什么是字符画,就是一系列字符的组合,只不过恰好组成的形状是一幅可识别的图画(先上效果图,哒哒哒~~~~)

  Python--图片转字符画_第1张图片
Python--图片转字符画_第2张图片

是不是感觉有那么一点意思,瞬间兴趣度爆满,那么就解释一下简单的原理:首先,每一张彩色的图片,之所以能够呈现出colorful或者dim的画面,只因为每一张图都由很多个像素点组成,而每一个像素点都有不同的颜色,而这个颜色就由三个值(rgb)对应三原色的百分比构成,所以每一个像素点都有三个值(rgb,范围0-255),那么我们就可以将每一个像素点转换成一个字符这样就能形成一个字符图画了。那么问题就来了,总共有256*256*256种颜色,可是我们不可能有有这么多种字符来一一对应啊,所以接下来就要引入新的概念:灰度值。

灰度值:指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0,故黑白图片也称灰度图像

rgb转换成灰度值公式:

gray=int(r*0.299+g*0.587+b*0.114)

也就是说通过这个公式瞬间将256*256*256的范围瞬间减少到0-255,有些人可能还会问,那我也没有256个单色字符去一一对应范围啊,这个时候不就可以灵活变通,将两到三个灰度值对应为一种字符不就ok了。

那么至于这个公式怎么来的或者怎么实现的,我们就不需要深究了,或者也可以去了解了解其中的算法,这里提供博客链接:

https://blog.csdn.net/xdrt81y/article/details/8289963

 

三、开发准备

原理解释完毕,接下来就是具体操作实现过程。

首先,需要一个第三方图像处理库PIL(Python Image Library)的下载,博主是在win10下开发的,所以需要下载该库,快捷键win+R输入cmd打开dos命令窗,输入:

pip install pillow

等待下载完即可,在python运行环境中import就好。但是在这里由于我们需要在pycharm中进行开发,所以我们还需要在pycharm中进行下载包:

 Python--图片转字符画_第3张图片

 Python--图片转字符画_第4张图片

Python--图片转字符画_第5张图片
下载好以后就可以安心的开始写代码导库了,但是在写代码之前,你一定有疑问,这个pillow库是干嘛的,应该要怎么用(我当时就是这么想的,哈哈哈~~),那我就简单讲解下这个项目所需要的知识点部分(更详细的可以自行百度)

 

四、简单介绍pillow库

1.要想简单了解pillow库,就需要简单了解下一些相关基本概念:

  • 通道(bands):每张图片由一个或多个数据通道构成,例如常见的rgb图像,每张图片都由三个数据通道构成,即R、G和B通道,而上面说的灰度图像只有一个通道。获取图片的通道方法是:getbands(),以元组数据类型返回。
  • 模式(mode):图像的模式定义了图像的类型和像素的位宽,有一些常见模式:

1:1位像素,表示黑和白,但是存储的时候每个像素存储为8bit。

L:8位像素,表示黑和白。

P:8位像素,使用调色板映射到其他模式。

RGB:3x8位像素,为真彩色。

RGBA:4x8位像素,有透明通道的真彩色。

CMYK:4x8位像素,颜色分离。

YCbCr:3x8位像素,彩色视频格式。

I:32位整型像素。

F:32位浮点型像素。

可以通过Image.made返回图片模式

  • 滤波器:将多个输入像素映射为一个输出像素的几何操作(比较复杂,做个参考就好)

2.其中Image模块中的常用方法:

  • Image.save("save.gif","GIF")  #保存为GIF格式,至于前一个参数是保存路径,如果不写绝对路径自动保存在当前文件夹下
  • Image.new(mode,size,color)  #创建新图片

注意保存时是new创建图片对象,再用对象的save方法保存

  • Image.conver("RGBA")  #图像类型转换
  • Image.size  #返回的是一个二元组,即该图片的大小,size[0]为水平长,size[1]为竖直高
  • Image.getpixel((w,h))  #获取某个点的像素值(即rgb值),注意其参数是必须(wedith,height)不能换顺序!!!切记

 

五、代码参考
Python--图片转字符画_第6张图片
  • 代码简析

首先第一行是导入pillow库和Image模块,第三行中变量codelib是一个字符串序列,而count变量为其长度;第6行开始到第20行是一个转换函数(该程序的灵魂):形参是文件对象,第8-9行是用于测试用的返回图片文件的模式和通道(前面概念所说的),以判断该图片是rgb模式还是rgba模式。接下来的双重for循环中表示对图片的像素点进行遍历,其中13-16行就是我加的一个图片模式的判断,防止变量在接收每个像素点的rgb值时出现indexerror(因为有一些图片是rgba模式,就是增加了一个透明度值,所以如果每次都是用r,g,b三个变量存储getpoxel()返回的值就会有溢出),第17行就是进行灰度值转换。而18行中字符串变量codePic则是用于存储所对应出来的字符,其中:codeLib[int(((count-1)*gray)/256)]

就是用于转换成codelib中字符索引;第19行:就是在图片每一次行遍历完后字符尾部添加“\t和\n”,用于return这个字符串列表时打印出来能够自动换行,而不是直接一行打印出来。22-29行就是文件的打开和写入了,soeasy!!

 

(可能讲的比较繁琐,完全是为新手着想,嘻嘻嘻~~~~)

 

 

写完代码,在pycharm中,ctrl+shift+F10,就可以在你相应目录下找到该txt文件打开就会发现:嘻嘻

你可能感兴趣的:(python,pillow,pycharm)