2013-10-24 45 views
0

问题出在方法Texture2D.SaveAsPng。我最近在这个方法中发现了memory leak类似的问题,但设法解决它。但我不能在这里适应这个解决方案。我现在想要的是:如何正确保存texture2d到MediaLibrary wp7

 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内存泄漏只在窗口电话发生7.

UPD:从字节数组从Texture.GetData创建内存流长度为1984000,当从存储器Texture2D.SaveAsJpeg流的长度是141520.

回答

0

我不明白你为什么在textureData中复制纹理pic数据,但你从不使用它。
也许你需要做的:

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

UPDATE

根据MSDN为MediaLibrary.SavePicture:传递在

图像数据必须是一个JPEG文件格式。 此外,SavePicture总是将图像保存为JPEG文件 格式。

看来,你从Texture2D.GetData得到byte[]不是这种格式,但我不知道如何将它转换。

+0

错误的复制粘贴,对不起。我试图通过像你所建议的字节数组,但从该字节数组创建的内存流,但它没有工作,exeption被抛出保存线。 – Feusp

+1

为什么从Texture.GetData的字节数组长度为1984000?如果纹理是800x420不应该是1344000? – pinckerman

+0

我再次失败,确切尺寸800x620而不是800x420。我现在感觉有点尴尬。 – Feusp