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"); }

    声明:此博客为个人学习之用,如与其他作品雷同,纯属巧合,并请明示指出
  • 相关阅读:
    【Leetcode】Unique Binary Search Trees
    linux C函数之access函数的用法
    Dispatcher.BeginInvoke()方法使用不当导致UI界面卡死的原因分析
    【Leetcod】Unique Binary Search Trees II
    KVM客户机使用主机USB设备
    运行Maven是报错:No goals have been specified for this build
    SQL2008R2 express版本不支持维护计划
    已超过了锁请求超时时段的原因
    Oracle免客户端InstantClient安装使用
    将存储过程的返回值赋给变量
  • 原文地址:https://www.cnblogs.com/fws94/p/6288481.html
Copyright © 2011-2022 走看看