找回密码
 立即注册
查看: 185|回复: 0

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

[复制链接]
发表于 2022-12-5 20:40 | 显示全部楼层 |阅读模式
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:            yield  f  #调整图片的尺寸,确保宽高是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"};        [MenuItem("Texture/TextureCompressSize")]    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[j]))                    {                        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[j]))                    {                        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次方,但是感觉不适用。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-4 01:45 , Processed in 0.244884 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表