不知道有没有人遇到过这种情况。
资源大小并非2的整数幂,导致Unity无法压缩。
而且资源量很大,无法放在PS里去一张一张的去修改画布。

问题分析


最开始,我是放在PS里修改画布来让图片修改为2的整数幂的尺寸。
但是看着文件夹里几百帧的贴图。
我顿时陷入了沉思。
显然不能手动来做…

Unity的Texture2D似乎可以用来处理这个问题。
需要注意的一个地方

Color[] texturePixels = Texture2D.GetPixels();


我原本以为会是一个二维数组,因为图片像素的排布可以看作一个二维数组么。
不过问题也不大
像素图片的像素在数组中的索引是以这种方式排布的。

所以如何把一张图的像素转到另一张上,便成了这样的一个数学问题。
(需要创建一张目标规格的图片,然后将原图的像素转移到正确位置)
(左:目标图,右:原图)

所以实际在索引并且确定目标图每一个像素颜色的时候,需要将目标图的索引号(左)转换为原图的索引号(右)并正确赋值,才能够将原图的信息正确的保存在我们目标规格的图片上。
实际上也只是一个
0 = func(7)
1 = func(8)

4 = func(13)

的问题。

在Texture的定义里,是有图片的宽高的,通过宽高,我们便可以将这个一维数组转换为一个二维数组的模型,来获得这个像素所在的行和列(个人row,culomn容易搞混,所以行列用x,y表示)

Texture2D.width
Texture2D.height

首先还是分析个例,
在左图上7号像素所在的位置是(1,1),对应的像素是右图中0号像素(0,0)。
从(1,1)到(0,0),x,y都减掉了1。
1是两张图片的长宽差的一半。
所以就有了(伪代码)
(current代表原图,target代表目标图,类型Texture2D)

public int GetCurrentIndex(int targetIndex)
{int widthDifference = target.width - current.width;int heightDifference = target.height - current.height;widthDifference /= 2;heightDifference /= 2;int x = targetIndex % target.width;int y = targetIndex / target.width;x -= widthDifference;y -= heightDifference;int currentIndex = y * current.width + x;return currentIndex;
}

可以通过先将目标图片得一维索引转换为二维索引,减去两张图片相差得结果之后,获得在原图得二维索引,再转换为原图得一维索引,这样就可以获得原图在目标图上每个像素得正确位置。
也就是完成了 0 = func(7)的 func 函数算法。

但是这样做的话,不仅目标图蓝圈内的像素会获取像素,外部的像素依旧能够找到,而且也可能因为太大而超出原图的索引。所以我们需要做一个判断,来让外部的像素完全透明。
(同样是伪代码)

if(x >= 0 && y >= 0 && x < current.width && y < current.height && currentIndex< currentPixels.Length)
{targetPixels[targetIndex] = currentPixels[currentIndex];
}
else
{targetPixels[targetIndex] = new Color(0, 0, 0, 0);
}

只有符合全部条件(在篮圈内部)的像素才会被赋值。

