ただ壁紙を作るだけのPythonプログラムを作り直しました

概要

過去に作成したプログラムを参考にただ壁紙を生成するプログラムを作ろうと思ったら、思った以上に過去のソースコードがひどかったので比較用にブログに書いておこうと思います。

ソースコード

やろうとしていることは同じですが、見た目の書き方が結構違いますね(笑)

過去に作成したプログラム

import cv2
import sys
import glob
import numpy as np
import random

def make_wallpaper_from_gfkari():
    inp_dir = glob.glob('./momoko/*.jpg')
    images = [cv2.imread(inp, 1) for inp in inp_dir]
    print(images)

    numbers = range(0, len(images)-1)
    img_background = np.zeros((800*4,640*6,3), dtype=np.uint8)

    i=0
    j=0
    k=0
    for count in range(1, 100):
        choice = random.sample(numbers, 15)
        for num in choice:
            img_all[0+j:800+j, 0+k:640+k] = images[num].copy()
            k = k + 640
            if count % 5 == 0:
                j = j + 800
                k = 0
            count = count + 1
        k = 0
        j = 0
        name = 'momoko_wallpaper_46_' + str(re) + '.jpg'
        cv2.imwrite(name, img_all)


def main():
    make_wallpaper_from_gfkari()

if __name__ == '__main__':
    main()

新しく作成したプログラム

import cv2
import sys
import os
import glob
import numpy as np
from numpy.random import *

def make_wallpaper_from_gfkari(size_hight, size_width, rh, rw, filename, inp_path, out_path):
    if not os.path.isdir(out_path): os.makedirs(out_path)
    inp_dir = glob.glob(inp_path)
    out_dir = out_path
    
    images = [cv2.imread(inp, 1) for inp in inp_dir]
    img_background = np.zeros((size_hight*rh,size_width*rw,3), dtype=np.uint8)

    all_img_nums = [i for i in range(0, len(images))]
    all_img_nums.sort()


    pairs = [[i, j] for i in range(0, size_hight*rh, size_hight) for j in range(0, size_width*rw, size_width)]
    select_img_point_nums = [i for i in range(len(pairs))]

    for count in range(1, 100):
        select_img_nums = choice(all_img_nums, len(pairs), replace=False)
        select_img_nums.sort()
        randam_select_img_point_nums = choice(select_img_point_nums, len(select_img_point_nums), replace=False)
        for randam_select_img_point_num, select_img_num in zip(randam_select_img_point_nums, select_img_nums):
            img_background[pairs[randam_select_img_point_num][0]:pairs[randam_select_img_point_num][0]+size_hight, pairs[randam_select_img_point_num][1]:pairs[randam_select_img_point_num][1]+size_width] = images[select_img_num].copy()
            name = out_dir + filename + '_wallpaper_' + str(count) + '.jpg'
            cv2.imwrite(name, img_background)

def main():
    make_wallpaper_from_gfkari(size_hight=800, size_width=640, rh=4, rw=6, filename = 'momoko_asahina', 
            inp_path = '../../../100.data/0.input/gfkari/momoko_asahina/favarite-card/*.jpg', out_path = '../../../100.data/1.output/python/gfkari/middle/momoko_asahina/wallpaper/')

if __name__ == '__main__':
    main()

出力結果

f:id:reinforce82:20191013234758j:plain

感想

過去のソースコードでもやりたいことは満たしているのですが...あまり汎用性がなかったので修正できてよかったです。