【问题标题】:XNA / Monogame Texture2D to to stringXNA / Monogame Texture2D 到字符串
【发布时间】:2015-08-04 17:37:56
【问题描述】:

我想在 XML 文件中存储一个小的 png 图像并将其加载回 Texture2D。

这就是我正在做的事情

保存代码

我正在用 BinaryWriter 将 Texture2D 的数据写入 MemoryStream,

然后将 MemoryStream 转换为数组。我必须将数组转换为 Base64String,因为您无法保存所有字符

在 XML 文件中。

字符串保存在我的 XML 文件中。

    public static string SaveTextureData(this Texture2D texture)
    {
        int width = texture.Width;
        int height = texture.Height;
        Color[] data = new Color[width * height];
        texture.GetData<Color>(data, 0, data.Length);

        MemoryStream streamOut = new MemoryStream();

        BinaryWriter writer = new BinaryWriter(streamOut);

           writer.Write(width);
            writer.Write(height);
            writer.Write(data.Length);

            for (int i = 0; i < data.Length; i++)
            {
                writer.Write(data[i].R);
                writer.Write(data[i].G);
                writer.Write(data[i].B);
                writer.Write(data[i].A);
            } 

        return Convert.ToBase64String(streamOut.ToArray());
    }

加载代码

这里也一样。我正在将 Base64Str 转换为数组并尝试读取它。

但我不能读回来。

    public static Texture2D LoadTextureData(this string gfxdata, GraphicsDevice gfxdev)
    {
        byte[] arr = Convert.FromBase64String(gfxdata);

        MemoryStream input = new MemoryStream();

        BinaryWriter bw = new BinaryWriter(input);
        bw.Write(arr);

        using (BinaryReader reader = new BinaryReader(input))
        {
            var width = reader.ReadInt32();
            var height = reader.ReadInt32();
            var length = reader.ReadInt32();
            var data = new Color[length];

            for (int i = 0; i < data.Length; i++)
            {
                var r = reader.ReadByte();
                var g = reader.ReadByte();
                var b = reader.ReadByte();
                var a = reader.ReadByte();
                data[i] = new Color(r, g, b, a);
            }

            var texture = new Texture2D(gfxdev, width, height);
            texture.SetData<Color>(data, 0, data.Length);
            return texture;
        }
    }

这里可能需要一些帮助。

在读取方法中获取值无法读取的异常。 排队

var width = reader.ReadInt32();

【问题讨论】:

  • 您能否更具体地说明您遇到了什么问题? “它不起作用”不是问题陈述。
  • 在读取方法中获取值无法读取的异常。在行 var width = reader.ReadInt32();
  • 您是否尝试过调试任何东西?看看读者长什么样?为您调试它几乎是不可能的。
  • 以后在 StackOverflow 上寻求异常帮助时,请务必包含异常的完整 ToString() 输出,包括异常类型和回溯。在这种情况下,您会收到 System.IO.EndOfStreamException 类型的异常,这是对问题的重要提示。

标签: c# xml xna monogame texture2d


【解决方案1】:

只需 create a MemoryStream 直接来自您的字节数组,无需使用写入器填充:

        byte[] arr = Convert.FromBase64String(gfxdata);

        using (var ms = new MemoryStream(arr))
        using (var reader = new BinaryReader(ms))
        {
            var width = reader.ReadInt32();
            var height = reader.ReadInt32();
            var length = reader.ReadInt32();
            var data = new Color[length];

            for (int i = 0; i < data.Length; i++)
            {
                var r = reader.ReadByte();
                var g = reader.ReadByte();
                var b = reader.ReadByte();
                var a = reader.ReadByte();
                data[i] = new Color(r, g, b, a);
            }

            // Allocate the Texture2D as before.
        }

(您的代码的具体问题是您在写入input 流后没有回退它。)

【讨论】:

  • 直接从数组创建一个 MemoryStream 解决了这个问题 :) 非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-23
  • 2013-01-12
  • 1970-01-01
相关资源
最近更新 更多