c# - 如何在 Unity 中 EncodeToPng 压缩纹理

标签 c# unity3d texture2d

我开发了一个保存纹理(屏幕截图)的应用程序,我需要压缩它们,但是 - 我无法使用 EncodeToPNG 方法在屏幕上显示图像。

我的步骤:

  1. Texture2D tex = new Texture2D(recwidth, recheight, TextureFormat.RGB24, false);//RGB24- 因为下一步:

  2. tex.ReadPixels(rex, rdPXX, rdPXY); tex.Apply();

  3. tex.Compress(false);

稍后我需要在屏幕上显示-

  1. var bytes = tex.EncodeToPNG();

但我不能,因为我们都知道 EncodeToPNG 不支持压缩纹理,所以我该怎么办?我的手机占用了很多空间

最佳答案

在使用 EncodeToPNG 之前,您必须先解压缩纹理。您应该能够使用 RenderTexture 执行此操作。将压缩后的 Texture2D 复制到 RenderTexture。将 RenderTexture 分配给 RenderTexture.active 然后使用 ReadPixels 将像素从 RenderTexture 复制到新的 Texture2D 你希望是解压后的格式。现在,您可以对其使用 EncodeToPNG

执行此操作的辅助函数:

public static class ExtensionMethod
{
    public static Texture2D DeCompress(this Texture2D source)
    {
        RenderTexture renderTex = RenderTexture.GetTemporary(
                    source.width,
                    source.height,
                    0,
                    RenderTextureFormat.Default,
                    RenderTextureReadWrite.Linear);

        Graphics.Blit(source, renderTex);
        RenderTexture previous = RenderTexture.active;
        RenderTexture.active = renderTex;
        Texture2D readableText = new Texture2D(source.width, source.height);
        readableText.ReadPixels(new Rect(0, 0, renderTex.width, renderTex.height), 0, 0);
        readableText.Apply();
        RenderTexture.active = previous;
        RenderTexture.ReleaseTemporary(renderTex);
        return readableText;
    }
}

用法:

创建压缩纹理:

Texture2D tex = new Texture2D(recwidth, recheight, TextureFormat.RGB24, false);
tex.ReadPixels(rex, rdPXX, rdPXY);
tex.Apply();
tex.Compress(false);

从压缩的纹理创建一个新的解压纹理:

Texture2D decopmpresseTex = tex.DeCompress();

编码为png

var bytes = decopmpresseTex.EncodeToPNG();

关于c# - 如何在 Unity 中 EncodeToPng 压缩纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51315918/

相关文章:

android - 如何使用 Android 和 OpenGL ES 2.0 在正方形上绘制文本

c# - Shell 脚本文件 (.sh) 不从 linux 上的 c# 核心运行

c# - 区域中的子Web.config

c# - Task.Run 在这里是否合适,包装网络调用?

android - Unity gradle build - 合并 dex 文件时出错

android - 渲染到纹理 : Maximum number?

c# - 我们能否减少 ExchangeWebsevice 中 AutodiscoverUrl 消耗的时间

c# - 在 Unity 中打电话?

c# - 在 Unity 中使游戏对象可触摸 - 增强现实

XNA 4 - 纹理克隆