fwalker 发表于 2022-12-5 20:40

关于处理ETC2_4的倍数思路+脚本

1:resize_pic.py脚本,这种直接改了原图片的宽+高。
python->PIL
import osfrom PIL import Imageimport struct##检查并调整bg图片的宽高,确保宽高都是4的倍数,这样才可以使用ETC压缩格式#''' #遍历目录中的png文件def list_pic(dirpath):    print(dirpath)    for root, dirs, fs in os.walk(dirpath):      for f in fs:            if f.endswith('.jpg') or f.endswith('.png'):                yield os.path.join(root, f) #获取图片实际尺寸def get_png_size(fpath):    with open(fpath, 'rb') as f:      f.seek(4*4, 0)      return (struct.unpack(">II", f.read(8)) ) def getSize(path):    img = Image.open(path)    imgSize = img.size#大小/尺寸    w = img.width       #图片的宽    h = img.height      #图片的高    f = img.format      #图像格式    return w,h         #列出宽高不是4的倍数的图片       def list_not_4_pic(dirpath):    for f in list_pic(dirpath):      w,h = getSize(f)      print(f+"---"+str(w)+"---"+str(h))      if w%4 != 0 or h%4 != 0:            yieldf#调整图片的尺寸,确保宽高是4的倍数         def resize_4_pic(dirpath):    with open('resize_4_pic.output.log', 'w') as log:      for f in list_not_4_pic(dirpath):            img = Image.open(f)            (w,h) = img.size            nw = (w%4==0) and w or (w + (4-(w%4)))            nh = (h%4==0) and h or (h + (4-(h%4)))             print( (w, h),'->',(nw,nh), f)            log.write("%s | (%d,%d)-> (%d,%d)\n"%(f,w, h,nw,nh))            img = img.resize( (nw,nh), Image.ANTIALIAS)            img.save(f) if '__main__' == __name__:    resize_4_pic('.')
2:unity编辑器代码处理
using System;using System.Collections.Generic;using System.IO;using System.Text;using UnityEditor;using UnityEngine;public class TextureSizeEditorWindow:EditorWindow{    private int curNumber;    private string curFilePath;    private PlatformType platformType;    private List<string> allTexturePaths = new List<string>();    private List<string> allTextureExtension = new List<string>();      //查找不是4倍数的脚本    public const string ETC2_FILE_PATH = "_CheckETC2Size.log";    private FileStream fs;    private string etc2logFullPath;    private byte[] writeBytes;    private string ignoreDir ="Assets\\Art/Spine_special"; //    private List<string> noCheckDir = new List<string> {"Assets\\Main/Atlas", "Assets\\Main/Sprites"};          static void OpenTextureCompressPanel()    {      TextureSizeEditorWindow window = (TextureSizeEditorWindow)EditorWindow.GetWindow(typeof(TextureSizeEditorWindow), false, "TextureCompressSizeEditor", true);      window.Show();    }    private void OnGUI()    {      GUILayout.Label("请输入你要压缩的贴图的文件路径");      curFilePath = GUILayout.TextField(curFilePath);                //Android--ETC2格式需要是4的倍数      GUILayout.Label("查找不是4的倍数的图片-ETC2 :");      if (GUILayout.Button("按照路径查找-按钮"))      {            curNumber = 0;            allTexturePaths.Clear();            string newFilePath = curFilePath.Replace("\\", "_");            newFilePath = newFilePath.Replace(":", "_");            newFilePath = newFilePath.Replace("Assets/", "");            etc2logFullPath = Application.dataPath + "/" + newFilePath + ETC2_FILE_PATH;            if (File.Exists(etc2logFullPath))                File.Delete(etc2logFullPath);            fs = new FileStream(etc2logFullPath, FileMode.OpenOrCreate);            GetAllTexturePath();            CheckAllTextureSizeCompress();            Debug.LogError("Android下查找不是4的倍数的图片-ETC2,PATH = " + etc2logFullPath);            writeBytes = null;            fs.Close();      }                GUILayout.Label("设置图片为4的倍数 : ");      if (GUILayout.Button("按照路径修改-按钮"))      {            curNumber = 0;            allTexturePaths.Clear();            allTextureExtension.Clear();            GetAllTexturePath();            ChangeAllTextureSizeCompress();      }                GUILayout.Label("关闭进度条 : ");      if (GUILayout.Button("CloseBar-btn "))      {            EditorUtility.ClearProgressBar();      }    }    void GetAllTexturePath()    {      if (string.IsNullOrEmpty(curFilePath))      {            Debug.LogError("输入的路径有错,curFilePath = " + curFilePath);            return;      }      SetAllTexturePath(curFilePath);    }    void SetAllTexturePath(string path)    {      DirectoryInfo info = new DirectoryInfo(path);      DirectoryInfo[] dirInfo = info.GetDirectories();      FileInfo[] files = info.GetFiles();      foreach (var fileInfo in files)      {            if (fileInfo.Extension == ".meta")                continue;            if (fileInfo.Extension == ".png" || fileInfo.Extension == ".tga" || fileInfo.Extension == ".jpg")            {                string curPath = path + "/" + fileInfo.Name;                Debug.LogError("文件的路径==" + curPath);                allTexturePaths.Add(curPath);                allTextureExtension.Add(fileInfo.Extension);            }      }      foreach (DirectoryInfo nextDirInfo in dirInfo)      {            SetAllTexturePath(path + "/" + nextDirInfo.Name);      }    }      void CheckAllTextureSizeCompress()    {      if (allTexturePaths == null || allTexturePaths.Count == 0)      {            Debug.LogError("allTexturePaths is nil or length =0 , 输入的路径有错,curFilePath = " + curFilePath);            return;      }                            for (int i = 0; i < allTexturePaths.Count; i++)      {            curNumber++;            if (!string.IsNullOrEmpty(allTexturePaths))            {                EditorUtility.DisplayProgressBar(string.Format("Spine Export{0}/{1}",curNumber,allTexturePaths.Count),allTexturePaths,(float)curNumber/(float)(allTexturePaths.Count));                if(allTexturePaths.Contains(ignoreDir))                  continue;                bool isExist = false;                for(int j = 0; j<noCheckDir.Count; j++)                {                  if (allTexturePaths.Contains(noCheckDir))                  {                        isExist = true;                  }                }                if (isExist)                  continue;                              SetTextureSize(allTexturePaths);            }      }    }      void SetTextureSize(string path)    {      Texture2D texture2D = AssetDatabase.LoadAssetAtPath(path, typeof(Texture2D)) as Texture2D;      if (texture2D != null)      {            if (!((texture2D.width % 4 == 0) && (texture2D.height % 4 == 0)))            {                writeBytes = Encoding.UTF8.GetBytes( path + ", width =" + texture2D.width + ",height =" +texture2D.height + "\n");                fs.Write(writeBytes, 0, writeBytes.Length);            }            if (allTexturePaths != null && allTexturePaths.Count == curNumber)            {                EditorUtility.ClearProgressBar();            }      }    }    void ChangeAllTextureSizeCompress()    {      if (allTexturePaths == null || allTexturePaths.Count == 0)      {            Debug.LogError("allTexturePaths is nil or length =0 , 输入的路径有错,curFilePath = " + curFilePath);            return;      }                   for (int i = 0; i < allTexturePaths.Count; i++)      {            if (!string.IsNullOrEmpty(allTexturePaths))            {                curNumber++;                                    EditorUtility.DisplayProgressBar(string.Format("Spine Export{0}/{1}",curNumber,allTexturePaths.Count),allTexturePaths,(float)curNumber/(float)(allTexturePaths.Count));                if(allTexturePaths.Contains(ignoreDir))                  continue;                bool isExist = false;                for(int j = 0; j<noCheckDir.Count; j++)                {                  if (allTexturePaths.Contains(noCheckDir))                  {                        isExist = true;                  }                }                if (isExist)                  continue;                                    ChangeTextureSize(allTexturePaths, allTextureExtension);            }      }    }    void ChangeTextureSize(string path, string extension)    {      Texture2D texture2D = AssetDatabase.LoadAssetAtPath(path, typeof(Texture2D)) as Texture2D;      bool needChange = false;      if(texture2D != null)            needChange = !((texture2D.width % 4 == 0) && (texture2D.height % 4 == 0));                if (needChange)      {            TextureImporterFormat lastTextureFormat;            bool lastIsReadable;                TextureImporter ti = (TextureImporter)TextureImporter.GetAtPath(path);            lastTextureFormat = ti.textureFormat;            lastIsReadable = ti.isReadable;            ti.isReadable = true;            ti.textureFormat = TextureImporterFormat.ARGB32;            AssetDatabase.ImportAsset(path);                        Texture2D resultTexture = new Texture2D(texture2D.width + (4-texture2D.width%4), texture2D.height + (4-texture2D.height%4), TextureFormat.RGBA32, false);            resultTexture.name = texture2D.name;            int widthStart = (resultTexture.width - texture2D.width) / 2;            int heightStart = (resultTexture.height - texture2D.height) / 2;                        Color outColor = new Color(0, 0, 0, 0);            //左下角开始            for (int wIndex = 0; wIndex < resultTexture.width; wIndex++)            {                for (int hIndex = 0; hIndex < resultTexture.height; hIndex++)                {                  if ((widthStart + wIndex) > texture2D.width + widthStart)                  {                        // if (wIndex % 2 == 0)                        //   outColor = Color.black;                        // else                        //   outColor = Color.red;                            resultTexture.SetPixel(wIndex, hIndex, outColor);                  }else if ( (heightStart + hIndex )> texture2D.height + heightStart)                  {                        // if (hIndex % 2 == 0)                        //   outColor = Color.black;                        // else                        //   outColor = Color.red;                                                resultTexture.SetPixel(wIndex, hIndex, outColor);                  }                  else if(wIndex < widthStart)                  {                        // if (wIndex % 2 == 0)                        //   outColor = Color.black;                        // else                        //   outColor = Color.red;                                                resultTexture.SetPixel(wIndex, hIndex, outColor);                  }else if (hIndex < heightStart)                  {                        // if (hIndex % 2 == 0)                        //   outColor = Color.black;                        // else                        //   outColor = Color.red;                                                resultTexture.SetPixel(wIndex, hIndex, outColor);                  }                  else                  {                        resultTexture.SetPixel(wIndex, hIndex, texture2D.GetPixel(wIndex-widthStart, hIndex-heightStart));                  }                }            }            byte[] textuteByte = new byte[]{};            if (extension == ".png")            {                textuteByte = resultTexture.EncodeToPNG();            }            else if(extension == ".tga")            {                textuteByte = resultTexture.EncodeToTGA();            }else if (extension == ".jpg")            {                textuteByte =resultTexture.EncodeToJPG();            }                        string filePath = Application.dataPath+ path.Replace("Assets","");            File.WriteAllBytes(filePath, textuteByte);                        ti = (TextureImporter)TextureImporter.GetAtPath(path);            ti.isReadable = lastIsReadable;            ti.textureFormat = lastTextureFormat;            AssetDatabase.ImportAsset(path);                  AssetDatabase.SaveAssets();            AssetDatabase.Refresh();            Debug.LogError( "图片尺寸更改完成, " + path + ", width =" + texture2D.width + ",height =" +texture2D.height + "\n");      }                if (allTexturePaths != null && allTexturePaths.Count == curNumber)      {            EditorUtility.ClearProgressBar();      }    }}
3:也可以导入的时候设置2的N次方,但是感觉不适用。
页: [1]
查看完整版本: 关于处理ETC2_4的倍数思路+脚本