用python画画

参考官方手册:<a href="http://pillow.readthedocs.io/en/4.0.x/index.html">Pillow</a>
相关阅读资料:<a href="http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431953239820157155d21c494e5786fce303f3018c86000">廖雪峰python教程</a>

图片的基本知识

图片分为矢量图和位图,矢量图不会与分辨率无关。位图即普通的图片,以方形点状图像组合图片,将图像的每一个象素点转换为一个数据,点数越多图像品质越高,文件越大。

图片常见格式:PNG,GIF,JPG,PDF,RGBA

分辨率指单位打印长度显示的像素数目,通常用像素/英寸表示,高分辨率图像比相同尺寸低分辨率图像细腻清晰。

色彩模式:可打印的彩色图片CMKY模式,黑白图片灰度模式(灰度值:指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0,故黑白图片也称灰度图像),网络图片RGB模式

常用模块

全名:Python Imaging Library ,可以利用python完成图片操作。
包含的常用Module:Image,ImageColor,ImageFont,ImageDraw,ImageFile,ImageFilter

from PIL import Image,ImageDraw,ImageFont,ImageFilter,ImageColor

#im本身是一个Image class
#Image
im.format #im的文件格式(type:string or None)
im.mode #im的模式
im.size #im的大小,表示为tuple(width,height)
im.width #im的宽度
im.height #im的高度
im.info #im的信息
im=Image.open(fp,mode="r")  #打开图片文件注意为当前路径,Returns:An Image object.
im=Image.new(mode, size, color=0) #Creates a new image with the given mode and size.
im.save("test.jpg", 'jpeg')  #用jpeg格式保存图片
im.thumbnail(size, resample=3) #缩放图片im为size(tuple(width,height))
im.show(title=None, command=None) #展示图片
im2 = im.filter(ImageFilter.BLUR) #模糊图片im,返回im2,参数为ImageFilter里的常数
im2 = im.resize(size, resample=0) #改变图片大小,返回a resized copy of this image
im2 = im.point(lut, mode=None) #对每个像素点执行lut函数,如lambda i:i*2(对每个点加强一倍)
im2 = im.rotate(angle, resample=0, expand=0, center=None, translate=None) #顺时针旋转angle
im2 = im.copy()  #Copies this image,but still retain the original.
value=Im.getpixel(xy) #得到(x,y)的像素值pixel value,xy为2-tuples.


#ImageFont
font = ImageFont.truetype(font=None, size=10, index=0, encoding='') #创建Font对象,font参数为truetype font file.

#ImageDraw
draw = ImageDraw.Draw(im,mode=None) #创建Draw对象
draw.point(xy,fill=None) #填充像素,xy为要填充的像素点(2-tuples(x,y)),fill为要使用的color
draw.text(xy, text, fill=None, font=None, anchor=None, spacing=0, align="left") #向图片写入文字,xy为坐标,fill为color,font为ImageFont instance.

先来简单处理一下齐神图片

缩放图片

from PIL import Image
im=Image.open("test.jpg")
width,height=im.size  #获得图片尺寸
print("the original size is %s*%s"%(width,height))
im.thumbnail((width//2,height//2)) #缩放一半
print("resize size is %s*%s"%(width//2,height//2))
im.save("test1.jpg","jpeg")
运行结果
the original size is 160*160
resize size is 80*80
[Finished in 0.3s]

原始图
image.png

效果图
image.png

加滤镜模糊图片

from PIL import Image, ImageFilter
im = Image.open('test.jpg')
im2=im.filter(ImageFilter.BLUR)#滤镜模糊BLUR,可选其他滤镜
im2.save("test2.jpg",'jpeg') #保存图片
im2.show() #展示图片

效果图:
image.png

接着来制作随机字母验证码

#绘图:生成一个随机验证码(模糊,随机,四个字母,但未进行颠倒操作)
from PIL import Image,ImageDraw,ImageFont,ImageFilter
import random   #导入random module
#随机字母
def rndChar():
    return chr(random.randint(65,90))
#随机颜色
def rndColor():
    return (random.randint(64,255),random.randint(64,255),random.randint(64,255))
#随机颜色
def rndColor2():
    return (random.randint(32,127),random.randint(32,127),random.randint(32,127))
width=240
height=60
image=Image.new('RGB',(width,height),(255,255,255)) #创建图片对象
font=ImageFont.truetype('C:\Windows\Fonts\Arial.ttf',36)#创建Font对象
draw=ImageDraw.Draw(image) #create Draw class
#填充每个像素
for x in range(height):
    for y in range(width):
        draw.point((x,y),fill=rndColor())
#输出文字
for i in range(4):
    draw.text((60*i+10,10),rndChar(),font=font,fill=rndColor2())
# 模糊处理
image=image.filter(ImageFilter.BLUR)
image.save('test3.jpg','jpeg')

用随机颜色填充背景,生成随机字母,最后加滤镜,得到验证码:


image.png

再来实现图片转字符画

from PIL import Image
ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
def get_char(r,g,b,alpha=256):
    if alpha=='0': 
        return ''
    length=len(ascii_char)
    gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
    unit = (256.0 + 1)/length
    return ascii_char[int(gray/unit)]

width=50
height=50
if __name__=='__main__':
    im=Image.open('test.jpg')
    im=im.resize((width,height),Image.NEAREST)
    text=''
    for i in range(height):
        for j in range(width):
            text+=get_char(*im.getpixel((j,i)))#getpixel得到各点的像素值
        text+='\n'
    print(text)
    with open('out.txt','w') as f:
        f.write(text)

字符画就是字符构成的画,可以把字符看作一个大的像素点。
灰度值:指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0,故黑白图片也称灰度图像
使用灰度值公式将像素的 RGB 值映射到灰度值:

gray = 0.2126 * r + 0.7152 * g + 0.0722 * b

可以创建一个不重复的字符列表,灰度值小(暗)的用列表开头的符号,灰度值大(亮)的用列表末尾的符号。

原图
image.png

字符画(本来为字符文本,下为截图)
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容