unity 压缩

using System.Collections;

using System.Collections.Generic;

using System.IO;

using System.Threading;

using System.Windows.Forms;

using UnityEditor;

using UnityEngine;

using UnityEngine.UI;

using static house_file_crl.TextureUtility;

public class house_file_crl : MonoBehaviour

{

    public int house_num;

    public bool add_one_more;

    public GameObject btn_delect, btn_reset, btn_details;

    // Start is called before the first frame update

    void Start()

    {

        defaout_action();

    }

    public bool enter_defaut = false;

    void defaout_action()

    {

        enter_defaut = true;

        string path = house_details_crl._instance.get_foder_name() + "/" + house_num;

        if (System.IO.Directory.Exists(path) == true)//如果不存在就创建file文件夹

        {

            house_num_obj.GetComponent().text = house_num.ToString();

            if (add_one_more)

            {

                GameObject m_Obj = Instantiate(this.gameObject);

                m_Obj.transform.SetParent(transform.parent);

                m_Obj.transform.localScale = Vector3.one;

                m_Obj.GetComponent().add_one_more = true;

                m_Obj.GetComponent().house_num = house_num+1;

            }

            btn_delect.SetActive(true);

            btn_reset.SetActive(true);

            btn_details.SetActive(true);

            house_num_obj.SetActive(true);

            add_img.SetActive(false);

        }


    }

    public void get_files()  //获取图片入口

    {

        init_file._instance.show_tip();

        string path = house_details_crl._instance.get_foder_name()+"/"+ house_num;

        if (System.IO.Directory.Exists(path) == false)//如果不存在就创建file文件夹

        {

            System.IO.Directory.CreateDirectory(path);

        }

        else

        {

            DeleteFolder(path);

        }


        addhead(path);

    }

    public static void DeleteFolder(string dir)

    {

        foreach (string d in Directory.GetFileSystemEntries(dir))

        {

            if (File.Exists(d))

            {

                FileInfo fi = new FileInfo(d);

                if (fi.Attributes.ToString().IndexOf("ReadOnly") != -1)

                    fi.Attributes = FileAttributes.Normal;

                File.Delete(d);//直接删除其中的文件 

            }

            else

            {

                DirectoryInfo d1 = new DirectoryInfo(d);

                if (d1.GetFiles().Length != 0)

                {

                    DeleteFolder(d1.FullName);////递归删除子文件夹

                }

                Directory.Delete(d);

            }

        }

    }

    public GameObject house_num_obj,add_img;

    public void addhead(string s)

    {


        print("path: "+s);

        FolderBrowserDialog dialog = new FolderBrowserDialog();

        dialog.Description = "请选择文件路径";

        if (dialog.ShowDialog() == DialogResult.OK)

        {

            string foldPath = dialog.SelectedPath;

            FolderMove(foldPath, s);

            print(foldPath+" _path: " + s);

            house_num_obj.GetComponent().text = house_num.ToString();

            if (add_one_more)

            {

                GameObject m_Obj = Instantiate(this.gameObject);

                m_Obj.transform.SetParent(transform.parent);

                m_Obj.transform.localScale = Vector3.one;

                m_Obj.GetComponent().add_one_more = true;

                m_Obj.GetComponent().house_num = house_num+1;

            }

            btn_delect.SetActive(true);

            btn_reset.SetActive(true);

            btn_details.SetActive(true);

            house_num_obj.SetActive(true);

            add_img.SetActive(false);

            // MessageBox.Show("已选择文件夹:" + foldPath, "选择文件夹提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

        }

    }

    public void FolderMove(string srcFolderPath, string destFolderPath)