上面大多是讲原理并非实际代码,可能很多地方看起来会脑壳疼。
下面是编辑器的完整代码,放在Editor目录下即可使用。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;public class TrimCanvasEditor : EditorWindow
{[MenuItem("ImageHandle/TrimCanvas")]private static void GetWindow(){TrimCanvasEditor window = GetWindow<TrimCanvasEditor>(true, "修改画布大小", true);window.Show();}private SerializedObject serializedObject;private SerializedProperty texture2DListProperty;private Vector2Int trimSize;private Vector2Int offset;private string savePath;private string namePrefix;private string namePostfix;[SerializeField]private List<Texture2D> texture2DList;private Vector2 selectScrollPosition = Vector2.zero;private void OnEnable(){texture2DList = new List<Texture2D>();savePath = Application.dataPath;namePostfix = "copy";trimSize = new Vector2Int(256, 256);serializedObject = new SerializedObject(this);texture2DListProperty = serializedObject.FindProperty("texture2DList");}private void OnDisable(){serializedObject.Dispose();}private void OnGUI(){selectScrollPosition = EditorGUILayout.BeginScrollView(selectScrollPosition, EditorStyles.helpBox);EditorGUILayout.PropertyField(texture2DListProperty, new GUIContent("选择图集"), true);EditorGUILayout.Space();trimSize = EditorGUILayout.Vector2IntField("目标尺寸", trimSize);offset = EditorGUILayout.Vector2IntField("偏移", offset);EditorGUILayout.Space();for (int i = 0; i < texture2DListProperty.arraySize; i++){SerializedProperty texProperty = texture2DListProperty.GetArrayElementAtIndex(i);}EditorGUILayout.BeginHorizontal();savePath = GUILayout.TextField(savePath);if (GUILayout.Button("选择保存路径")){savePath = EditorUtility.OpenFolderPanel("路径选择", savePath, "");}EditorGUILayout.EndHorizontal();EditorGUILayout.Space();EditorGUILayout.BeginHorizontal();EditorGUILayout.LabelField("图片前缀");namePrefix = EditorGUILayout.TextField(namePrefix);EditorGUILayout.LabelField("图片后缀");namePostfix = EditorGUILayout.TextField(namePostfix);EditorGUILayout.EndHorizontal();EditorGUILayout.Space();EditorGUILayout.Space();if (GUILayout.Button("保存", GUILayout.MinHeight(24), GUILayout.MinWidth(120))){for (int i = 0; i < texture2DListProperty.arraySize; i++){SerializedProperty texProperty = texture2DListProperty.GetArrayElementAtIndex(i);Texture2D item = texProperty.objectReferenceValue as Texture2D;Texture2D texture = new Texture2D(trimSize.x, trimSize.y, TextureFormat.RGBA32, item.streamingMipmaps);if (!item.isReadable){Debug.LogWarning("请打开图片的 Read/Write Enable");return;}int widthDifference = texture.width - item.width;int heightDifference = texture.height - item.height;widthDifference /= 2;heightDifference /= 2;widthDifference += offset.x;heightDifference += offset.y;Color[] itemPixels = item.GetPixels();Color[] texturePixels = texture.GetPixels();for (int j = 0; j < texturePixels.Length; j++){int x = j % texture.width;int y = j / texture.width;x -= widthDifference;y -= heightDifference;int itemIndex = y * item.width + x;if (x >= 0 && y >= 0 && x < item.width && y < item.height && itemIndex < itemPixels.Length){texturePixels[j] = itemPixels[itemIndex];}else{texturePixels[j] = new Color(0, 0, 0, 0);}}texture.SetPixels(0, 0, texture.width, texture.height, texturePixels);texture.Apply();string contents = Application.dataPath;byte[] bytes = texture.EncodeToPNG();if (!Directory.Exists(contents))Directory.CreateDirectory(contents);FileStream file = File.Open(string.Format("{0}/{1}{2}{3}.png", savePath, namePrefix, texProperty.objectReferenceValue.name, namePostfix), FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);BinaryWriter writer = new BinaryWriter(file);writer.Write(bytes);file.Close();EditorUtility.DisplayProgressBar("正在处理 : ", name, (float)i / texture2DListProperty.arraySize);}EditorUtility.ClearProgressBar();AssetDatabase.Refresh();}EditorGUILayout.EndScrollView();}
}


讲想要的图片拖到数组中,设置目标尺寸,保存路径,偏移(不设置默认居中),还有图片名称,点击保存就可以批量修改图片的尺寸了。
这个修改方式不会压缩图片,如果目标尺寸小于原图尺寸,可能图片会被切掉一部分。
关于名称的设置是采用前缀+图片原名+后缀的形式,这样产生的新图片会和原图片编号相同,如果原图带有数字以外的字母,可以自己修改代码正则匹配想要的数字。




这样可以快速的将所有图片修改为标准尺寸,并正确的压缩节省空间。

