1

我每 1 秒通过网络套接字在 Metro 应用程序上接收图像,将其加载到字节数组中,然后将其转换为 BitmapImage 并稍后显示。所有这些工作正常。

另一边的图像在不断变化。出于某种原因,它会不时抛出 OutOfMemory 异常(如 1 in 10)。我通过在每次接收到图像时清除字节数组来修复它。现在它就像魅力一样。

关于我的主要问题,请参见下文:

         public static BitmapImage imag;
         public static byte[] save = new byte[1];

if(recieved)
{
         await reader.LoadAsync(4);
         var sz = reader.ReadUInt32(); //read size
         await reader.LoadAsync(sz);   //read content
         save = new byte[sz];
         reader.ReadBytes(save);
         await ImgSrcFromBytes(save)

         Array.Clear(save, 0, save.Length);         //issue here !! 
} 



public async Task<ImageSource> ImgSrcFromBytes(byte[] a)
    {
       imag = new BitmapImage();

        var stream = new Windows.Storage.Streams.InMemoryRandomAccessStream();
        await stream.WriteAsync(a.AsBuffer());
        stream.Seek(0);

        imag.SetSource(stream);
        return imag;
    }

现在,我正在实现一个新功能,如果用户使用下面的代码请求将图像保存为文件,但是,如果我清除上面的字节数组,我会得到一个不可读的图像,但如果我不清除阵列,我得到一个完美的形象。

请注意,不会引发异常,并且两个图像的大小相同。

       FileSavePicker picker = new FileSavePicker();
       picker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
       picker.SuggestedFileName = "capture.png";
       picker.FileTypeChoices.Add("Png File", new List<string>() { ".png" });

       StorageFile file = await picker.PickSaveFileAsync();

       if (file != null)
       {
           CachedFileManager.DeferUpdates(file);
           await FileIO.WriteBytesAsync(file, save);
           await CachedFileManager.CompleteUpdatesAsync(file);
           await new Windows.UI.Popups.MessageDialog("Image Saved Successfully !").ShowAsync();

       }

我希望我很清楚。这是一个权衡,如果我清除数组,我在通过套接字接收流时不会出现异常,但在保存时我将无法获得可读的图像。反之亦然。

4

0 回答 0