社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

用Python发一个高逼格的朋友圈

Python之禅 • 4 年前 • 454 次点击  

今天要给大家介绍一个Python库:PIL(Python Image Library)


下面我们用一个实际的例子,看看50行python代码可以做什么神奇的事情。


这是发的一个朋友圈,切图前是一张图,切图后就是九张图啦,成功霸屏😄


除了可以处理规整的正方形图片,还可以处理非规则的图片。比如下面这张宽度远大于高度的图片,怎么处理呢?


很简单,取宽和高之间的较大值,然后填充白色,就可以构造出一张正方形的图片啦。




当然,想把一张图片做成这样子也很容易啦,现在很多手机上的图片处理软件都能实现。


举这个例子只是为了给大家介绍介绍PIL库,感兴趣的童鞋也可以练习练习编程嘛~

好了,现在就来看看这个PIL库到底是个什么吧~


PIL是一个功能非常强大的Python图像处理标准库,但是呢,由于PIL支持Python2.7,所以使用Python3的程序猿们又在PIL的基础上分离出来了一个分支,创建了另外一个库Pillow,是可以支持Python3。Pillow兼容了PIL的大部分语法,使用起来也非常的简单。


下面就讲讲是如何使用PIL库实现了上文介绍的小程序。

其实思路很简单:


对应代码如下:

# -*- coding: utf-8 -*-
'''
将一张图片填充为正方形后切为9张图
'''

from PIL import Image
import sys
#将图片填充为正方形
def fill_image(image):
   width, height = image.size    
   #选取长和宽中较大值作为新图片的
   new_image_length = width if width > height else height    
   #生成新图片[白底]
   new_image = Image.new(image.mode, (new_image_length, new_image_length), color='white')    
   #将之前的图粘贴在新图上,居中
   if width > height:#原图宽大于高,则填充图片的竖直维度
       #(x,y)二元组表示粘贴上图相对下图的起始位置
       new_image.paste(image, (0, int((new_image_length - height) / 2)))
   else:
       new_image.paste(image, (int((new_image_length - width) / 2),0))    
   return new_image
#切图
def cut_image(image):
   width, height = image.size
   item_width = int(width / 3)
   box_list = []    
   # (left, upper, right, lower)
   for i in range(0,3):#两重循环,生成9张图片基于原图的位置
       for j in range(0,3):          
           #print((i*item_width,j*item_width,(i+1)*item_width,(j+1)*item_width))
           box = (j*item_width,i*item_width,(j+1)*item_width,(i+1)*item_width)
           box_list.append(box)

   image_list = [image.crop(box) for box in box_list]    
   return image_list
#保存
def save_images(image_list):
   index = 1
   for image in image_list:
       image.save('./result/python'+str(index) + '.png', 'PNG')
       index += 1

if __name__ == '__main__':
   file_path = "python.jpeg"
   image = Image.open(file_path)  
   #image.show()
   image = fill_image(image)
   image_list = cut_image(image)
   save_images(image_list)

相信大家看了代码就知道是怎么实现的了吧,代码中可能比较难理解的地方也给出了相应的注释,大家赶快把代码下载下来拿去跑一跑。

github地址:

https://github.com/yangxuan0928/cut_image



推荐阅读:

警惕:火车票打码也能算出完整身份证信息

知乎高赞、高逼格1024程序员节礼物
推荐一整套 Python 开发工具



好文和朋友一起看~
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/48053
 
454 次点击