使用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采集博客中上传的QQ截图文件
Jul 18 Python
python中__call__内置函数用法实例
Jun 04 Python
python 默认参数问题的陷阱
Feb 29 Python
python实现简单多人聊天室
Dec 11 Python
Python数据预处理之数据规范化(归一化)示例
Jan 08 Python
python基础梳理(一)(推荐)
Apr 06 Python
Pycharm简单使用教程(入门小结)
Jul 04 Python
numpy数组广播的机制
Jul 12 Python
python json load json 数据后出现乱序的解决方案
Feb 27 Python
使用Keras构造简单的CNN网络实例
Jun 29 Python
pygame面向对象的飞行小鸟实现(Flappy bird)
Apr 01 Python
Python序列化与反序列化相关知识总结
Jun 08 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
将兴奋、喜悦和坎加斯带到戴安娜:亚马逊公主
2020/03/03 欧美动漫
PHP定时执行计划任务的多种方法小结
2011/12/19 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
2014/12/16 PHP
Symfony2学习笔记之插件格式分析
2016/03/17 PHP
PHP实现的用户注册表单验证功能简单示例
2019/02/25 PHP
JSDoc 介绍使用规范JsDoc的使用介绍
2011/02/12 Javascript
jQuery插件animateSlide制作多点滑动幻灯片
2015/06/11 Javascript
JavaScript编写简单的计算器
2015/11/25 Javascript
详解js中构造流程图的核心技术JsPlumb
2015/12/08 Javascript
React实现点击删除列表中对应项
2017/01/10 Javascript
angularjs定时任务的设置与清除示例
2017/06/02 Javascript
实现vuex与组件data之间的数据同步更新方式
2019/11/12 Javascript
原生js实现下拉选项卡
2019/11/27 Javascript
vue实现一个矩形标记区域(rectangle marker)的方法
2020/10/28 Javascript
详解javascript脚本何时会被执行
2021/02/05 Javascript
[43:51]2014 DOTA2国际邀请赛中国区预选赛 Dream Times VS TongFu
2014/05/22 DOTA
[01:16]DOTA2小知识课堂 Ep.03 芒果树无伤肉山
2019/12/05 DOTA
python读取csv文件示例(python操作csv)
2014/03/11 Python
用map函数来完成Python并行任务的简单示例
2015/04/02 Python
Python第三方库的安装方法总结
2016/06/06 Python
python绘制中国大陆人口热力图
2018/11/07 Python
Python enumerate函数功能与用法示例
2019/03/01 Python
在python tkinter中Canvas实现进度条显示的方法
2019/06/14 Python
python异步编程 使用yield from过程解析
2019/09/25 Python
Python中生成ndarray实例讲解
2021/02/22 Python
公司财务流程之主管工作流程
2014/03/03 职场文书
乡村文明行动实施方案
2014/03/29 职场文书
房务中心文员岗位职责
2014/04/16 职场文书
大学学风建设方案
2014/05/04 职场文书
2014乡镇党委副书记对照检查材料思想汇报
2014/10/09 职场文书
投资入股合作协议书
2014/10/28 职场文书
2014村书记党建工作汇报材料
2014/11/02 职场文书
通知书大全
2015/04/27 职场文书
项目备案申请报告
2015/05/15 职场文书
跑出一片天观后感
2015/06/08 职场文书
2016入党积极分子党校培训心得体会
2016/01/06 职场文书