Python拆分无atlas图集(瑕疵版)

老板给了张没有atlas文件的图集让我拆图,简单写了一版凑合用。

存在的问题:

  • 可能会拆出来一些小尺寸的透明像素图片;
  • 可能会拆出来一些偏大的小图的整体集合;
  • 可能会把应该是一块的小图批成两半,不过不多;
  • 其他未知的问题...

小图目测基本齐全,没用的图...手删一下趴

有改正的同学烦请告知,比个♥

from PIL import Image  
import numpy as np  
import time
  
def split_image_into_blocks(image_path, threshold=0):  
    img = Image.open(image_path)  
    if img.mode != 'RGBA':  
        img = img.convert('RGBA')  # 转换到RGBA模式以获取alpha通道  
    img_data = np.array(img)  
    width, height = img.size  
      
    output_index = 0
      
    col_start_index = np.zeros(height, dtype=int)  # 弃用,有问题,应该划分块
    regions = []
    
    def detect_bounding_box(row, col):
        # 初始化包围盒  
        min_row, max_row = row, row  
        min_col, max_col = col, col  
        
        if min_row == height:
            return min_row, min_col, max_row, max_col
        
        def extern_bottom_left_right(row, min_col, max_col):
            # 最大行向下扩展
            max_row = row
            
            # 最小列向左扩展
            if min_col > 0:
                for col in range(min_col - 1, -1, -1):
                    if img_data[row, col, 3] != threshold and col < min_col:
                        min_col = col
                    else:
                        break
                        
            # 最大列向右扩展
            if max_col < width:
                for col in range(max_col + 1, width):
                    if img_data[row, col, 3] != threshold and col > max_col:
                        max_col = col
                    else:
                        break
            
            return min_col, max_row, max_col
        
        # 开始向下拓展
        for row in range(min_row + 1, height):
            # 非透明像素
            if img_data[row, min_col, 3] != threshold:
                min_col, max_row, max_col = extern_bottom_left_right(row, min_col, max_col)
            # 当前行最小列是透明像素
            else:
                # 向右判断当前行包围盒是否全为透明像素
                row_all_0_flag = True
                for col in range(min_col + 1, max_col):
                    if img_data[row, col, 3] != threshold:
                        row_all_0_flag = False
                        min_col, max_row, max_col = extern_bottom_left_right(row, min_col, max_col)
                        break
                
                # 当前行包围盒全透明,封闭包围盒
                if row_all_0_flag:
                    break
        
        return min_row, min_col, max_row, max_col
  
    # 遍历图像以找到非“透明”区域  
    for row in range(height):  
        col = 0
        while col < width:
            if img_data[row, col, 3] != threshold:  # 假设threshold是“透明”的替代值  
                bounding_box = detect_bounding_box(row, col)
                print(f'第{output_index}张图片包围盒:{bounding_box}')
                min_row, min_col, max_row, max_col = bounding_box
                
                # 获取包围盒后置位透明
                img_data[min_row : max_row + 1, min_col : max_col + 1, 3] = 0
                
                # 裁剪并保存图像块  
                cropped_img = img.crop((min_col, min_row, max_col + 1, max_row + 1))  
                cropped_img.save(f"output3/output_{output_index}.png")  
                print(f'第{output_index}张图片保存成功,路径:output2/output_{output_index}.png')
                output_index += 1  
            col = col + 1
  
# 使用示例  
start_time = time.time()
split_image_into_blocks("texture_00.png", threshold=0)  # 假设0是“透明”的替代值
end_time = time.time()
usage_time = int(end_time - start_time)
m = usage_time // 60
s = usage_time % 60
print(f'任务执行完成,耗时:{m}分{s}秒')

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: PythonAtlas图集拆分可以用来将大型的图集文件切分成较小的单个图片文件,以便方便地使用它们在不同的游戏引擎或应用程序中。以下是关于如何使用Python进行Atlas图集拆分。 首先,需要安装Pillow库和xml.etree.ElementTree库,这可以通过在终端中运行“pip install pillow”和“pip install xml.etree.ElementTree”来完成。这两个库都是Python图像处理和XML解析的标准库。 接下来,需要准备Atlas图集,并将其保存为XML格式。我们可以使用一些图集编辑器(如TexturePacker)来创建Atlas图集,并导出为XML格式。 在Python脚本中,可以使用xml.etree.ElementTree库来解析XML文件,然后提取每个纹理的位置和大小。然后,可以使用Pillow库来裁剪图像数据,并将其保存到单独的输出文件中。 最后,将所有的单独的图像合并成一个Atlas图集,以便在应用程序中使用。可以使用TexturePacker等工具来执行此操作,也可以使用代码来实现。 总之,Python Atlas图集拆分是一个很有用的工具,可以简化图像管理和优化应用程序性能。通过使用Pillow和xml.etree.ElementTree库,可以实现这个功能,并获得更好的控制和灵活性。 ### 回答2: Python Atlas图集拆分通常是针对游戏引擎和其他需要大量图像资源的应用程序进行的,它将大型图像文件分解为小图像块,以便在需要时加载和使用图像资源。 要使用Python拆分图集,我们可以使用Pillow库或OpenCV库等图像处理库来实现。我们首先需要将含有所有图像的大型图像文件加载到Python中。然后,我们可以使用库中可用的裁剪函数来划分图像块。我们需要提供裁剪参数,例如每个块的大小,每个块之间的间隔,以及需要裁剪的图像的位置。然后将块保存到单独的文件中,以便我们可以随时在程序中读取和使用它们。 我们还可以使用Python脚本来自动化此过程,以便同时处理多个图像文件。我们可以编写一个Python脚本来迭代处理文件夹中的所有图像文件,并将它们拆分为块。这样可以节省时间和精力,并使我们能够快速创建大量的图像资源。 在实际应用中,我们通常需要执行额外的处理步骤,例如为拆分的图像块打标记和元数据或重新整理图像文件的名称和路径。这些都可以通过Python脚本和其他库来实现。 总之,Python Atlas图集拆分是一种方便快捷的方式来处理大量图像资源。它可以帮助增加程序的性能,减少加载时间,并提高用户体验。 ### 回答3: Atlas图集(也称为纹理图集)是一种将多个小型纹理合并成单个大型纹理的技术。这种技术可以显著减少内存使用量,因此成为许多游戏和应用程序的常见技术。 在Python中,有许多库可以帮助我们拆分Atlas图集。其中一种流行的库是Pygame,在Pygame中,我们可以使用Surface.subsurface(rect)方法从Atlas图集中提取小型纹理。 此外,还有一些第三方库可用于Atlas图集拆分,例如Pillow和OpenCV。这些库提供了更多的功能和配置选项,使我们可以更轻松地进行Atlas图集拆分。 在使用这些库拆分Atlas图集时,我们需要先找到Atlas图集中各个小型纹理的矩形区域。这可以通过阅读Atlas图集中的元数据文件来完成,或者使用图像处理算法来寻找区域。一旦我们找到了这些区域,就可以使用所选的库从Atlas图集中提取小型纹理,并将它们保存到单独的图像文件中以供使用。 总体而言,Atlas图集拆分是一项重要的任务,它可以帮助我们提高游戏和应用程序的性能和内存使用。使用Python和适当的库,我们可以轻松地进行Atlas图集拆分,并从中获得许多好处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值