导读

项目中需要用到图片批量化处理,所以玩了下PIL做了个简单的小项目,解放双手批量制作淘宝主图的功能

任务目标

  • 根据传入的图片数量,自动放大缩小寻找计算可对齐的中心点进行裁切
  • 按照传入图片数量,定制化排版图片
  • 生成模糊背景,以及标题遮罩,根据输入的文字标题信息,自动定位排版标题位置

效果预览及核心代码逻辑

  1. 如果只传入一张图片的话,展示效果,包括核心代码实现
# 如果传入一张图片 就复制一份在中间缩略 另外一张底部平铺模糊
if(num == 1):new_im = self.resizeImage(ims[0],bw,bh)ft.paste(new_im, (0, 0)) # 模糊底图pass
  1. 如果传入两张图片的话,展示效果,包括核心代码实现

# 如果传入两张图片 就在对角各展示一张
elif(num == 2):scale = 0.5new_im_1 = self.resizeImage(ims[0],int(bw*scale),int(bh*scale))new_im_1_copy = new_im_1.copy()new_im_2 = self.resizeImage(ims[1],int(bw*scale),int(bh*scale))new_im_2_copy = new_im_2.copy()ft.paste(new_im_1, (-lineW, -lineW)) #左上ft.paste(new_im_2, (int(bw*scale)+lineW, -lineW)) #右上ft.paste(new_im_2, (-lineW, int(bh*scale)+lineW)) #左下ft.paste(new_im_1, (int(bw*scale)+lineW, int(bh*scale)+lineW)) #右下pass
  1. 如果传入的是三张图片 横着两张 竖着三张排列
# 如果传入的是三张图片
elif(num == 3):xw = int(bw/2)xh = int(bh/num)new_im_1 = self.resizeImage(ims[0],xw,xh)new_im_2 = self.resizeImage(ims[1],xw,xh)new_im_3 = self.resizeImage(ims[2],xw,xh)ft.paste(new_im_1, (-lineW, -lineW))  #左上ft.paste(new_im_3, (xw+lineW, -lineW)) #右上ft.paste(new_im_2, (-lineW, xh+lineW)) #中左ft.paste(new_im_1, (xw+lineW, xh+lineW)) #中右ft.paste(new_im_3, (-lineW, xh*2+lineW*2)) #下左ft.paste(new_im_2, (xw+lineW, xh*2+lineW*2)) #下右
  1. 如果传入的是四张图片
# 如果传入的是四张图片
elif(num == 4):xw1 = int(bw*0.6)xh1 = int(bh*0.5)xw2 = int(bw*0.4)xh2 = int(bh*0.4)xh3 = int(bh*0.6)new_im_1 = self.resizeImage(ims[0],xw1,xh1)new_im_2 = self.resizeImage(ims[1],xw1,xh1)new_im_3 = self.resizeImage(ims[2],xw2,xh3)new_im_4 = self.resizeImage(ims[3],xw2,xh2)ft.paste(new_im_1, (-lineW, -lineW))  #左上ft.paste(new_im_4, (xw1+lineW, -lineW)) #右上ft.paste(new_im_2, (-lineW, xh1+lineW*2)) #下左ft.paste(new_im_3, (xw1+lineW, xh2+lineW*2)) #下右
  1. 如果传入的是五张图片
# 如果传入的是5张图片
elif(num == 5):xw1 = int(bh*0.5)xh1 = int(bh*0.33333)xh2 = int(bh*0.5)new_im_1 = self.resizeImage(ims[0],xw1,xh1)new_im_2 = self.resizeImage(ims[1],xw1,xh1)new_im_3 = self.resizeImage(ims[2],xw1,xh1)new_im_4 = self.resizeImage(ims[3],xw1,xh2)new_im_5 = self.resizeImage(ims[4],xw1,xh2)ft.paste(new_im_1, (-lineW, -lineW))  ft.paste(new_im_2, (-lineW, xh1+lineW)) ft.paste(new_im_3, (-lineW, (xh1+lineW)*2)) ft.paste(new_im_4, (xw1+lineW, xh2+lineW)) ft.paste(new_im_5, (xw1+lineW, -lineW)) pass
  1. 如果传入的是六张图片
