使用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 02 Python
Python多进程分块读取超大文件的方法
Apr 13 Python
解决python3中解压zip文件是文件名乱码的问题
Mar 22 Python
PyCharm设置SSH远程调试的方法
Jul 17 Python
Python语言快速上手学习方法
Dec 14 Python
深入理解Django-Signals信号量
Feb 19 Python
初探利用Python进行图文识别(OCR)
Feb 26 Python
python3+selenium自动化测试框架详解
Mar 17 Python
python项目对接钉钉SDK的实现
Jul 15 Python
简单了解python gevent 协程使用及作用
Jul 22 Python
Python利用myqr库创建自己的二维码
Nov 24 Python
python中@contextmanager实例用法
Feb 07 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
第4章 数据处理-php字符串的处理-郑阿奇(续)
2011/07/04 PHP
解析Linux下Varnish缓存的配置优化
2013/06/20 PHP
WordPress中用于获取搜索表单的PHP函数使用解析
2016/01/05 PHP
PHP实现微信提现(企业付款到零钱)
2019/08/01 PHP
jQuery学习4 浏览器的事件模型
2010/02/07 Javascript
js猜数字小游戏的简单实现代码
2013/07/02 Javascript
jQuery学习之prop和attr的区别示例介绍
2013/11/15 Javascript
js用typeof方法判断undefined类型
2014/07/15 Javascript
js格式化时间小结
2014/11/03 Javascript
理解JS事件循环
2016/01/07 Javascript
全面解析Bootstrap中tooltip、popover的使用方法
2016/06/13 Javascript
老生常谈原生JS执行环境与作用域
2016/11/22 Javascript
js微信支付实现代码
2016/12/22 Javascript
React Native 使用Fetch发送网络请求的示例代码
2017/12/02 Javascript
Vue.Draggable拖拽功能的配置使用方法
2020/07/29 Javascript
Vuex中的State使用介绍
2019/01/19 Javascript
layui 数据表格 根据值(1=业务,2=机构)显示中文名称示例
2019/10/26 Javascript
Vue 路由间跳转和新开窗口的方式(query、params)
2019/12/25 Javascript
Python切片用法实例教程
2014/09/08 Python
Python使用设计模式中的责任链模式与迭代器模式的示例
2016/03/02 Python
python使用正则表达式替换匹配成功的组
2017/11/17 Python
Python秒算24点实现及原理详解
2019/07/29 Python
ubuntu上安装python的实例方法
2019/09/30 Python
Python运行DLL文件的方法
2020/01/17 Python
Python字典dict常用方法函数实例
2020/11/09 Python
英国买鞋网站:Charles Clinkard
2019/11/14 全球购物
什么是Connection-oriented Protocol/Connectionless Protocol面向连接的协议/无连接协议
2012/09/06 面试题
小学教师培训感言
2014/02/11 职场文书
创建市级文明单位实施方案
2014/03/01 职场文书
中学生学雷锋活动心得体会
2014/03/10 职场文书
汽车维修专业自荐书
2014/05/26 职场文书
旷课检讨书范文
2014/10/30 职场文书
2016年综治宣传月活动宣传标语口号
2016/03/16 职场文书
Python制作一个随机抽奖小工具的实现
2021/07/07 Python
Java9新特性对HTTP2协议支持与非阻塞HTTP API
2022/03/16 Java/Android
MySQL池化框架学习接池自定义
2022/07/23 MySQL