如何正确地将texture2d保存到MediaLibrary wp7

时间:2013-10-24 15:16:13

标签: c# windows-phone-7 xna

问题在于方法Texture2D.SaveAsPng。我最近在类似的问题中找到了memory leak这个方法,但设法解决了它。但我不能在这里解决这个问题。我现在正在尝试的是:

        MediaLibrary library = new MediaLibrary();
        MemoryStream ms = new MemoryStream();
        pic.SaveAsJpeg(ms, pic.Width, pic.Height);
        ms.Seek(0, SeekOrigin.Begin);
        library.SavePicture(path, ms);
        ms.Close();

而且,每次调用我都会失去大约4mb的内存(纹理尺寸800x620)。 我试图从字节数组创建MemoryStream但它抛出Value does not fall within the expected range异常。

        byte[] textureData = new byte[4 * picHeight * picWidth];
        pic.GetData(textureData);
        library.SavePicture(path, textureData); //exception on this line

所以,我想,我需要在字节数组中转换Texture2D,以便library.SavePicture(path, ms)不会抛出异常,但我不知道如何做到这一点。任何帮助将不胜感激。

注意: Texture2D.SaveAsJpeg内存泄漏仅发生在Windows Phone 7上。

更新:Texture.GetData的字节数组创建的内存流长度为1984000,来自Texture2D.SaveAsJpeg的内存流长度为141520.

1 个答案:

答案 0 :(得分:0)

我不明白为什么你在pic中复制了纹理textureData数据但你永远不会使用它。
也许你需要这样做:

byte[] textureData = new byte[4 * picHeight * picWidth];
pic.GetData(textureData);
library.SavePicture(path, textureData); 

<强>更新

根据MediaLibrary.SavePicture的MSDN:

  

传入的图像数据必须是JPEG文件格式。   此外,SavePicture始终将图像保存为JPEG文件   格式。

您从byte[]获得的Texture2D.GetData似乎不是那种格式,但我不知道如何转换它。