事由
其实很简单,就是水群的时候聊到了,大概就是把一张这样的图给做成九宫格变种
成品如下
我当时觉得挺简单的,无非就是切割图片罢了,至于第一块大图再切割一次就好了.效果如上(是的,出自我手).也没什么技术含量,大概就是取原图的宽高(必须相等,否则放到QQ会产生预期之外的结果)然后除以需要分割的块数,再拿这个尺寸去进行截取生成新图片最后写入.代码如下(P站是我本地服务器,测试用):
分割
from PIL import Image
import os
import random
import requests
def cut_image(image, type=1, x=3, y=3):
'''切割图片函数,有两种方案
:1.切割成x*y的若干块(如3*3)
:2.切割成3*3,但第一块大小为2*2.用于QQ展示
'''
width, height = image.size
item_width = int(width / x)
item_height = int(height / y)
box_list = []
if type == 2:
# 额外生成一张2*2大小的图片,下标为0
box = (0, 0, int(width/3*2), int(height/3*2))
box_list.append(box)
for row in range(0, x):
for col in range(0, y):
box = (col * item_width, row * item_height, (col + 1)
* item_width, (row + 1) * item_height)
box_list.append(box)
image_list = [image.crop(box) for box in box_list]
return image_list
def save_images(image_list, x=3, y=3):
'''保存目录为Win桌面上的output文件夹,不存在自动创建
:以多维数组+平面直角坐标系的形式命名,下标从0开始
如3*3形式,则为
:[
[
[0,0],[1,0],[2,0]
],
[
[0,1],[1,1],[2,1]
],
[
[0,2],[1,2],[2,2]
]
]
'''
dirName = os.path.expanduser('~')+r'\Desktop\output\\'
index = []
index_str=[]
index_digital=0
for i in range(0, x):
for j in range(0, y):
index.append([j, i])
for i in index:
i = str(i)
i = i.replace(' ', '')
i = i.replace('[', '(')
i = i.replace(']', ')')
index_str.append(i)
if not os.path.exists(dirName):
os.makedirs(dirName)
for image in image_list:
image.save(dirName + str(index_str[index_digital]) + '.png')
index_digital += 1
if __name__ == '__main__':
img_path = input('将图片拖入脚本'+"\n")
img_path = img_path if img_path else r'd:\XAMPP\htdocs\assets\setu\genshin\\' + \
str(int((random.random())*15))+'.jpg'
response = requests.get('http://pornhub.com/api/wallpaper.php')
with open(os.path.expanduser('~')+r'\Desktop\wallpaper.jpg', mode='wb') as img:
for data in response.iter_content(128):
img.write(data)
image = Image.open(img_path)
image_list = cut_image(image, 1)
save_images(image_list)
写了一些多余的东西,但不影响使用就是了.这种东西网上一大堆,我稍微修改了一下图片的命名规则(强迫症),可惜的是放到Win10中并不理想,但还是挺舒服的
接下来就是拼接了
拼接
做这个当然也是有原因的,我在下小黄本的时候发现我用的网站少了两本,后面又发现有两本还没汉化,幸运的是我在其他网站找到了剩下的汉化本,虽然是日译英再译中,看起来很生草,但能冲就行(bushi
本来是打算用Python直接去爬图的,可惜那个网站不挂梯子上不去,挂了Python又报错,不知道为什么,我看量也不算多,加起来也就一百来张(四本)就自己去手动下了,在下最后一本的时候我发现了奇怪的东西
仔细一看是一张图切成了十份然后逆序排列了,并且所有图都是这样,这下就简单了,我就想不如用Python给它重新焊回去.经过一下午的报错,我拿到了最终的成品,大概就这样
技术部分没什么好讲的,我抄过来改半天能跑起来就算大成功了,用到的函数我都看不太懂,记录一下遇到的问题就行了.
- 我不知道怎么把两个函数焊一块,就先分割再合并了,这明显是很低效的
- 使用了虚拟专用网之后访问被代理的网站会报错,没解决
- 我抄的代码有问题,不然也不会改半天(连个range函数都用不好,列表下标还有负数,什么屑代码)
- 图片原名格式为固定五位数字且前导零,当页数变成两位需要处理,比如使用rjust函数
- 代码我看不懂,我太鶸了(悲
最后是代码:
from os import read, remove, write
import os
from PIL import Image
dirName = os.path.expanduser('~')+r'\Desktop\output\tmp\\'
if not os.path.exists(dirName):
os.makedirs(dirName)
def cut_image(image, x=1, y=10):
width, height = image.size
item_width = int(width / x)
item_height = int(height / y)
# print("高:%d,宽:%d" % (item_height, item_width))
box_list = []
for i in range(0, y):
box = (0, i * item_height, item_width, (i + 1) * item_height)
box_list.append(box)
image_list = [image.crop(box) for box in box_list]
i = 0
for image in image_list:
image.save(dirName + str(i) + '.png')
i += 1
return image_list
def save_img(编号):
IMAGES_PATH = r'C:\Users\86191\Desktop\output\tmp\\'
IMAGES_FORMAT = ['.png', '.PNG']
IMAGE_SIZE_H = 177
IMAGE_SIZE_W = 1280
IMAGE_ROW = 10 # 图片间隔,也就是合并成一张图后,一共有几行
IMAGE_COLUMN = 1 # 图片间隔,也就是合并成一张图后,一共有几列
IMAGE_SAVE_PATH = r'C:\Users\86191\Desktop\output\\' # 图片转换后的地址
image_names = [name
for name in os.listdir(IMAGES_PATH)
for item in IMAGES_FORMAT
if os.path.splitext(name)[1] == item]
# 创建画板
to_image = Image.new(
'RGB', (IMAGE_COLUMN * IMAGE_SIZE_W, IMAGE_ROW * IMAGE_SIZE_H))
ids = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
index = 0
for y in range(0, IMAGE_ROW):
from_image = Image.open(IMAGES_PATH + image_names[y]).resize(
(IMAGE_SIZE_W, IMAGE_SIZE_H), Image.ANTIALIAS)
to_image.paste(
from_image, (0, ids[y] * IMAGE_SIZE_H))
# print(ids[y])
index += 1
return to_image.save(IMAGE_SAVE_PATH+str(编号)+'.png')
for i in range(1, 28):
cut_image(Image.open(os.path.expanduser('~') +
r'\Desktop\4\\'+str(i).rjust(5, '0')+'.jpg'))
save_img(i)
print('正在处理第'+str(i))
print('完成')
最后一次更新于2022-05-27
0 条评论