Unity图片处理 批量改画布大小相关推荐

  1. 给图片数据集批量改名字

    在给数据集打标签之前,一般需要把收集来的图片重新排序命名,一般采用六位,步骤如下: 步骤1: 把图片都放都一个文件夹下,这里我的文件夹是  E:\VOCdata\VOC2007\JPEGInage 步 ...

  2. 批量改尺寸的软件哪个好?这款工具可以提升工作效率

    我们每天工作都会接触各种图片,由于下载渠道不同,导致图片有大有小,方向有横有竖,看起来非常混乱,而且在对图片进行排版时,如果图片方向大小均不一致的话,会让其整体看起来不规整,凌乱且无序.这时候再选择一 ...

  3. 用Photoshop批量修改图片的分辨率和尺寸大小

    转自:https://jingyan.baidu.com/article/ff411625b1b91a12e482370c.html 假设你有很多很多张图片需要调整分辨率和尺寸大小,再假设要求每张图片 ...

  4. 【Unity编辑器扩展】包体优化神器,图片压缩,批量生成图集/图集变体,动画压缩

    功能介绍: 1. 压缩工具支持对图片原文件压缩(支持png/jpg),也支持使用Unity内置图片压缩批量对图片设置压缩参数. 2. 支持以文件夹或及其子文件夹为单位批量生成图集(SpriteAtla ...

  5. php批量处理图片大小,word图片怎么批量调整大小

    在我们使用Word编辑时会插入大量的图片文件,当然这些图片大小一般是不一致的,通常插入到文档后都需要手动调整,如果说这些图片要调整统一大小,如何理解批量的调整大小呢? 1.打开插入图片的文档,点击切换 ...

  6. qimage加载bmp图片_批量修改图片大小,我发现了最简单的方法!

    点击上方蓝字  关注我们 批量调整图片大小的软件很多很多,但很多时候我仅仅对图片做些小修改,而不需要那么多强大的功能,要的是实用,而不是有多华丽,然后运行速度快,也是我们所追求的,不要批处理图片的时候 ...

  7. 批量修改图片名称且改为不同名字

    批量修改图片名称且改为不同名字!这算是一种比较常见的批量修改文件名称的方式了,将文件名批量修改为不同的名称,所谓批量修改就是一次性修改大量文件名的意思,有别于传统的一个一个修改,批量修改文件名讲究的是 ...

  8. 【批量改文件夹中的图片名称-python】

    批量改文件夹中的图片名称-python(记录) 目的 最近在制作零件数据集标注时,发现在摄像机中拍摄的图片名称是乱码的,不便于进行数据标注,所以写下这段代码,以便日后再次使用. 转换之前图片文件夹中的 ...

  9. 批量处理图形大小如何更改图片大小尺寸修改图片视频教程ps学习ps教程ps基础新教程

    批量处理图形大小如何更改图片大小尺寸修改图片视频教程ps学习ps教程ps基础新教程

最新文章

  1. php.ini配置文件详解
  2. react创建新项目
  3. delete 和 delete [] 的真正区别
  4. 解决Error: undefined reference to `__android_log_print'
  5. RabbitMQ封装实战
  6. 导出EXCEL遇到问题
  7. java调python画图_Python Matplotlib plot 绘图
  8. 在Linux上使用logwatch分析监控日志文件
  9. Python+pandas使用交叉表分析超市营业额数据
  10. pytorch经常使用的代码(持续更新)
  11. STM32F0xx_TIM基本延时配置详细过程
  12. jQuery 实现点击页面其他地方隐藏菜单
  13. matlab曲线拟合方法和函数拐点查找
  14. 数学建模优化模型简单例题_数学建模例题.doc
  15. vue当前浏览器是否为ie_vue判断当前浏览器为IE低版本,给出升级提示;IE11及其他浏览器正常使用...
  16. 基于区块链的数字版权保护介绍
  17. 安徽自招计算机基础考试试题,点划自招|东南大学、中国药大2017年自主招生考情揭秘,附真题。...
  18. Centos7 配置IP地址(动态或者静态)
  19. 多个勤于奋,到底那个是真的?勤于奋被他人抄袭
  20. c语言点菜菜单程序大学一,数据结构实训报告 c语言点餐系统 net

热门文章

  1. 中学开始做开发者,出路何在?
  2. 区分 Nginx 的 proxy_buffering 与 proxy_cache
  3. 知客亭--多线程系列之初入
  4. 基于ssm框架的驾校预约管理系统
  5. MD5加密不满足公安部安全等级要求
  6. 我的第一个Python3 网络爬虫 百度百科爬虫
  7. “3A之旅,逐梦之人”CGU 2018看点大揭秘!
  8. Linux 传输文件
  9. excel功能小技巧:自动求和的注意事项
  10. 科学家发现「幼儿」星球 可能是颗小型棕矮星