    {

        //检查目标目录是否以目标分隔符结束,如果不是则添加之

        if (destFolderPath[destFolderPath.Length - 1] != Path.DirectorySeparatorChar)

            destFolderPath += Path.DirectorySeparatorChar;

        //判断目标目录是否存在,如果不在则创建之

        if (!System.IO.Directory.Exists(destFolderPath))

            System.IO.Directory.CreateDirectory(destFolderPath);

        string[] fileList = System.IO.Directory.GetFileSystemEntries(srcFolderPath);


        foreach (string file in fileList)

        {

            if (System.IO.Directory.Exists(file))

            {

                print("path1: " + file);

                FolderMove(file, destFolderPath + Path.GetFileName(file));

                //Directory.Delete(file);

            }

            else

            {

              //  System.IO.File.Copy(file, destFolderPath + Path.GetFileName(file));

                print(destFolderPath+" **** " + Path.GetFileName(file) + " __path2: " + file);

                if (Path.GetFileName(file).Contains("png"))

                {

                    // GetTexture(file);


                    StartCoroutine(GetTexture(file, destFolderPath + Path.GetFileName(file)));

                }

                else

                {

                    System.IO.File.Copy(file, destFolderPath + Path.GetFileName(file));

                }

            }

        }

        //System.IO.Directory.Delete(srcFolderPath);

    }

    IEnumerator GetTexture(string url,string destFolderPath)

    {

        init_file._instance.show_tip();

        WWW www = new WWW(url);

        yield return www;

        if (www.isDone && www.error == null)

        {

            Texture2D img = www.texture;


            // print("texelSize"+img.texelSize);

            //Sprite sprite = Sprite.Create(img, new Rect(0, 0, img.width, img.height), new Vector2(0.5f, 0.5f));

            Texture2D img1 = ThreadedScale(img, 1820, 750, false);  //  图片压缩

            byte[] date = img1.EncodeToJPG(); //转换格式进一步压缩

            File.WriteAllBytes(destFolderPath, date);

        }

        yield return new WaitForSeconds(2.0f);

        init_file._instance.close_tips();

    }

    public void delect_house_msg()

    {

        string path = house_details_crl._instance.get_foder_name() + "/" + house_num;

      // print(path);

        if (System.IO.Directory.Exists(path))//如果不存在就创建file文件夹

        {

            string path1 = house_details_crl._instance.get_foder_name();

            System.IO.DirectoryInfo dirInfo = new System.IO.DirectoryInfo(path1);

            int result = dirInfo.GetDirectories().Length;

            DeleteFolder(path);


            System.IO.Directory.Delete(path);

            for (int i = house_num; i < result+1; i++)

            {

                if (System.IO.Directory.Exists(path1 + "/" + (i + 1)))

                {

                    System.IO.Directory.Move(path1 + "/" + (i+1), path1 + "/" + i);

                    this.transform.parent.transform.GetChild(i).GetComponent().house_num=i;

                    this.transform.parent.transform.GetChild(i).GetComponent().house_num_obj.GetComponent().text = i.ToString();

                }

                else

                {

                    this.transform.parent.transform.GetChild(i).GetComponent().house_num = i;

                    this.transform.parent.transform.GetChild(i).GetComponent().house_num_obj.GetComponent().text = i.ToString();

                }

            }

            Destroy(this.gameObject);

        }

        else

        {


        }

    }

    private static Color[] texColors;

    private static Color[] newColors;

    private static int w;

    private static float ratioX;

    private static float ratioY;

    private static int w2;

    private static int finishCount;

    private static Mutex mutex;

    private Texture2D ThreadedScale(Texture2D tex, int newWidth, int newHeight, bool useBilinear)

