前言

效果图如下:

可以看出来,由小图片拼接为最终的正方形的大图,大图的边长由多个小图组成,为了维持❤️形的对成性,故而大图的边长应该为奇数个小图,因此在由图片数量计算大图的边长时若为偶数应减一。

由大图边长各为5、7、9画出预期心形图的示意如下:

规律可自行总结,可能爱心的效果不是很好,如果有更好想法的欢迎交流讨论,共同进步。

代码

下面将完整代码贴出来,具体的解释在注释中,有疑问的可以先看上一篇博客:
Python将大量图片拼成心形(一)

from PIL import Image
import os
import math
import random
import uuid# 处理的所有图片及结果存放的总目录
dir = "/Users/wleng/Downloads/图片3"
# 白底图片所在的路径
whiteImagePath = ["/Users/lengwei/Downloads/图片3/white.png"]
# 白底图片所在的目录
whiteGoalPath = "/Users/lengwei/Downloads/图片3/白底色/"
# 拼接后的图片的总尺寸,根据尺寸和图片数量计算出每张图片的大小
totalSize = 1000
# 重设大小后的图片所在的目录
transferDir = '1'
# 拼接结果图片所在的目录
resultDir = '2'# 计算每个拼接大图需要多少个小图作为边长拼接
def getSize(num):# 最小边长从5开始,由其心形规律得出n的计算公式(推理步骤不放出来了)n = math.floor(math.sqrt(2 * num + 27 / 4) - 1.5)# 若为偶数,则减一if n % 2 == 0:n -= 1return n# 获取指定路径下的所有图片
def getImagesName(dir):allPicPath = []  # 所有图片for root, dirs, files in os.walk(dir):for file in files:if file.endswith('.png') or file.endswith('.jpg') or file.endswith('.jpeg'):allPicPath.append(dir + '/' + file)return allPicPath# 将图片转化为指定大小
def transferSize(allPicPath, height, width, goalPath):for i in range(len(allPicPath)):im = Image.open(allPicPath[i])out = im.resize((height, width), Image.ANTIALIAS)out.save(goalPath + str((allPicPath[i].split('/')[len(allPicPath[i].split('/')) - 1])))def main(dir):# 获取所有指定目录下所有图片的路径allPicPath = getImagesName(dir+'/model')# 得到图片数量numOfPic = len(allPicPath)# 获取生成图片的边长大小,并计算出每个图片的边长应该是多大size = getSize(numOfPic)height = math.floor(totalSize / size)width = math.floor(totalSize / size)# 将用于拼接的图片都格式化为统一大小的图片transferSize(allPicPath, height, width, dir + '/1/')# 获取所有格式化后的拼接图片的路径allTransPicPath = getImagesName(dir + '/' + transferDir)# 获取用于填充多余部分的格式化后的白色图片的image# transferSize(whiteImagePath, height, width, whiteGoalPath[0])# perPicNum = math.floor(math.sqrt(numOfPic))toImage = Image.new('RGBA', (totalSize, totalSize))# 随机打乱用于拼接的图片的顺序,这样可保证每次拼接出来的图片顺序都是不同的random.shuffle(allTransPicPath)# 用于统计使用的拼图的图的数量j = 0print(len(allTransPicPath))# 获取白底图片的image,并设置好同样大小备用im = Image.open(whiteImagePath[0])out = im.resize((height, width), Image.ANTIALIAS)m = 1# 给每行分页粘贴size个小图片for i in range(size):fromImage = ""if i == 0:k = 0# 打印一个空白格loc = ((k % size) * width, (int(i % size) * height))print(loc)toImage.paste(out, loc)k += 1# 打印一个图案loc = ((k % size) * width, (int(i % size) * height))print(loc)fromImage = Image.open(allTransPicPath[j])j += 1toImage.paste(fromImage, loc)k += 1# 打印 (size-4) 个空白格for h in range(size - 4):loc = ((k % size) * width, (int(i % size) * height))print(loc)toImage.paste(out, loc)k += 1# 打印一个图案loc = ((k % size) * width, (int(i % size) * height))print(loc)fromImage = Image.open(allTransPicPath[j])j += 1toImage.paste(fromImage, loc)k += 1# 打印一个空白格loc = ((k % size) * width, (int(i % size) * height))print(loc)toImage.paste(out, loc)k += 1elif i <= (size - 3) / 2 - 1 and i>0:k = 0# 根据规律,先打印 i+2 个图片for s in range(i+2):loc = ((k % size) * width, (int(i % size) * height))print(loc)fromImage = Image.open(allTransPicPath[j])j += 1toImage.paste(fromImage, loc)k += 1# 然后打印 (size-(i+2)*2)个空白格for h in range(size-(i+2)*2):loc = ((k % size) * width, (int(i % size) * height))print(loc)toImage.paste(out, loc)k += 1# 最后再打印 (i+2)个图片for s in range(i+2):loc = ((k % size) * width, (int(i % size) * height))print(loc)fromImage = Image.open(allTransPicPath[j])j += 1toImage.paste(fromImage, loc)k += 1elif i>(size - 3) / 2 - 1 and i<=(size - 3) / 2 + 1:# i在满足条件的范围内打印(size)个图片for k in range(size):loc = ((k % size) * width, (int(i % size) * height))print(loc)fromImage = Image.open(allTransPicPath[j])j += 1toImage.paste(fromImage, loc)else:k = 0for x in range(m):loc = ((k % size) * width, (int(i % size) * height))print(loc)toImage.paste(out, loc)k += 1for y in range(size-2*m):loc = ((k % size) * width, (int(i % size) * height))print(loc)fromImage = Image.open(allTransPicPath[j])j += 1toImage.paste(fromImage, loc)k += 1for x in range(m):loc = ((k % size) * width, (int(i % size) * height))print(loc)toImage.paste(out, loc)k += 1m += 1# 在将所有的图片都粘贴到大画布后将合成图保存到指定目录下,并随机分配一个名字toImage.save(dir + '/' + resultDir + '/' + str(uuid.uuid4()) +'.png')if __name__ == '__main__':main(dir)

