python画画简单_用python画画

参考官方手册:Pillow

相关阅读资料:廖雪峰python教程

图片的基本知识

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

图片常见格式: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]

原始图

7f5851f9261c

image.png

效果图

7f5851f9261c

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() #展示图片

效果图:

7f5851f9261c

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')

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

7f5851f9261c

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

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

原图

7f5851f9261c

image.png

字符画(本来为字符文本,下为截图)

7f5851f9261c

image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值