1.前言前不久写了一篇文章,详细介绍了PIL库中Image模块的使用。学习和使用PS有一段时间了。认识了PIL之后,觉得这东西太好玩了。有了用PIL库实现PS中图片特效的想法。好了,我们现在直接进入案例,废话不多说。2.面具图片本案例中使用的图片素材取自舅舅(小有名气的书法家)的书法作品。第一部书法作品:心佛。这部心中有佛的作品,只需要上面的佛字就可以了。在进行后续操作之前,首要任务就是截取佛字,也就是整个画面的上半部分。这里使用了两种方案。2.1使用Image模块的裁剪方法。这种方法简单直接。裁剪时需要指定裁剪的矩形区域。左上角的坐标很容易确定(0,0)。四分之一的工作。您还可以稍微精确地计算右下角的位置。佛字与下方内容之间有一段较为完整的白色分割区域。你可以以行为单位从上到下扫描整张图片,如果你发现那一行像素的R、G、B值近似相等且值大于200,你可以确定位置。有兴趣的可以试试。fromPILimportImage#打开原图fo_img=Image.open("fo.jpg")#因为后面要用这张图做mask,需要透明通道,所以需要转成RGBA模式fo_img=fo_img.convert("RGBA")#获取图片本身的尺寸w,h=fo_img.size#h/4-55完全是测试的偏差值fo_img=fo_img.crop((0,0,w,h/4-55))fo_img.show()下面是裁剪后的图片效果。2.2逐像素裁剪当RGB模式转换为RGBA模式时,Python解释器会为多出的一个通道分配255。因为佛字后面要当面具用。这里需要将佛像中白色区域的a通道值修正为0(所有白色区域变成透明区域)。因为是书法图,整个画面呈现出明显的黑白两极分布。白色区域的R、G、B颜色分量值在200左右,黑色文字的R、G、B颜色分量值在100左右。提示:当使用图像作为蒙版时,图像的a通道值为0,被蒙版图像覆盖的图像将变得透明。其中a通道为255表示完全不透明,从0到255逐渐由透明变为不透明。fromPILimportImagefo_img=Image.open("fo.jpg")#先转为RGBA模式fo_img=fo_img.convert("RGBA")#获取图片本身的尺寸w,h=fo_img.size#新建一个blank图片的大小与要裁剪的佛像大小相同fo_only_img=Image.new(fo_img.mode,(w,int(h/4)-55))w,h=fo_only_img.sizeforiinrange(w):forjinrange(h):#获取每个像素的颜色分量r,g,b,a=fo_img.getpixel((i,j))#将白色区域的a值改为0,白色区域的R,G和B值相似ifr>180org>180orb>180:a=0#为新图像指定新的颜色模式fo_only_img.putpixel((i,j),(r,g,b,a))fo_only_img.show()上面的代码需要注意的是,截取的图像数据会写入到新的图像中。两种方案对比:第一种方案提取出来后,仍然需要修改每个像素点的透明度信息。第二个选项一步到位。处理好佛字图后,准备一幅春归书法作品作为蒙版图。为了更容易理解蒙版图和蒙版图的关系,这里贴一张示意图。以下代码还创建了一个白色图像作为背景。fromPILimportImagefo_img=Image.open("fo.jpg")#先转为RGBA模式fo_img=fo_img.convert("RGBA")#获取图片本身的尺寸w,h=fo_img.size#新建一个blank图片的大小与要裁剪的佛像大小相同fo_only_img=Image.new(fo_img.mode,(w,int(h/4)-55))w,h=fo_only_img.sizeforiinrange(w):forjinrange(h):#获取每个像素的颜色分量r,g,b,a=fo_img.getpixel((i,j))#将白色区域的a值改为0ifr>180:a=0#为新图像指定新的颜色模式fo_only_img.putpixel((i,j),(r,g,b,a))#在开始准备遮罩效果之前,打开遮罩图像chun_gui_img=Image.open("chungui.jpg")#修改chun_gui_img图像与遮罩图像大小相同chun_gui_img=chun_gui_img.resize(fo_only_img.size)#创建一个新的空白纯白色背景图像new_img=Image.new("RGBA",chun_gui_img.size)#开始粘贴new_img.paste(chun_gui_img,mask=fo_only_img)new_img.show()执行代码后,可以看到如下图片效果。这种效果在PS中比较容易实现(毕竟都是专业的图像处理软件)。几个变化:在反转效果前,将佛图白色区域的a值设置为0,白色区域对应的春回图会变透明。现在反过来,将文本区域的a值设置为0,可以看到和上图相反的效果。fromPILimportImageimportrandomfo_img=Image.open("fo.jpg")#先转为RGBA模式fo_img=fo_img.convert("RGBA")#获取图片本身的尺寸w,h=fo_img.size#创建一个blank新图与待裁剪佛像大小相同fo_only_img=Image.new(fo_img.mode,(w,int(h/4)-55))w,h=fo_only_img.size#步长值step=1step1=1foriinrange(0,w,1):forjinrange(h):#获取每个像素的颜色分量r,g,b,a=fo_img.getpixel((i,j))#文本该区域的a值设置为0ifr<80:a=0#为新图像指定新的颜色模式fo_only_img.putpixel((i,j),(r,g,b,a))#开始准备制作mask在效果之前,先打开底图chun_gui_img=Image.open("chungui.jpg")#修改chun_gui_img图片与mask图片大小一致chun_gui_img=chun_gui_img.resize(fo_only_img.size)#创建一个新图像new_img=Image.new("RGBA",chun_gui_img.size,(100,200,80))#开始粘贴new_img.paste(chun_gui_img,mask=fo_only_img)new_img.show()如果设置背景色为金色,佛字会变成金色。同样,您可以选择任何您喜欢的颜色。new_img=Image.new("RGBA",chun_gui_img.size,ImageColor.getrgb("gold"))particleeffect粒子效果的思路和上一个类似。使用random模块,让文本区域的透明度值随机变化,让文本区域有的地方透明,有的地方不透明,有的地方半透明。fromPILimportImageimportrandomfo_img=Image.open("fo.jpg")#先转为RGBA模式fo_img=fo_img.convert("RGBA")#获取图片本身的尺寸w,h=fo_img.size#创建一个blank新图与待裁剪佛像大小相同fo_only_img=Image.new(fo_img.mode,(w,int(h/4)-55))w,h=fo_only_img.sizeprint(w)#stepvaluestep=1foriinrange(0,w,1):forjinrange(h):#获取每个像素的颜色分量r,g,b,a=fo_img.getpixel((i,j))ifr>180:a=0elifr<100:#Randoma-=random.randint(0,255)#为新图像指定新的颜色模式fo_only_img.putpixel((i,j),(r,g,b,a))#在开始准备遮罩效果之前,打开底图chun_gui_img=Image.open("chungui.jpg")#修改chun_gui_img图片与遮罩图片大小一致chun_gui_img=chun_gui_img.resize(fo_only_img.size)#新建图片new_img=Image.new("RGBA",chun_gui_img.size)#开始粘贴new_img.paste(chun_gui_img,mask=fo_only_img)new_img.show()3。Stringimage将图像中的每个像素点替换为不同的字符串,然后保存字符串信息。在下面的代码中,白色区域中的像素被替换为“仁”字样。黑色文字区域的像素被替换为“佛”字。fromPILimportImageimportrandomfo_img=Image.open("fo.jpg")#先转为RGBA模式fo_img=fo_img.convert("RGBA")#获取图片本身的尺寸w,h=fo_img.size#创建一个blank新图与待裁剪佛像大小相同fo_only_img=Image.new(fo_img.mode,(w,int(h/4)-55))w,h=fo_only_img.size#stepsizeold_rgb=Nones=''foriinrange(w):forjinrange(h):#获取每个像素的颜色分量r,g,b,a=fo_img.getpixel((i,j))fo_only_img.putpixel((i,j),(r,g,b,a))fo_only_img=fo_only_img.resize((300,300))w,h=fo_only_img.sizeforiinrange(h):forjinrange(w):r,g,b,a=fo_only_img.getpixel((j,i))如果r>100:s+="ren"否则:s+='fo's+="\n"withopen("d:/fo.txt",'w')asf:f.write(s)找到对应的文本文件,打开,缩小,可以清晰的看到一个大大的“佛”字。放大看,会发现整个佛字是由很多小佛字组成的。4.总结编程和书法一样,是一门艺术,艺术是为生活服务的。程序可以让人类的生活更方便,书法可以让人类的精神世界更美好。两人走到一起,世界就充满了仁爱。更多技术文章,请关注我的公众号!