# 如果传入的是6张图片
elif(num == 6):xw1 = int(bw*0.5)xh1 = int(bh*0.65)xw2 = int(bw*0.25)xh2 = int(bh*0.35)new_im_1 = self.resizeImage(ims[0],xw1,xh1)new_im_2 = self.resizeImage(ims[1],xw1,xh1)new_im_3 = self.resizeImage(ims[2],xw2,xh2)new_im_4 = self.resizeImage(ims[3],xw2,xh2)new_im_5 = self.resizeImage(ims[4],xw2,xh2)new_im_6 = self.resizeImage(ims[5],xw2,xh2)ft.paste(new_im_1, (-lineW, -lineW))  ft.paste(new_im_2, (xw1+lineW, -lineW)) ft.paste(new_im_3, (-lineW*3, xh1+lineW))ft.paste(new_im_4, (xw2-lineW, xh1+lineW)) ft.paste(new_im_5, (xw2*2+lineW, xh1+lineW)) ft.paste(new_im_6, (xw2*3+lineW*3, xh1+lineW)) pass
  1. 如果传入的是七张图片
# 如果传入的是7张图片
elif(num == 7):xw1 = int(bw*0.5)xh1 = int(bh*0.3333)xw2 = bwxw3 = int(bw*0.25)new_im_1 = self.resizeImage(ims[0],xw1,xh1)new_im_2 = self.resizeImage(ims[1],xw1,xh1)new_im_3 = self.resizeImage(ims[2],xw2,xh1)new_im_4 = self.resizeImage(ims[3],xw3,xh1)new_im_5 = self.resizeImage(ims[4],xw3,xh1)new_im_6 = self.resizeImage(ims[5],xw3,xh1)new_im_7 = self.resizeImage(ims[6],xw3,xh1)ft.paste(new_im_1, (-lineW, -lineW))  ft.paste(new_im_2, (xw1+lineW, -lineW)) ft.paste(new_im_3, (0, xh1+lineW))ft.paste(new_im_4, (-lineW, (xh1+lineW)*2)) ft.paste(new_im_5, (xw3, (xh1+lineW)*2)) ft.paste(new_im_6, (xw3*2+lineW, (xh1+lineW)*2))ft.paste(new_im_7, (xw3*3+lineW*2, (xh1+lineW)*2)) pass
  1. 如果传入的是八张图片
# 如果传入的是8张图片
elif(num == 8):xw1 = int(bw*0.3333)xh1 = int(bh*0.3333)xw2 = int(bw*0.6666)new_im_1 = self.resizeImage(ims[0],xw1,xh1)new_im_2 = self.resizeImage(ims[1],xw1,xh1)new_im_3 = self.resizeImage(ims[2],xw1,xh1)new_im_4 = self.resizeImage(ims[3],xw1,xh1)new_im_5 = self.resizeImage(ims[4],xw1,xh1)new_im_6 = self.resizeImage(ims[5],xw1,xh1)new_im_7 = self.resizeImage(ims[6],xw1,xh1)new_im_8 = self.resizeImage(ims[7],xw2,xh1)ft.paste(new_im_1, (-lineW, -lineW))  ft.paste(new_im_2, (xw1+lineW, -lineW)) ft.paste(new_im_3, ((xw1+lineW)*2, -lineW))ft.paste(new_im_4, (-lineW, xh1)) ft.paste(new_im_5, (xw1+lineW, xh1)) ft.paste(new_im_6, ((xw1+lineW)*2, xh1))ft.paste(new_im_7, (-lineW, (xh1+lineW)*2))ft.paste(new_im_8, (xw1+lineW, (xh1+lineW)*2)) pass

实现标题遮罩效果

预览

代码实现逻辑

def combineTextImages(self,im):width = im.size[0]height = im.size[1]fontSize = 60#生成一张空白图像imgCircle = Image.new("RGBA",(width,height))ft = ImageFont.truetype("./font/SYHT.TTF", fontSize)scale = 0.8img_w = int(width*scale)img_h = int(height*scale)# 缩放遮罩圆imgCircle = imgCircle.resize( (width,height) )draw = ImageDraw.Draw(imgCircle)draw.chord(( int((width-img_w)*0.5), int((height-img_h)*0.5), img_w+int((width-img_w)*0.5), img_h+int((height-img_h)*0.5) ), 0, 360, fill=(0,0,0,150))w = int((width-img_w)*0.5)h = int((height-img_h)*0.5)#绘制横条标题栏# imgRect = Image.new( "RGBA", (width, height) )# drawRect = ImageDraw.Draw(imgRect)txt = "水彩手绘花卉花朵植物卡片" #标题信息txt = txt[0:28]txt1 = ''txt2 = ''if(len(txt) > 14):txt1 = txt[0:13]txt2 = txt[13:]else:txt1 = txt# 如果两行if(txt2 != ''):txt1_len = self.calcTxtLen(txt1)*fontSizetxt2_len = self.calcTxtLen(txt2)*fontSizedraw.text( (int((width-txt1_len)/2), int(height*0.375+height*0.25*0.3)-fontSize), u''+txt1, font = ft, fill = '#ffffff') draw.text( (int((width-txt2_len)/2), int(height*0.375+height*0.25*0.8)-fontSize), u''+txt2, font = ft, fill = '#ffffff') pass# 如果一行else:txt_len = self.calcTxtLen(txt1)*fontSizeprint(txt_len)draw.text( (int((width-txt_len)/2), int(height*0.375+height*0.25*0.6)-fontSize), u''+txt1, font = ft, fill = '#ffffff') #int((width-txt_len)/2),int(height*0.375+height*0.25*0.4) - fontSize)pass# 开始半透明素材im.paste(imgCircle, ( 0, 0 ), mask=imgCircle)im.show()im.save('xxx.png')im.close()pass

根据自定义形状裁剪框合理裁剪任意大小图片逻辑

# 尺寸重新缩放
def resizeImage(self, im, w, h):#im = Image.open(path,"r")im = im# 获取图片尺寸size_w = im.size[0]size_h = im.size[1]# 判断是竖着图还是横着的图resize_w = 0resize_h = 0# 获取原素材的缩放倍数resize = self.calcWH(w,h,size_w,size_h)im = im.resize((resize[0],resize[1]))# 获取裁剪的位置x1,y1,x2,y2box_pos = self.calcCropPos(w,h,resize[0],resize[1])box = [box_pos[0],box_pos[1],box_pos[2],box_pos[3]]im = im.crop(box)return im#计算宽高比例
def calcWH(self, w1, h1, w2, h2):resize_w = 0resize_h = 0# 横图if(w1 >= h1):wh_1 = h1/w1wh_2 = h2/w2# 按宽计量if(wh_1 < wh_2):resize_w = w1resize_h = int(w1/w2*h2)# 按高计量else:resize_w = int(h1/h2*w2)resize_h = h1# 竖图else:wh_1 = w1/h1wh_2 = w2/h2# 按宽计量if(wh_1 < wh_2):resize_w = int(h1/h2*w2)resize_h = h1# 按高计量else:resize_w = w1resize_h = int(w1/w2*h2)return (resize_w, resize_h)# 计算裁剪的位置坐标
def calcCropPos(self, w1, h1, w2, h2):x1 = 0y1 = 0x2 = 0y2 = 0if(w1 == w1):x1 = 0y1 = int((h2-h1)*0.5)x2 = w1y2 = int((h2-h1)*0.5)+h1else:x1 = int((w2-w1)*0.5)y1 = 0x2 = int((w2-w1)*0.5)+w1y2 = h1return (x1, y1, x2, y2)

