使用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 相关文章推荐
Python中的多重装饰器
Apr 11 Python
Python的Django框架下管理站点的基本方法
Jul 17 Python
Python编程判断一个正整数是否为素数的方法
Apr 14 Python
基于python代码实现简易滤除数字的方法
Jul 17 Python
PyQt5 在label显示的图片中绘制矩形的方法
Jun 17 Python
python Pandas库基础分析之时间序列的处理详解
Jul 13 Python
Python将视频或者动态图gif逐帧保存为图片的方法
Sep 10 Python
如何使用Python多线程测试并发漏洞
Dec 18 Python
Python 实现try重新执行
Dec 21 Python
python+opencv实现移动侦测(帧差法)
Mar 20 Python
python 常见的排序算法实现汇总
Aug 21 Python
Django利用elasticsearch(搜索引擎)实现搜索功能
Nov 26 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
解析php5配置使用pdo
2013/07/03 PHP
php文字水印和php图片水印实现代码(二种加水印方法)
2013/12/25 PHP
linux使用crontab实现PHP执行计划定时任务
2014/05/10 PHP
PHP文件锁定写入实例解析
2014/07/14 PHP
php在数据库抽象层简单使用PDO的方法
2015/11/03 PHP
PHP面向对象之里氏替换原则简单示例
2018/04/08 PHP
PHP中使用mpdf 导出PDF文件的实现方法
2018/10/22 PHP
jquery validation插件表单验证的一个例子
2010/03/03 Javascript
javascript之querySelector和querySelectorAll使用介绍
2011/12/20 Javascript
Jquery实现视频播放页面的关灯开灯效果
2013/05/27 Javascript
ajax如何实现页面局部跳转与结果返回
2015/08/24 Javascript
js仿百度登录页实现拖动窗口效果
2016/03/11 Javascript
第一次接触神奇的Bootstrap基础排版
2016/07/26 Javascript
jQuery选择器实例应用
2017/01/05 Javascript
JS基于正则表达式的替换操作(replace)用法示例
2017/04/28 Javascript
基于jQuery选择器之表单对象属性筛选选择器的实例
2017/09/19 jQuery
详解webpack模块化管理和打包工具
2018/04/21 Javascript
vue2.0 自定义组件的方法(vue组件的封装)
2018/06/05 Javascript
微信小程序实现购物车代码实例详解
2019/08/29 Javascript
Python的CGIHTTPServer交互实现详解
2018/02/08 Python
利用Python如何实现一个小说网站雏形
2018/11/23 Python
Python常用爬虫代码总结方便查询
2019/02/25 Python
Python学习笔记之文件的读写操作实例分析
2019/08/07 Python
numpy中三维数组中加入元素后的位置详解
2019/11/28 Python
Python常用库大全及简要说明
2020/01/17 Python
Python Django view 两种return的实现方式
2020/03/16 Python
python seaborn heatmap可视化相关性矩阵实例
2020/06/03 Python
Python3爬虫中识别图形验证码的实例讲解
2020/07/30 Python
利用CSS3把图片变成灰色模式的实例代码
2016/09/06 HTML / CSS
以实惠的价格提供高品质的时尚:Newchic
2018/01/18 全球购物
毕业生的自我评价范文
2013/12/31 职场文书
中年人生感言
2014/02/04 职场文书
家长通知书家长意见
2014/12/30 职场文书
志愿者服务活动总结报告
2015/05/06 职场文书
小学大队长竞选稿
2015/11/20 职场文书
python某漫画app逆向
2021/03/31 Python