一个简单的像素游戏素材图片切割保存程序

近期在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)

这是切割后的效果:

 

posted @ 2023-02-27 21:40  丁维  阅读(100)  评论(0编辑  收藏  举报