以上就是博客的所有内容,如果对此有问题或者有更好的想法和建议,欢迎交流讨论。

Python将大量图片拼接成心形图片(二)相关推荐

  1. Python将大量图片拼接成心形图片入门(一)

    开始打算试试用python将大量的图片拼接成心形的功能,但是没接触过python用于处理图片的内容,因此在这里先做一个简单的入门. 这一篇博客写的是将大量图片拼接成正方形的合成图片,如果想改变策略,可 ...

  2. python图像灰度化_python实现图片二值化及灰度处理方式

    python实现图片二值化及灰度处理方式 我就废话不多说了,直接上代码吧! 集成环境:win10 pycharm #!/usr/bin/env python3.5.2 # -*- coding: ut ...

  3. Python爬取国家地理杂志的图片

    一.简介:Python爬取国家地理杂志的图片 二.代码展示 from bs4 import BeautifulSoup import requests import osos.mkdir('./img ...

  4. c语言写一个会动的爱心图片,一键生成心形bmp图片

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include #include #include //@@@@@@@@@@@@@@@@@@@@ cs0前插入pu ...

  5. java图案_用java实现 图片组成心形图案

    用java实现 图片组成心形图案 来源:互联网 作者:佚名 时间:2014-03-15 17:52 灵感:java2核心技术卷1(共两卷)最近在看java2核心技术里面提到显示图片,于是就做了个心形图 ...

  6. python灰度处理打印图片_python实现图片二值化及灰度处理方式

    我就废话不多说了,直接上代码吧! 集成环境:win10 pycharm #!/usr/bin/env python3.5.2 # -*- coding: utf-8 -*- '''4图片灰度调整及二值 ...

  7. Python必应壁纸爬取系列(二):Bing唯美壁纸太多不知道选哪个?Python五行代码随机帮你挑选必应唯美屏保壁纸图片

    上一篇文章我们讲述了如何爬取必应的当天壁纸,那么今天我们就来实现如何写出一个随机必应壁纸或区域的程序.有了这个程序,我们就可以按照自己的喜好添加自己喜欢的文件并且下载了 五行代码实现程序效果图 文章目 ...

  8. python——生成带logo的二维码图片并且保存、控制打印机打印图片二维码、整合打印(获取输入框的值)、打包成exe文件

    1.生成带logo的二维码图片并且保存 前提条件:在D盘里有logo.png的图片,生成的二维码图片在D盘里的111.png import qrcode from PIL import Image# ...

  9. python图片二值化处理百度图api_Python+百度AI实现图像处理-附源码

    开始的话:百度AI新增加了图像处理的api,相信不少朋友用PS处理图片,而今天我们用Python+百度ai来解决. ------------------------------------------ ...

最新文章

  1. 实验报告Linux操作系统基本命令,linux操作系统实验报告全部.doc
  2. 多线程处理缓慢_华为昇腾,AI推理性能超越对手一倍:软件挖掘处理器全部潜力...
  3. 前端工程师的mysql笔记
  4. matlab 数学库,matlab数学函数库
  5. c#listView
  6. 带入gRPC:gRPC Streaming, Client and Server
  7. linq to sql简单使用
  8. 校内模拟赛 Zbq's Music Challenge
  9. cassandra可视化工具_一位数据科学家的私房工具清单
  10. 水滴公司再回应“线下违规”:核心是公司的管理问题
  11. Java生成MD5码
  12. 【转】接口测试面试题
  13. [转]适合过一辈子的人
  14. CSS之cursor用法
  15. 微信小程序 — 公立医院申请
  16. 思科路由器系统是Linux,思科推基于Linux新款无线存储路由器
  17. notion 纪念日公式
  18. mysql将没有员工的部门都删除_Mysql 用sql语句实现删除与CLARK同部门的员工信息...
  19. Sunt natus nam minima alias sunt molestias.DignissiFrüher ermos voluptatum ex debitis ea voluptatem.
  20. html避免js脚本注入,chrome浏览器拓展——js脚本拦截及注入

热门文章

  1. mysql官方系在教程_MySQL系列教程(四)
  2. 程序员是吃青春饭的吗?
  3. Ajaxfileupload上传多张图片
  4. sql server 2005安装内存不能读
  5. 压敏电阻原理、参数、选型
  6. 马斯克疯狂理念在中国落地?国产高速飞行列车即将登场
  7. 云服务器测速脚本_服务器测速命令
  8. Linux 服务器一键测速脚本工具:GreenBench
  9. 杭电数字电路课程设计-实验十-JK触发器设计实验
  10. python画图设置坐标轴为科学记数法_防止matplotlib.pyplot中的科学记数法