事由

其实很简单,就是水群的时候聊到了,大概就是把一张这样的图给做成九宫格变种

2021-11-30T11:50:16.png
成品如下

2021-11-30T11:51:02.png

我当时觉得挺简单的,无非就是切割图片罢了,至于第一块大图再切割一次就好了.效果如上(是的,出自我手).也没什么技术含量,大概就是取原图的宽高(必须相等,否则放到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中并不理想,但还是挺舒服的

2021-11-30T11:58:09.png


接下来就是拼接了

拼接

做这个当然也是有原因的,我在下小黄本的时候发现我用的网站少了两本,后面又发现有两本还没汉化,幸运的是我在其他网站找到了剩下的汉化本,虽然是日译英再译中,看起来很生草,但能冲就行(bushi

本来是打算用Python直接去爬图的,可惜那个网站不挂梯子上不去,挂了Python又报错,不知道为什么,我看量也不算多,加起来也就一百来张(四本)就自己去手动下了,在下最后一本的时候我发现了奇怪的东西

2021-11-30T12:03:19.png
仔细一看是一张图切成了十份然后逆序排列了,并且所有图都是这样,这下就简单了,我就想不如用Python给它重新焊回去.经过一下午的报错,我拿到了最终的成品,大概就这样

2021-11-30T12:07:49.png
技术部分没什么好讲的,我抄过来改半天能跑起来就算大成功了,用到的函数我都看不太懂,记录一下遇到的问题就行了.

  • 我不知道怎么把两个函数焊一块,就先分割再合并了,这明显是很低效的
  • 使用了虚拟专用网之后访问被代理的网站会报错,没解决
  • 我抄的代码有问题,不然也不会改半天(连个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('完成')