当前位置: 首页 > news >正文

【unity】批量剔除图片四周空白像素的工具

摘要:Unity图片空白像素批量处理工具
该工具提供两种方式批量剔除图片空白像素:

静态处理类:提供TrimTexture方法,可读取纹理像素数据,计算非透明区域边界,生成裁剪后的新纹理;SaveTexture方法保存处理结果。
编辑器窗口:通过"Tools/UI"菜单打开窗口,支持多选PNG图片后批量处理。主要流程包括:加载选中项→分析像素边界→裁剪保存→恢复原始设置。处理时临时修改纹理为可读状态,完成后自动刷新资源库并统计成功数量。适用于UI图片资源优化,需在Unity编辑器环境下使用。

using UnityEditor;
using UnityEngine;
using System.IO;public static class ImageTrimmerHandle
{public static Texture2D TrimTexture(Texture2D sourceTexture){if (sourceTexture == null) return null;string assetPath = AssetDatabase.GetAssetPath(sourceTexture);TextureImporter importer = AssetImporter.GetAtPath(assetPath) as TextureImporter;if (importer == null) return null;bool originalReadable = importer.isReadable;TextureImporterCompression originalCompression = importer.textureCompression;// 设置为可读importer.isReadable = true;importer.textureCompression = TextureImporterCompression.Uncompressed;AssetDatabase.ImportAsset(assetPath);AssetDatabase.Refresh();// 重新加载纹理Texture2D readableTexture = AssetDatabase.LoadAssetAtPath<Texture2D>(assetPath);Color[] pixels = readableTexture.GetPixels();// 找到边界int width = readableTexture.width;int height = readableTexture.height;int left = width;int right = 0;int top = 0;int bottom = height;for (int y = 0; y < height; y++){for (int x = 0; x < width; x++){Color pixel = pixels[y * width + x];if (pixel.a > 0.01f) // 非完全透明{left = Mathf.Min(left, x);right = Mathf.Max(right, x);top = Mathf.Max(top, y);bottom = Mathf.Min(bottom, y);}}}// 创建新纹理int newWidth = right - left + 1;int newHeight = top - bottom + 1;Texture2D trimmedTexture = null;if (newWidth > 0 && newHeight > 0){trimmedTexture = new Texture2D(newWidth, newHeight, TextureFormat.RGBA32, false);Color[] newPixels = new Color[newWidth * newHeight];for (int y = bottom; y <= top; y++){for (int x = left; x <= right; x++){int sourceIndex = y * width + x;int destIndex = (y - bottom) * newWidth + (x - left);newPixels[destIndex] = pixels[sourceIndex];}}trimmedTexture.SetPixels(newPixels);trimmedTexture.Apply();}// 恢复原始导入设置importer.isReadable = originalReadable;importer.textureCompression = originalCompression;AssetDatabase.ImportAsset(assetPath);return trimmedTexture;}public static void SaveTexture(Texture2D texture, string savePath){if (texture == null || string.IsNullOrEmpty(savePath)) return;byte[] bytes = texture.EncodeToPNG();string directory = Path.GetDirectoryName(savePath);if (!Directory.Exists(directory)){Directory.CreateDirectory(directory);}File.WriteAllBytes(savePath, bytes);AssetDatabase.Refresh();Debug.Log("图片已保存至: " + savePath);// 自动选择保存的资源Texture2D savedTexture = AssetDatabase.LoadAssetAtPath<Texture2D>(savePath);if (savedTexture != null){Selection.activeObject = savedTexture;}}
}
using UnityEditor;
using UnityEngine;
using System.IO;public class ImageTrimmerWindow : EditorWindow
{private Object[] selectedTextures;[MenuItem("Tools/UI/批量剔除图片的空白像素")]public static void ShowWindow(){GetWindow<ImageTrimmerWindow>("批量剔除图片的空白像素");}private void OnGUI(){GUILayout.Label("批量图片空白像素剔除", EditorStyles.boldLabel);EditorGUILayout.Space();EditorGUILayout.HelpBox("请选择一个或多个 PNG 图片文件(可在Project窗口多选后点击“从选中项加载”)。", MessageType.Info);if (GUILayout.Button("从选中项加载")){selectedTextures = Selection.GetFiltered(typeof(Texture2D), SelectionMode.Assets);}if (selectedTextures != null && selectedTextures.Length > 0){EditorGUILayout.LabelField($"已选择图片数量: {selectedTextures.Length}");if (GUILayout.Button("批量剔除并覆盖保存")){int successCount = 0;foreach (Object obj in selectedTextures){Texture2D tex = obj as Texture2D;if (tex == null) continue;Texture2D trimmed = ImageTrimmerHandle.TrimTexture(tex);if (trimmed != null){string path = AssetDatabase.GetAssetPath(tex);ImageTrimmerHandle.SaveTexture(trimmed, path);successCount++;}}AssetDatabase.Refresh();EditorUtility.DisplayDialog("处理完成", $"已处理并覆盖保存 {successCount} 张图片。", "确定");}}else{EditorGUILayout.LabelField("未选择图片。");}}
}

相关文章:

  • UE5 游戏模板 —— FirstShootGame
  • 【论文笔记】【强化微调】T-GRPO:对视频数据进行强化微调
  • WPF调试三种工具介绍:Live Visual Tree、Live Property Explorer与Snoop
  • TMultiplexedProtocol 和 TMultiplexedProcessor
  • java 找出两个json文件的不同之处
  • Python Day55
  • Taro 跨端开发:从调试到发布的完整指南
  • Odoo 17 Many2one字段内联编辑完整实现方案
  • Zephyr 调试实用指南:日志系统、Shell CLI 与 GDB 全面解析
  • gRPC 与 Protobuf 的深度集成 —— 从服务定义到多语言交互(Go + Java 示例)
  • 将浮点数转换为分数
  • C#测试调用ClosedXML根据批注设置excel单元格内容
  • 【舞蹈】编排:如何对齐拍子并让小节倍数随BPM递减
  • 经典控制理论:线性化笔记
  • PowerBI HtmlContent生成表格
  • 磁性传感器在电机控制闭环系统中的反馈作用
  • 【JAVA】数组的使用
  • 数据分析核心指标体系:从求和、计数到比较的全维度计算方法
  • 基于ARM ubuntu如何进行交叉编译
  • 针对机器人自修复材料的具体推荐及特性分析
  • 做美图+网站有哪些/2023全民核酸又开始了
  • 游戏门户网站有哪些/九江seo公司
  • 个人工作室网站怎么做/seo外推软件
  • 做网站怎么维护/cba目前排名
  • 网站缩略图存哪里好/seopeixun com cn
  • 丹东公司做网站/seo网络推广软件