一个简单的像素游戏素材图片切割保存程序
近期在B站帮人切割一下像素游戏图片:
这是一个PNG图片,还好,图片之间挺规律的,使用熟悉的Python处理一下应该可以我的想法是这样的:
先删除掉整行整列,得到一个图像紧凑的图片。
PNG图片在程序里打开居然是RPG像素点和灰度值,这个倒是在我的知识之外。
对整行整列进行判断,在网上查了一下,使用线性代数的奇异值比较好。
奇异值是将一个大的矩阵用三个小矩阵表示:
from PIL import Image import numpy as np import os folder_url = './' file_list = os.listdir(folder_url) pic = np.array(Image.open(folder_url + file_list[0])) pic = pic[0:120,0:120] print(pic.shape) col = pic[:,0] print(col) u, s, vh = np.linalg.svd(col) print(s)
这是输出:
(120, 120, 4) [[255 255 255 0] [255 255 255 0] [255 255 255 0] ... [255 255 255 0] [255 255 255 0]] [4.83828482e+03 6.69772121e-13 3.66435383e-29 0.00000000e+00]
但是这个想法失败了,在已有的图片上,有这中图片
这些小图像的大小是差不多的,但是看横竖,如果按照原来的思路应该会破坏独立的小图像
所以还是只能回到手工切割上,但是这个小图像没有一个标准的尺寸,所以,图像大小只能手动调……
最后的程序用了TensorFlow,我本来也想用OpenCV,Bug多多放弃了,使用的matplotlib的画布来保存的:
import tensorflow as tf import matplotlib.pyplot as plt import os folder_url = './' file_list = os.listdir(folder_url) print(file_list) #保存路径 min_pic_name = file_list[0].split('.')[0] save_url= './Pic-ed/' + min_pic_name + '/' #读取图像 pic1_data = tf.io.read_file(folder_url + file_list[0]) pic_tensor = tf.image.decode_png(pic1_data) #图像裁切,因为图像数据不统一,这里只能手动设置 pic_tensor = pic_tensor[11:1011,0:700] #设置画板样式 plt.figure(figsize=(8,8)) plt.box(False) plt.gca().axes.get_yaxis().set_visible(False) plt.gca().axes.get_xaxis().set_visible(False) pic_list = [] h = pic_tensor.shape[0] w = pic_tensor.shape[1] min_w = 100 #图像宽度 min_h = 100 #图像高度 for x in range(0, int(w/min_w)): temp_list = [] pic_col = pic_tensor[:, x*min_w:(x+1)*min_w] #取一列图像 for y in range(0, int(h/min_h)): min_pic = pic_col[y*min_h:(y+1)*min_h, :] #取一小张图像 plt.imshow(min_pic) #绘制在画布上 temp_list.append(min_pic) plt.savefig(save_url + min_pic_name +"{}.png".format(str(x+1) + '_' + str(y+1)),transparent=True) #保存图像 #清除画板内容 plt.clf() #重新设置画板样式 plt.box(False) plt.gca().axes.get_yaxis().set_visible(False) plt.gca().axes.get_xaxis().set_visible(False) pic_list.append(temp_list) print(pic_list[0][0].shape)
这是切割后的效果: