You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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;
}

问题原因解析

  1. 自定义PNG宽高解析错误:原代码中的GetImageSize和ReadInt方法对PNG文件头的解析逻辑不正确——PNG的宽高采用大端字节序存储,而你的ReadInt用了小端方式读取,导致宽高值计算错误,创建的纹理尺寸与原截图不匹配,最终出现拉伸、画质下降和颜色异常。
  2. 强制指定纹理格式:手动指定TextureFormat.ARGB32可能与原截图的纹理格式不兼容,而LoadImage方法会自动根据PNG数据选择最合适的格式,无需手动指定。

额外注意事项

  • EncodeToPNG是无损编码,只要解码逻辑正确,就能完全还原原Texture2D的画质和颜色。
  • 如果需要保留原纹理的更多细节(比如HDR数据),可以考虑使用EncodeToEXR替代EncodeToPNG,解码时LoadImage同样可以处理EXR格式。

内容的提问来源于stack exchange,提问作者Taran Saini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 01:39:40