【教学类-34

图片展示:
背景需求:
最近班级孩子得了传染病 , 来了2位孩子 。
我觉得:人少的话 , 孩子们就有充足的时间去拼那些带有凹凸槽的自制彩色图形拼图 。
难点:
1、从直线剪切(方形拼图)转向圆弧剪切(凹凸拼图) , 容易剪坏 。
2、图片数量多12张
于是把之前搁置的“凹凸槽拼图”的代码拿出来 , 仔细研究如何批量制作3*4格子(图片为4*3比例)的代码
材料准备:
这些图片必须统一是JPG格式(用格式工厂、或者代码转换一下)
代码展示(以2张大图为例):
'''目的:3*4彩色拼图(有凹凸)作者:阿夏时间:2023年4月25日 15:43'''import osyangshi=float(input('输入造型数字:凹凸基础0.5(链边太细);凹凸最适宜0.56;纯方块:7\n'))# pic_width=int(input('请输入底边像素(1024)\n'))# 长度 把MB图片缩小一点 , 生成的拼图块格式也小一点1024# pic_height=int(input('请输入侧边像素(768)\n'))# 宽度768Number=int(input('多少块3*4(12块)\n'))# 宽度768# pic_puzzle_longnum=int(input('请输入侧边的积木块数量(3)\n'))# 积木块数量4*6=12块 中的4768# pic_puzzle_shortnum=int(input('请输入底边的积木块数量(4)\n'))# 积木块数量4*6=12块 中的61024# pic_puzzle_side_long=float(input('请输入word里面积木块图片的长度\n'))# 小拼图块的长度1.5正方形# pic_puzzle_side_short=float(input('请输入word里面积木块图片的宽度\n'))# 小拼图块的宽度1.5正方形# fenlan=int(input('请输入word里面分栏数量\n'))# 1.54*6时6列'''A4短边 最多4格 , 1.73格 2.32格 3.6拼贴后的作品只有A4一半大小项目1:横版照片造型:0.56凹凸 , 7方形样式:4:3像素:1024*768格子:4*6=24块积木块长宽:1.7*1.7分栏:6项目2:横版照片 16宫格照片样式:1:1像素:1024*1024格子:4*4积木块长宽:1.7*1.7分栏:5项目3:横版照片 9宫格照片样式:1:1像素:1024*1024格子:3*3积木块长宽:2.3*2.3分栏:3(比4*6图片小)项目4:横版照片 4宫格照片样式:1:1像素:1024*1024格子:2*2积木块长宽:3.6*3.6分栏:2(比4*6图片小)2张A4打印纸 成品a4一半项目1:横版照片造型:0.56凹凸 , 7方形样式:4:3像素:1024*768格子:4*6=24块积木块长宽:2.3*2.3分栏:4'''# pic=['jpg','png','tif']# for i in pic:## print(i)#geshi.append(i)# print(geshi)# bmp , jpg , png , tif , gif , pcx , tga , exif , fpx , svg , psd , # cdr , pcd , dxf , ufo , eps , ai , raw , WMF , webp , avif , apng 等 。”#print('----------第1步:读取总图(大图)所在的位置:-----------')pathz=[]prz="C:\\Users\\jg2yXRZ\\OneDrive\\桌面\\凸起图案拼图\\总图"# 过滤:只保留png结尾的图片imgs1z=os.listdir(prz)for img1z in imgs1z:if img1z.endswith(".jpg"):pathz.append(prz+'\\'+img1z)# 所有总图片(原图)的路径print(pathz)print(len(pathz))# 一共几张图片(2张测试)# print(imgs1z)print('------第2步 , 调整照片大小(把照片缩小格式(4:3横版、3:4竖版、1:1九宫格)这里是1024*768-------')# 先缩小图片格式 , 这样导出的拼图块们的容量小一点(适合打印版本A4)# 不用第一部分 , 每张拼图块图片很大 , 4MB照片拆分24张 , 每张1MB(适合电子白板教学 , 高清图片)# '''作者:幸福清风https://blog.csdn.net/xun527/article/details/117085712'''from PIL import Imageimport os.pathimport globdef convertjpg(jpgfile,outdir,width=1024,height=768):#横版本 把 16-266KB的照片转换成540*405像素 , 照片大小16*43KB , 拆分后正好4*6一页# def convertjpg(jpgfile,outdir,width=405,height=540):#竖版照片 把 16-266KB的照片转换成540*405像素 , 照片大小16*43KB , 拆分后正好4*6一页# 400*300宽高像素15-24K# 520*390宽高像素29-30K# 1024,height=768哪怕只有45K , 也是格子很大img=Image.open(jpgfile)try:new_img=img.resize((width,height),Image.BILINEAR)if not os.path.exists(outdir):os.mkdir(outdir)new_img.save(os.path.join(outdir,os.path.basename(jpgfile)))except Exception as e:print(e)print('------第3步 , 读取大图的位置 , 生成凹凸平涂------')# '''多照片()''' # 读取路径下的一个文件for w in range(len(pathz)):# 0-2# # 新建一个”装N份word和PDF“的文件夹os.mkdir(r'C:\Users\jg2yXRZ\OneDrive\桌面\凸起图案拼图\小图{}'.format(w+1))# 1-2path = '{}'.format(pathz[w])print(path)# r"C:\Users\jg2yXRZ\OneDrive\桌面\凸起图案拼图\1.jpg"# 来源# # 读取路径下的一个文件# path = r"C:\Users\jg2yXRZ\OneDrive\桌面\凸起图案拼图\1.jpg"# 来源# for jpgfile in glob.glob(path):#convertjpg(jpgfile,r"C:\Users\jg2yXRZ\OneDrive\桌面\凸起图案拼图\小图")# 去向# '''# 全部照片'''# path = r"C:\Users\Administrator\Desktop\凸起图案拼图\原图\*.{}".format(geshi)# for jpgfile in glob.glob(path):#convertjpg(jpgfile,r"C:\Users\Administrator\Desktop\凸起图案拼图\照片调整")print('------以下部分 生成带凹凸拼图-------')'''https://blog.csdn.net/zbbzb/article/details/120127932 作者:zbbzb'''# import os# from PIL import Image# # 分隔成n*m个方块# # 分割几行几列, 二维数组保存# def SplitImages(img_path, row, col):#path_name = os.path.dirname(img_path)#img = Image.open(img_path).convert("RGBA")#imgSize = img.size#splitW = int(imgSize[0]/col)#splitL = int(imgSize[1]/row)#pimg = img.load()#imbList = []#for i in range(row):#rowList = []#l = (i + 1) * splitL#for j in range(col):#w = (j + 1) * splitW#imb = Image.new('RGBA', (splitW, splitL),(255,255,255,0))#pimb = imb.load()#for k in range(j * splitW, w):#for z in range(i * splitL, l):#pimb[k - splitW * j, z - i * splitL] = pimg[k,z]#dirPath = path_name + "/" + str(i*10 + j) + ".png"## imb.save(dirPath)#rowList.append(imb)#imbList.append(rowList)#return imbList# 最终版:随机凹凸, 考虑圆心偏移import osfrom PIL import Imageimport random# 分割几行几列, 二维数组保存def SplitImages(img_path, row, col):path_name = os.path.dirname(img_path)img = Image.open(img_path).convert("RGBA")imgSize = img.sizesplitW = int(imgSize[0]/col)splitL = int(imgSize[1]/row)pimg = img.load()imbList = []for i in range(row):rowList = []l = (i + 1) * splitLfor j in range(col):w = (j + 1) * splitWimb = Image.new('RGBA', (splitW, splitL),(255,255,255,0))pimb = imb.load()for k in range(j * splitW, w):for z in range(i * splitL, l):pimb[k - splitW * j, z - i * splitL] = pimg[k,z]dirPath = path_name + "/" + str(i*10 + j) + ".png"# imb.save(dirPath)rowList.append(imb)imbList.append(rowList)return imbListdef Resize(img, rizeW, rizel, pastePoint=None): if pastePoint is None:pastePoint = [0, 0]new_im = Image.new('RGBA', [rizeW, rizel],(255,255,255,0))new_im.paste(img, pastePoint)return new_imdef SplitCircle(imbList, imgPath):path_name = os.path.dirname(imgPath)img = Image.open(imgPath).convert("RGBA")imgSize = img.sizecol = len(imbList[0])row = len(imbList)if col == 1 and row == 1:return splitW = int(imgSize[0]/col)splitL = int(imgSize[1]/row)minV = min(splitW, splitL)r_d = int(minV / 4) # 要计算 两个不能比 l 长 并且加上 offset 也不能超过 lr_offset = int(minV / 8)pSplitW = splitW + (r_d + r_offset) * 2pSplitL = splitL + (r_d + r_offset) * 2pimg = img.load()# 存(row - 1) * (col - 1) 个中心点pointList = []for i in range(row):colPointList = []for j in range(col):colPoint = []rowPoint = []if j != col - 1:colPoint = [splitW * (j + 1), int(splitL/2) + i * splitL]if i != row - 1:rowPoint = [int(splitW / 2) + j * splitW, splitL * (i + 1)]colPointList.append({'colPoint': colPoint, 'rowPoint': rowPoint})imbList[i][j] = Resize(imbList[i][j], pSplitW, pSplitL, [r_d + r_offset, r_d + r_offset])dirPath = path_name + "/" + str(i*10 + j) + ".png"# imbList[i][j].save(dirPath)pointList.append(colPointList)for i in range(row):for j in range(col):imbImg = imbList[i][j]new_img = imbImg# 圆心靠左 靠右, 默认靠右lrandNum = random.randint(0, 999999)drandNum = random.randint(0, 999999)lrRight = TruedrRight = Trueif lrandNum