python+PIL批量制作淘宝主图(头图)及满屏水印添加相关推荐

  1. 如何制作淘宝主图视频

    至今为止,使用到淘宝主图视频的店铺还是并不多见,但是相信很多淘宝卖家对于"淘宝主图视频"多少有 一些了解.段长度为9秒钟的淘宝主图视频,这个视频将在买家打开宝贝详情页的时候进行播放 ...

  2. 制作淘宝主图视频的软件

    至今为止,使用到淘宝主图视频的店铺还是并不多见,但是相信很多淘宝卖家对于"淘宝主图视频"多少有 一些了解.段长度为9秒钟的淘宝主图视频,这个视频将在买家打开宝贝详情页的时候进行播放 ...

  3. python批量获取淘宝主图地址

    帮老婆整理一个任务表格,里面有几百条淘宝商品的链接,还需要从商品页面截图放上去,一个一个截图太麻烦了,于是用正则表达式把地址提取出来,再用vba把图片地址转换为图片. # -*- coding: UT ...

  4. PYTHON实现批量下载淘宝详情页图片

    1.打开某件宝贝的详情页地址url 例如下图这款windows10鼠标垫宝贝,url地址为下图红色框框里! 注意:目前此代码不支持天猫详情页图片下载.可以关注我后续的文章,也可以自行研究,原来一样.只 ...

  5. python urllib库获取淘宝主图

    1 分析 首先对网页url进行分析.我们将第二页.第三页最后s=44改为s=0时,我们刚好获取的为第一页数据,所以我们总结出商品的页数为链接最后的s=44*ii为页数为[0,1,2,3-] #第一页链 ...

  6. 怎么修改淘宝主图尺寸大小?图片尺寸修改的方法

    在制作淘宝主图的时候,偶尔会需要修改图片尺寸来符合上传要求,那么怎么去给图片改大小(https://www.yasuotu.com/size)呢?这里可以通过在线改图片大小的方法来实现,快捷又方便,而 ...

  7. 淘宝主图视频1:1正方形竖屏视频讲解

    本节课为大家带来淘宝1:1主图视频的实例讲解,用照片视频制作软件-会声会影X10,三分钟教大家做出实用的淘宝主图视频,细致的从素材的选择,导入,项目参数最初的设置以及最后的渲染来一一说明. 之前已经出 ...

  8. 手把手教你使用Python轻松打造淘宝主图视频生成神器

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 人世几回伤往事,山形依旧枕寒流. ...

  9. 靠这个Python脚本轻松月入上万?你信不?打造淘宝主图视频生成!

    前言 做过网店的朋友多多少少都会用到主图视频,因为它可以提高网店商品的曝光率,以此提高店铺商品的成交率,今天,小编就来带大家做一个这样的神器,据说在网上同类软件是收费软件,我们做好后就可以免费的使用啦 ...

最新文章

  1. 取消Eclipse等号、分号、空格代码自动补全
  2. Typescript 其实就想排个序和枚举取数
  3. 状态管理框架开发不完全指南
  4. oracle usenl,深入理解Oracle表(1):ORDERED和USE_NL | 学步园
  5. UIKIT_EXTERN和define定义常量
  6. 简而言之Java.io:22个案例研究
  7. 使用artTemplate模板将json转换为html页面
  8. Algorithm:字典序最小问题
  9. 16年毕业,刚入行软件测试,就拿到这么多薪资......因为稳定的时刻学习
  10. asp.net 打印控件之报表
  11. 关于Android的ImageView置顶
  12. XTUOJ-1104-素数个数
  13. 如何降低网站跳出率方法
  14. 厦门大学电子科学系夏令营
  15. linux下安装ffmpeg过程
  16. vue+file-saver+xlsx 封装导出Excel表格方法
  17. C语言程序设计现代方法(第二版)十二章课后练习题部分答案
  18. 八、vue_options之computed、watch属性选项
  19. Mybatis 解决数据库字段名和实体类属性名不一致问题
  20. php网站页面显示源码,用PHP显示网站的源代码

热门文章

  1. 服务器网站权限设置,在服务器上设置网站权限
  2. == 和 equal
  3. 滴滴美团又出事,要怎么做,才能避免“吸血”平台?
  4. python爬虫快速添加请求头、随机生成user-agent
  5. 使用ffmpeg制作时光影集
  6. C语言编写1000元五种方法存五年的利息
  7. 百分比,千分比,万分比,百分比或百分吕,千分率等
  8. micro的介绍、安装与使用
  9. microbit c语言编程软件,Micro:bit系列教程25:自定义Micro:bit软件包
  10. Vim中输入法与编码设置