使用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启动办公软件进程(word、excel、ppt、以及wps的et、wps、wpp)
Apr 09 Python
python 算法 排序实现快速排序
Jun 05 Python
Python的Flask框架中集成CKeditor富文本编辑器的教程
Jun 13 Python
Python检测生僻字的实现方法
Oct 23 Python
python梯度下降法的简单示例
Aug 31 Python
python调用c++ ctype list传数组或者返回数组的方法
Feb 13 Python
Python一行代码实现快速排序的方法
Apr 30 Python
python日志logging模块使用方法分析
May 23 Python
Python字符串三种格式化输出
Sep 17 Python
如何利用Python matplotlib绘制雷达图
Dec 21 Python
VSCODE配置Markdown及Markdown基础语法详解
Jan 19 Python
解决pycharm修改代码后第一次运行不生效的问题
Feb 06 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
德生H-501的评价与改造
2021/03/02 无线电
PHP新手上路(十二)
2006/10/09 PHP
PHP 生成微信红包代码简单
2016/03/25 PHP
php倒计时出现-0情况的解决方法
2016/07/28 PHP
php获取服务器操作系统相关信息的方法
2016/10/08 PHP
Yii输入正确验证码却验证失败的解决方法
2017/06/06 PHP
JavaScript的类型转换(字符转数字 数字转字符)
2010/08/30 Javascript
JQuery实现的购物车功能(可以减少或者添加商品并自动计算价格)
2015/01/13 Javascript
jQuery实现Email邮箱地址自动补全功能代码
2015/11/03 Javascript
基于jquery实现日历签到功能
2020/09/11 Javascript
JavaScript中绑定事件的三种方式及去除绑定
2016/11/05 Javascript
概述一个页面从输入URL到页面加载完的过程
2016/12/16 Javascript
微信小程序实现下拉刷新和轮播图效果
2017/11/21 Javascript
vue-router的钩子函数用法实例分析
2019/10/26 Javascript
vue中改变滚动条样式的方法
2020/03/03 Javascript
[02:47]DOTA2英雄基础教程 野性怒吼兽王
2013/12/05 DOTA
python写的ARP攻击代码实例
2014/06/04 Python
Python程序设计入门(5)类的使用简介
2014/06/16 Python
python使用BeautifulSoup分页网页中超链接的方法
2015/04/04 Python
Python性能提升之延迟初始化
2016/12/04 Python
Python实现图片转字符画的代码实例
2019/02/22 Python
Django框架自定义session处理操作示例
2019/05/27 Python
python TF-IDF算法实现文本关键词提取
2019/05/29 Python
Python爬虫程序架构和运行流程原理解析
2020/03/09 Python
爱他美官方海外旗舰店:Aptamil奶粉
2017/12/22 全球购物
世界上最值得信赖的多日游在线市场:TourRadar
2018/07/20 全球购物
教师自我评价范例
2013/09/24 职场文书
国际政治个人自荐信范文
2013/11/26 职场文书
庆元旦广播稿
2014/02/10 职场文书
党员违纪检讨书
2014/02/18 职场文书
租车协议书范本2014
2014/11/17 职场文书
新教师个人工作总结
2015/02/06 职场文书
被告代理词范文
2015/05/25 职场文书
2016年“5.12”护士节致辞
2015/07/31 职场文书
2016年五一促销广告语
2016/01/28 职场文书
解读MySQL的客户端和服务端协议
2021/05/10 MySQL