如何实现Texture2D与字符串互转且无画质损失?
问题:Texture2D与Base64互转后画质下降、颜色变浅
我在将Texture2D转换为字符串再转回Texture2D时,出现画质下降且颜色变浅的问题,当前运行流程如下:
- 对相机前方的任意物体进行截图
- 将截图设置为图片的Sprite(此时显示正常)
- 将截图(Texture2D)转换为字符串(用于保存)
- 将字符串转回Texture2D
- 将转换后的Texture2D设置为图片的Sprite(此时画面变浅、画质降低)
原转换代码
// Convert texture2D to string and return public static string Texture2DToBase64(Texture2D texture) { byte[] data = texture.EncodeToPNG(); return Convert.ToBase64String(data); } // Convert string to texture2D and return public static Texture2D Base64ToTexture2D(string encoded) { byte[] data = Convert.FromBase64String(encoded); int width, height; GetImageSize(data, out width, out height); Texture2D texture = new Texture2D(width, height, TextureFormat.ARGB32, false, true); texture.hideFlags = HideFlags.HideAndDontSave; texture.filterMode = FilterMode.Point; texture.LoadImage(data); return texture; } static void GetImageSize(byte[] imageData, out int width, out int height) { width = ReadInt(imageData, 3 + 15); height = ReadInt(imageData, 3 + 15 + 2 + 2); } static int ReadInt(byte[] imageData, int offset) { return (imageData[offset] << 8) | imageData[offset + 1]; }
效果对比
转换前截图:

转换后(修正前)截图:

请问如何实现截图(Texture2D)与字符串互转且不改变画质?(是否可行?)
解决方案
Texture2D与Base64互转保持画质是完全可行的,问题出在解码时手动解析PNG宽高的逻辑错误,以及不必要的格式强制指定。以下是修正方案:
修正后的转换代码
// Texture2D转Base64字符串(这部分无需修改,EncodeToPNG是无损编码) public static string Texture2DToBase64(Texture2D texture) { byte[] data = texture.EncodeToPNG(); return Convert.ToBase64String(data); } // Base64字符串转Texture2D(核心修正部分) public static Texture2D Base64ToTexture2D(string encoded) { byte[] data = Convert.FromBase64String(encoded); // 创建初始尺寸任意的空纹理,LoadImage会自动根据PNG数据调整宽高和格式 Texture2D texture = new Texture2D(2, 2); texture.hideFlags = HideFlags.HideAndDontSave; texture.filterMode = FilterMode.Point; // LoadImage方法会自动解析PNG的宽高、格式并填充数据,无需手动处理 texture.LoadImage(data); return texture; }
问题原因解析
- 自定义PNG宽高解析错误:原代码中的
GetImageSize和ReadInt方法对PNG文件头的解析逻辑不正确——PNG的宽高采用大端字节序存储,而你的ReadInt用了小端方式读取,导致宽高值计算错误,创建的纹理尺寸与原截图不匹配,最终出现拉伸、画质下降和颜色异常。 - 强制指定纹理格式:手动指定
TextureFormat.ARGB32可能与原截图的纹理格式不兼容,而LoadImage方法会自动根据PNG数据选择最合适的格式,无需手动指定。
额外注意事项
EncodeToPNG是无损编码,只要解码逻辑正确,就能完全还原原Texture2D的画质和颜色。- 如果需要保留原纹理的更多细节(比如HDR数据),可以考虑使用
EncodeToEXR替代EncodeToPNG,解码时LoadImage同样可以处理EXR格式。
内容的提问来源于stack exchange,提问作者Taran Saini
相关产品推荐
相关产品推荐

