如何在Unity中EncodeToPng压缩纹理

SHA*_*HAI 2 c# texture2d unity-game-engine

我开发了一个用于保存纹理(屏幕截图)的应用程序,我需要对其进行压缩,但是-我无法使用EncodeToPNGmethod来在屏幕上显示图像。

我的步骤:

  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,不支持压缩纹理,该怎么办?我的手机占用很多空间

Pro*_*mer 6

您必须先对其解压缩,然后再对其使用EncodeToPNG。您应该可以使用RenderTexture。复制压缩Texture2DRenderTexture。分配RenderTextureRenderTexture.active然后使用ReadPixels可以将像素从像素复制RenderTextureTexture2D您希望采用解压缩格式的新像素。现在,您可以使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

创建一个压缩的纹理:

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

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

Texture2D decopmpresseTex = tex.DeCompress();
Run Code Online (Sandbox Code Playgroud)

编码为png

var bytes = decopmpresseTex.EncodeToPNG();
Run Code Online (Sandbox Code Playgroud)