使用Python将图片转正方形的两种方法实例代码详解


Posted in Python onApril 29, 2020

一、将原图粘贴到一张正方形的背景上

def trans_square(image):
  r"""Open the image using PIL."""
  image = image.convert('RGB')
  w, h = image.size
  background = Image.new('RGB', size=(max(w, h), max(w, h)), color=(127, 127, 127)) # 创建背景图,颜色值为127
  length = int(abs(w - h) // 2) # 一侧需要填充的长度
  box = (length, 0) if w < h else (0, length) # 粘贴的位置
  background.paste(image, box)
  return background

二、切片填充的方式使用numpy创建背景,使用切片将原图的值填充到背景中。

def trans_square(image):
  	r"""Open the image using PIL."""
    img = image.convert('RGB')
    img = np.array(img, dtype=np.uint8) # 图片转numpy
    img_h, img_w, img_c = img.shape
    if img_h != img_w:
      long_side = max(img_w, img_h)
      short_side = min(img_w, img_h)
      loc = abs(img_w - img_h) // 2
      img = img.transpose((1, 0, 2)) if img_w < img_h else img # 如果高是长边则换轴,最后再换回来
      background = np.zeros((long_side, long_side, img_c), dtype=np.uint8) # 创建正方形背景
      background[loc: loc + short_side] = img[...] # 数据填充在中间位置
      img = background.transpose((1, 0, 2)) if img_w < img_h else background
    return Image.fromarray(img, 'RGB')

使用 nn.ZeroPad2d() 或者 nn.ConstantPad2d() 进行填充

def trans_square(image):
  r"""transform square.
  :return PIL image
  """
  img = transforms.ToTensor()(image)
  C, H, W = img.shape
  pad_1 = int(abs(H - W) // 2) # 一侧填充长度
  pad_2 = int(abs(H - W) - pad_1) # 另一侧填充长度
  img = img.unsqueeze(0) # 加轴
  if H > W:
    img = nn.ZeroPad2d((pad_1, pad_2, 0, 0))(img) # 左右填充,填充值是0
    # img = nn.ConstantPad2d((pad_1, pad_2, 0, 0), 127)(img) # 左右填充,填充值是127
  elif H < W:
    img = nn.ZeroPad2d((0, 0, pad_1, pad_2))(img) # 上下填充,填充值是0
    # img = nn.ConstantPad2d((0, 0, pad_1, pad_2), 127)(img) # 上下填充,填充值是127
  img = img.squeeze(0) # 减轴
  img = transforms.ToPILImage()(img)
  return img

ps:下面看下python 将图片转换成九宫格形式

用到的模块PIL(安装:pip install pillow

完整代码:

from PIL import Image 
import sys 
#先将 input image 填充为正方形 
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):
    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(str(index) + '.png', 'PNG') 
    index += 1 
if __name__ == '__main__': 
  file_path = "***"#填入图片名 
  image = Image.open(file_path)   
  #image.show() 
  image = fill_image(image) 
  image_list = cut_image(image) 
  save_images(image_list)

原图:

使用Python将图片转正方形的两种方法实例代码详解

运行程序后效果图:

使用Python将图片转正方形的两种方法实例代码详解

到此这篇关于使用Python将图片转正方形的两种方法的文章就介绍到这了,更多相关python 图片转正方形内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python3读取MySQL-Front的MYSQL密码
May 03 Python
Python制作豆瓣图片的爬虫
Dec 28 Python
Python实现k-means算法
Feb 23 Python
Python去除、替换字符串空格的处理方法
Apr 01 Python
python 获取当天每个准点时间戳的实例
May 22 Python
django rest framework 数据的查找、过滤、排序的示例
Jun 25 Python
matplotlib.pyplot绘图显示控制方法
Jan 15 Python
Django框架组成结构、基本概念与文件功能分析
Jul 30 Python
python中几种自动微分库解析
Aug 29 Python
python面向对象之类属性和类方法案例分析
Dec 30 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
Aug 05 Python
Python 详解通过Scrapy框架实现爬取百度新冠疫情数据流程
Nov 11 Python
Python通过Pillow实现图片对比
Apr 29 #Python
Python unittest单元测试框架实现参数化
Apr 29 #Python
Python ORM框架Peewee用法详解
Apr 29 #Python
3种适用于Python的疯狂秘密武器及原因解析
Apr 29 #Python
Pytorch十九种损失函数的使用详解
Apr 29 #Python
Python格式化输出--%s,%d,%f的代码解析
Apr 29 #Python
Python爬虫工具requests-html使用解析
Apr 29 #Python
You might like
php接口实现拖拽排序功能
2018/04/23 PHP
Nigma vs AM BO3 第二场2.13
2021/03/10 DOTA
默认让页面的第一个控件选中的javascript代码
2009/12/26 Javascript
jQuery 数据缓存data(name, value)详解及实现
2010/01/04 Javascript
jquery实现的图片点击滚动效果
2014/04/29 Javascript
JavaScript开发人员的10个关键习惯小结
2014/12/05 Javascript
Javascript添加监听与删除监听用法详解
2014/12/19 Javascript
jQuery动画显示和隐藏效果实例演示(附demo源码下载)
2015/12/31 Javascript
详解webpack模块加载器兼打包工具
2018/09/11 Javascript
js replace替换字符串同时替换多个方法
2018/11/27 Javascript
使用vue制作滑动标签
2019/09/21 Javascript
javascript实现图片轮换动作方法
2020/08/07 Javascript
基于Ionic3实现选项卡切换并重新加载echarts
2020/09/24 Javascript
如何封装Vue Element的table表格组件
2021/02/06 Vue.js
浅谈Python中列表生成式和生成器的区别
2015/08/03 Python
老生常谈Python序列化和反序列化
2017/06/28 Python
Python实现改变与矩形橡胶的线条的颜色代码示例
2018/01/05 Python
Python生成任意范围任意精度的随机数方法
2018/04/09 Python
Python中collections模块的基本使用教程
2018/12/07 Python
对Python生成汉字字库文字,以及转换为文字图片的实例详解
2019/01/29 Python
python实现矩阵打印
2019/03/02 Python
python算法题 链表反转详解
2019/07/02 Python
你的自行车健身专家:FaFit24
2016/11/16 全球购物
戴尔英国官网:Dell英国
2017/05/27 全球购物
澳大利亚最好的在线时尚精品店:Princess Polly
2018/01/03 全球购物
如何在.net Winform里面显示PDF文档
2012/09/11 面试题
客服主管岗位职责
2013/12/13 职场文书
前台文员我鉴定
2014/01/12 职场文书
打架检讨书300字
2014/02/02 职场文书
庆元旦广播稿
2014/02/10 职场文书
党建工作经验交流材料
2014/05/25 职场文书
宣传活动总结范文
2014/07/01 职场文书
2015年党总支工作总结
2015/05/25 职场文书
2015年医院科室工作总结范文
2015/05/26 职场文书
公司酒会致辞
2015/07/30 职场文书
Redis配置外网可访问(redis远程连接不上)的方法
2022/12/24 Redis