zoukankan      html  css  js  c++  java
  • Unity 压缩texture

    当我们往服务器保存图片时

    并不会仅仅保留原图

    一般会另外保存一张缩略图

    当加载文件夹时只加载缩略图

    当在点击缩略图打开图片时

    再加载原缩略图

    以节省时间和内存

    下面以将屏幕截图保存到服务器为例

    将屏幕截图和截图缩略图保存到服务器

        private IEnumerator UploadPNG(string id)
        {
            yield return new WaitForEndOfFrame();
    
            int width = Screen.width;
            int height = Screen.height;
    
            //屏幕截图
            Texture2D tex = new Texture2D(width, height, TextureFormat.ARGB32, false);
            tex.ReadPixels(new Rect(0, 0, width, height), 0, 0);
            tex.Apply();
            byte[] bytes = tex.EncodeToPNG();
    
            //缩略图(256*256)
            Texture2D texThumb = new Texture2D(256, 256);
            
            //压缩图片
            Color[] destPix = new Color[texThumb.width * texThumb.height];
            float warpFactor = 1.0f;
            int y = 0;
            while (y < texThumb.height)
            {
                int x = 0;
                while (x < texThumb.width)
                {
                    float xFrac = x * 1.0F / (texThumb.width - 1);
                    float yFrac = y * 1.0F / (texThumb.height - 1);
                    float warpXFrac = Mathf.Pow(xFrac, warpFactor);
                    float warpYFrac = Mathf.Pow(yFrac, warpFactor);
                    Color c0 = tex.GetPixelBilinear(warpXFrac, warpYFrac);
    
                    xFrac = (x - 1) * 1.0F / (texThumb.width - 1);
                    yFrac = y * 1.0F / (texThumb.height - 1);
                    warpXFrac = Mathf.Pow(xFrac, warpFactor);
                    warpYFrac = Mathf.Pow(yFrac, warpFactor);
                    Color c1 = tex.GetPixelBilinear(warpXFrac, warpYFrac);
    
                    xFrac = (x + 1) * 1.0F / (texThumb.width - 1);
                    yFrac = y * 1.0F / (texThumb.height - 1);
                    warpXFrac = Mathf.Pow(xFrac, warpFactor);
                    warpYFrac = Mathf.Pow(yFrac, warpFactor);
                    Color c2 = tex.GetPixelBilinear(warpXFrac, warpYFrac);
    
                    xFrac = (x + 1) * 1.0F / (texThumb.width - 1);
                    yFrac = (y - 1) * 1.0F / (texThumb.height - 1);
                    warpXFrac = Mathf.Pow(xFrac, warpFactor);
                    warpYFrac = Mathf.Pow(yFrac, warpFactor);
                    Color c3 = tex.GetPixelBilinear(warpXFrac, warpYFrac);
    
                    xFrac = (x - 0) * 1.0F / (texThumb.width - 1);
                    yFrac = (y - 1) * 1.0F / (texThumb.height - 1);
                    warpXFrac = Mathf.Pow(xFrac, warpFactor);
                    warpYFrac = Mathf.Pow(yFrac, warpFactor);
                    Color c4 = tex.GetPixelBilinear(warpXFrac, warpYFrac);
    
                    xFrac = (x - 1) * 1.0F / (texThumb.width - 1);
                    yFrac = (y - 1) * 1.0F / (texThumb.height - 1);
                    warpXFrac = Mathf.Pow(xFrac, warpFactor);
                    warpYFrac = Mathf.Pow(yFrac, warpFactor);
                    Color c5 = tex.GetPixelBilinear(warpXFrac, warpYFrac);
    
                    xFrac = (x + 1) * 1.0F / (texThumb.width - 1);
                    yFrac = (y + 1) * 1.0F / (texThumb.height - 1);
                    warpXFrac = Mathf.Pow(xFrac, warpFactor);
                    warpYFrac = Mathf.Pow(yFrac, warpFactor);
                    Color c6 = tex.GetPixelBilinear(warpXFrac, warpYFrac);
    
                    xFrac = (x - 0) * 1.0F / (texThumb.width - 1);
                    yFrac = (y + 1) * 1.0F / (texThumb.height - 1);
                    warpXFrac = Mathf.Pow(xFrac, warpFactor);
                    warpYFrac = Mathf.Pow(yFrac, warpFactor);
                    Color c7 = tex.GetPixelBilinear(warpXFrac, warpYFrac);
    
                    xFrac = (x - 1) * 1.0F / (texThumb.width - 1);
                    yFrac = (y + 1) * 1.0F / (texThumb.height - 1);
                    warpXFrac = Mathf.Pow(xFrac, warpFactor);
                    warpYFrac = Mathf.Pow(yFrac, warpFactor);
                    Color c8 = tex.GetPixelBilinear(warpXFrac, warpYFrac);
    
                    Color cr = c0 * 0.25f + c1 * 0.125f + c2 * 0.125f + c3 * 0.0625f + c4 * 0.125f + c5 * 0.0625f + c6 * 0.0625f + c7 * 0.125f + c8 * 0.0625f;
    
                    destPix[y * texThumb.width + x] = cr;
    
                    x++;
                }
                y++;
            }
            texThumb.SetPixels(destPix);
            texThumb.Apply();
            byte[] bytesThumb = texThumb.EncodeToPNG();
    Destroy(tex); Destroy(texThumb);
    //WWWForm上传到服务器 WWWForm form = new WWWForm(); form.AddField("cmd", "savedraw"); form.AddBinaryData("screenshot", bytesThumb); form.AddBinaryData("draw", bytes); WWW w = new WWW(url, form); yield return w; if (w.error != null) { Debug.Log("Error:" + w.error); } else Debug.Log("OK"); }

    声明:此博客为个人学习之用,如与其他作品雷同,纯属巧合,并请明示指出
  • 相关阅读:
    数据结构3 特殊二叉树
    数据结构2 树与二叉树
    数据结构1 线性结构
    《数据库系统概念》20-恢复系统
    《数据库系统概念》19-并发控制
    数据库系统概念》18-事务
    巨杉内核笔记 | 会话(Session)
    巨杉Tech|SequoiaDB 巨杉数据库高可用容灾测试
    巨杉学习笔记 | SequoiaDB MySQL导入导出工具使用实战
    保险行业持续扩展,巨杉数据库再次中标人保财险
  • 原文地址:https://www.cnblogs.com/fws94/p/6288481.html
Copyright © 2011-2022 走看看