使用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程序中使用SQLAlchemy时出现乱码的解决方案
Apr 24 Python
在Python程序和Flask框架中使用SQLAlchemy的教程
Jun 06 Python
python中MethodType方法介绍与使用示例
Aug 03 Python
TensorFlow saver指定变量的存取
Mar 10 Python
Django中的文件的上传的几种方式
Jul 23 Python
python 使用re.search()筛选后 选取部分结果的方法
Nov 28 Python
Python3.5面向对象与继承图文实例详解
Apr 24 Python
全面了解django的缓存机制及使用方法
Jul 22 Python
Python获取对象属性的几种方式小结
Mar 12 Python
python 的topk算法实例
Apr 02 Python
如何学习Python time模块
Jun 03 Python
手把手教你使用TensorFlow2实现RNN
Jul 15 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实现字符串大小写转函数的功能实例
2019/02/06 PHP
PHP swoole和redis异步任务实现方法分析
2019/08/12 PHP
禁止直接访问php文件代码分享
2020/05/05 PHP
可以显示单图片,多图片ajax请求的ThickBox3.1类下载
2007/12/23 Javascript
javascript调试说明
2010/06/07 Javascript
JavaScript flash复制库类 Zero Clipboard
2011/01/17 Javascript
利用div+jquery自定义滚动条样式的2种方法
2013/07/18 Javascript
JQuery加载图片自适应固定大小的DIV
2013/09/12 Javascript
javascript自定义startWith()和endWith()的两种方法
2013/11/11 Javascript
js使用ajax读博客rss示例
2014/05/06 Javascript
jQuery统计上传文件大小的方法
2015/01/24 Javascript
10个很棒的jQuery代码片段
2015/09/24 Javascript
jquery点击改变class并toggle的实现代码
2016/05/15 Javascript
详解angular2采用自定义指令(Directive)方式加载jquery插件
2017/02/09 Javascript
Javascript中Promise的四种常用方法总结
2017/07/14 Javascript
vue点击input弹出带搜索键盘并监听该元素的方法
2018/08/25 Javascript
基于jquery ajax的多文件上传进度条过程解析
2019/09/11 jQuery
完美解决通过IP地址访问VUE项目的问题
2020/07/18 Javascript
[04:07]显微镜下的DOTA2第八期——英雄复活动作
2014/06/24 DOTA
python删除列表元素的三种方法(remove,pop,del)
2019/07/22 Python
Python笔记之观察者模式
2019/11/20 Python
Pyspark获取并处理RDD数据代码实例
2020/03/27 Python
解决Python Matplotlib绘图数据点位置错乱问题
2020/05/16 Python
浅析几个CSS3常用功能的写法
2014/06/05 HTML / CSS
马来西亚与新加坡长途巴士售票网站:BusOnlineTicket.com
2018/11/05 全球购物
异常和异常类的概念
2014/09/12 面试题
《乞巧》教学反思
2014/02/27 职场文书
优秀求职信
2014/05/29 职场文书
贷款委托书
2014/08/01 职场文书
社区党员公开承诺书
2014/08/30 职场文书
2015年置业顾问工作总结
2015/04/07 职场文书
2015年市场部工作总结
2015/04/30 职场文书
纪录片信仰观后感
2015/06/08 职场文书
致运动员赞词
2015/07/22 职场文书
MySQL系列之十三 MySQL的复制
2021/07/02 MySQL
win10蓝屏0xc0000001安全模式进不了怎么办?win10出现0xc0000001的解决方法
2022/08/05 数码科技