大神级Python工程师是怎么P图的,带你用Python玩转P图

群内不定时分享干货,包括最新的python企业案例学习资料和零基础入门教程,欢迎初学和进阶中的小伙伴入群学习交流

1.PIL:Python影像库

PIL或者Python Imaging Library是一个包含许多函数来处理来自Python脚本的图像的包。PIL官方网站在这里。目前版本的PIL是PIL 1.1.7,可用于Python 2.3到Python 2.7。本文将使用Python 2.6的PIL 1.1.7。

在Windows(XP,Vista或者Seven)下,安装PIL相当简单:只需启动PIL Windows安装程序即可。当然你以前需要一个有效的Python 2.6.6安装。

PIL文档可在这里找到:

在线PIL文档

PDF PIL文件

2.加载图像

这是一个小的INIT脚本,它使用PIL来加载图像并显示它。如果您需要,可以在Image.VERSION变量中找到PIL版本。

导入HYP_Utils

导入系统

从PIL导入图像

scriptDir = HYP_Utils.GetDemoDir()

PIL_Version = Image.VERSION

img_filename =“%s / flower.jpg”%scriptDir

im = Image.open(img_filename)

im.show()

在Windows下,Image.show()函数将图像保存到临时文件并调用默认图像查看器实用程序。

3.保存图像

只要调用Image.save()函数。你想保存为JPEG格式?只需将.jpg扩展名添加到图像文件名中即可。对于其他格式也是如此。

阅读和写作支持的格式:*。bmp,*。gif,*。jpg,* .msp,* .pcx,*。png,* .ppm,*。tiff和.xbm。

这里是一个简单的JPG到BMP转换器:

导入HYP_Utils

从PIL导入图像

scriptDir = HYP_Utils.GetDemoDir()

PIL_Version = Image.VERSION

img_filename =“%s / flower.jpg”%scriptDir

im = Image.open(img_filename)

im.save(“%s / flower.bmp”%scriptDir)

4.读取像素

有两个函数可以读取像素图(或像素数据):Image.getpixel()和Image.getdata()。

图片。getpixel()返回单个像素的值。只需给出一个带有X和Y坐标的元组,getpixel()就可以为RGB图像返回一个3元组的RGB值,或者为亮度图像返回一个值。图片。getdata()返回完整的像素图。您需要Python函数list()来创建RGB元组的像素列表。

这里是一个代码片段,用PIL加载图像,用GeeXLab Python API创建一个纹理对象,并用图像像素填充纹理。

导入HYP_Utils

导入HYP_Texture

进口HYP_Material

导入系统

从PIL导入图像

scriptDir = HYP_Utils.GetDemoDir()

PIL_Version = Image.VERSION

img_filename =“%s / flower.jpg”%scriptDir

im = Image.open(img_filename)

imageW = im.size [0]

imageH = im.size [1]

TEXTURE_2D = 2

RGB_BYTE = 2

texId = HYP_Texture.Create(TEXTURE_2D,RGB_BYTE,imageW,imageH,0)

matId = HYP_Material.GetId(“plane1_mat”)

HYP_Material.AddTexture(matId,texId)

如果(im.mode ==“RGB”):

对于范围内的y(0,imageH):

对于范围内的x(0,imageW):

xy =(x,y)

rgb = im.getpixel(xy)

HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb [0],rgb [1],rgb [2])

elif(imout.mode ==“L”):

对于范围内的y(0,imageH):

对于范围内的x(0,imageW):

xy =(x,y)

rgb = im.getpixel(xy)

HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb,rgb,rgb)

使用Image.getdata(),前面脚本的最后几行是:

pixels = list(im.getdata())

如果(im.mode ==“RGB”):

对于范围内的y(0,imageH):

对于范围内的x(0,imageW):

rgb =像素[偏移]

HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb [0],rgb [1],rgb [2])

elif(imout.mode ==“L”):

对于范围内的y(0,imageH):

对于范围内的x(0,imageW):

rgb =像素[偏移]

HYP_Texture.SetValueTex2DByteRgb(texId,offset,rgb,rgb,rgb)

5.图像处理

您可以使用PIL轻松应用通用图像滤镜:模糊,浮雕,锐化等。只需导入ImageFilter模块:

从PIL导入图像

从PIL导入ImageFilter

...

i = Image.open(img_filename)

im = i.filter(ImageFilter.EMBOSS)

#im = i.filter(ImageFilter.FIND_EDGES)

...

预定义的滤镜包括:BLUR,CONTOUR,DETAIL,EDGE_ENHANCE,EDGE_ENHANCE_MORE,EMBOSS,FIND_EDGES,SMOOTH_MORE和SHARPEN。

还有一个名为ImageOps的模块,用于显示colorize(),flip(),grayscale(),invert(),mirror(),solarize()或posterize()等图像处理函数。

6.添加水印

ImageDraw和ImageFont使PIL能够在图像上写文本以及绘制线条或点。这是一个代码片段,显示了一个简单的批量转换器与PIL:它读取文件夹的所有jpg文件,添加水印(十字和“GEEXLAB”字符串),并保存带有gxl_前缀的图像。

导入HYP_Utils

导入os,glob

从PIL导入图像

从PIL导入ImageDraw

从PIL导入ImageFont

scriptDir = HYP_Utils.GetDemoDir()

ft = ImageFont.load(“timR24.pil”)

os.chdir(SCRIPTDIR)

file_list = glob.glob(“*。jpg”)

对于file_list中的f:

im = Image.open(scriptDir + str(f))

draw = ImageDraw.Draw(im)

draw.line((0,0)+ im.size,fill =(255,255,255))

draw.line((0,im.size [1],im.size [0],0),fill =(255,255,255))

wh = ft.getsize(“GEEXLA B”)

draw.text((im.size [0] / 2-wh [0] / 2,im.size [1] / 2 + 20),“GEEXLA B”,

fill =(255,255,0),font = ft)

draw.text((im.size [0] / 2 - wh [0] / 2,im.size [1] / 2 - 60),“GEEXLA B”,

fill =(255,255,0),font = ft)

德尔绘制

im.save(scriptDir +“gxl_”+ str(f))

还有一个很好的函数ImageFont.truetype(),但它不能在我的系统上工作,因为这个函数依赖于_imagingft.pyd库(实际上是一个DLL),由于Visual C运行时问题,无法加载。这是GeeXLab控制台中的错误:

我们来看看实际运用

调整图片亮度:

就个人而言,我认为这张照片看起来不错,但为了演示,我们试着把这张照片调亮。为了提高照片的关键是使用 Pillow's ImageEnhance module:

运行完上面的代码,你就会获得下面这样的图片:

如果你将enhancement factor调整0.0,那么你就会发现整张图片都变成了黑色,而如果你将其调整为0.7,那么你将获得下图:

调整图片对比度

如果我们之前拍摄了一些比较暗的图片,我们可以通过调整对比度和亮度来优化。

上图是一张毛毛虫的照片,我们可以通过将下图的代码和上面的代码相结合来调整图片:

ImageEnhance模块中的所有类都以相同的方式运行。你可以通过改变增强值来优化图片,下图是我将值调整到0.7后得到的:

改变图片的清晰度

如果你想要通过代码来实现图片锐化,那么下面的代码就值得一看:

在这里需要改变的是ImageEnhance的Sharpness类,如果想要锐化图片也可以参照上面的操作。

Pillow package 有很多简洁易用的功能,例如color类,有了它,你就可以随意使用Python来优化图片,玩转图片也可以这么酷炫!

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171230A0SHYP00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券