    {

        texColors = tex.GetPixels();

        newColors = new Color[newWidth * newHeight];

        if (useBilinear)

        {

            ratioX = 1.0f / ((float)newWidth / (tex.width - 1));

            ratioY = 1.0f / ((float)newHeight / (tex.height - 1));

        }

        else

        {

            ratioX = ((float)tex.width) / newWidth;

            ratioY = ((float)tex.height) / newHeight;

        }

        w = tex.width;

        w2 = newWidth;

        var cores = Mathf.Min(SystemInfo.processorCount, newHeight);

        var slice = newHeight / cores;

        finishCount = 0;

        if (mutex == null)

        {

            mutex = new Mutex(false);

        }

        if (cores > 1)

        {

            int i = 0;

            ThreadData threadData;

            for (i = 0; i < cores - 1; i++)

            {

                threadData = new ThreadData(slice * i, slice * (i + 1));

                ParameterizedThreadStart ts = useBilinear ? new ParameterizedThreadStart(BilinearScale) : new ParameterizedThreadStart(PointScale);

                Thread thread = new Thread(ts);

                thread.Start(threadData);

            }

            threadData = new ThreadData(slice * i, newHeight);

            if (useBilinear)

            {

                BilinearScale(threadData);

            }

            else

            {

                PointScale(threadData);

            }

            while (finishCount < cores)

            {

                Thread.Sleep(1);

            }

        }

        else

        {

            ThreadData threadData = new ThreadData(0, newHeight);

            if (useBilinear)

            {

                BilinearScale(threadData);

            }

            else

            {

                PointScale(threadData);

            }

        }

        tex.Resize(newWidth, newHeight);

        tex.SetPixels(newColors);

        tex.Apply();

        return tex;

    }

    public class TextureUtility

    {

        public class ThreadData

        {

            public int start;

            public int end;

            public ThreadData(int s, int e)

            {

                start = s;

                end = e;

            }

        }

    }

    public static void BilinearScale(System.Object obj)

    {

        ThreadData threadData = (ThreadData)obj;

        for (var y = threadData.start; y < threadData.end; y++)

        {

            int yFloor = (int)Mathf.Floor(y * ratioY);

            var y1 = yFloor * w;

            var y2 = (yFloor + 1) * w;

            var yw = y * w2;

            for (var x = 0; x < w2; x++)

            {

                int xFloor = (int)Mathf.Floor(x * ratioX);

                var xLerp = x * ratioX - xFloor;

                newColors[yw + x] = ColorLerpUnclamped(ColorLerpUnclamped(texColors[y1 + xFloor], texColors[y1 + xFloor + 1], xLerp),

                ColorLerpUnclamped(texColors[y2 + xFloor], texColors[y2 + xFloor + 1], xLerp),

                y * ratioY - yFloor);

            }

        }

        mutex.WaitOne();

        finishCount++;

        mutex.ReleaseMutex();

    }

    private static Color ColorLerpUnclamped(Color c1, Color c2, float value)

    {

        return new Color(c1.r + (c2.r - c1.r) * value,

        c1.g + (c2.g - c1.g) * value,

        c1.b + (c2.b - c1.b) * value,

        c1.a + (c2.a - c1.a) * value);

    }

    public static void PointScale(System.Object obj)

    {

        ThreadData threadData = (ThreadData)obj;

        for (var y = threadData.start; y < threadData.end; y++)

        {

            var thisY = (int)(ratioY * y) * w;

            var yw = y * w2;

            for (var x = 0; x < w2; x++)

            {

                newColors[yw + x] = texColors[(int)(thisY + ratioX * x)];

            }

        }

        mutex.WaitOne();

        finishCount++;

        mutex.ReleaseMutex();

    }

    public static int GetFilesCount(DirectoryInfo dirInfo)

    {

        int totalFile = 0;

        //totalFile += dirInfo.GetFiles().Length;//获取全部文件

        totalFile += dirInfo.GetFiles("*").Length;//获取某种格式

        foreach (System.IO.DirectoryInfo subdir in dirInfo.GetDirectories())

        {

            totalFile += GetFilesCount(subdir);

        }

        return totalFile;

    }

    // Update is called once per frame

    void Update()

    {

        if (enter_defaut==false)

        {

            defaout_action();

        }

    }

}

你可能感兴趣的:(unity 压缩)