C#/ WinRT:如何将图像保存到文件

时间:2014-01-16 00:18:29

标签: c# windows xaml windows-runtime windows-8.1

我是一名iOS开发人员,学习Windows Store App开发,没有以前的Microsoft技术经验。

我需要将图像保存到文件中。我觉得这很容易,但我已经有一天了,我没有什么可以展示的。这在Windows中是非常困难的,或者由于对平台/ API的无知而遗漏了一些东西。

我需要保存的图片来源为Windows.UI.Xaml.Media.Imaging.RenderTargetBitmap。 RenderTargetBitmap可以将图像作为Windows.UI.Xaml.Controls.Image的源或IBuffer返回。

我可以验证RenderTargetBitmap是否正确渲染图像。但是,我无法将图像保存到文件中。我希望Image有一个Save()方法,但事实并非如此。所以我认为我需要以某种方式使用IBuffer。我接近了,我能够将缓冲区保存到磁盘,但它没有编码,所以我无法打开任何东西。

接下来,我尝试将缓冲区转换为流,使用BitmapEncoder将其编码为PNG。这很有效,但这让我在IRandomAccessStream中获得了我的PNG数据。我不知道如何将IRandomAccessStream保存到文件中。

我尝试了5-10种不同的复杂方法,例如通过类型转换地狱尝试将IRandomAccessStream转换为IBuffer,因此我可以在文件流上使用.WriteAsync()。我尝试在我的IRandomAccessStream上由DataReader提供的文件流上使用DataWriter,但我遇到了类型不匹配问题。等等。

那么,我该如何保存文件?这是我到目前为止所得到的:

private async void saveButton_Click(object sender, RoutedEventArgs e)
{

    //Create a new temporary image for saving
    //Image tempImage = new Image();

    //Create a render object
    RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap();
    //Render the app's display buffer
    await renderTargetBitmap.RenderAsync(null);
    //Set the temp image to the contents of the app's display buffer
    //tempImage.Source = renderTargetBitmap;

    //Create a new file picker, set the default name, and extenstion
    FileSavePicker savePicker = new FileSavePicker();
    savePicker.SuggestedFileName = "New LightTable.png";
    savePicker.FileTypeChoices.Add("Image", new List<string>(){".png"});

    //Get the file the user selected
    StorageFile saveFile = await savePicker.PickSaveFileAsync();

    //Only move on if the user actually selected a file
    if (saveFile != null)
    {
        //Get a buffer of the pixels captured from the screen
        Windows.Storage.Streams.IBuffer buffer = await renderTargetBitmap.GetPixelsAsync();

        //Get a stream of the data in the buffer
        System.IO.Stream stream = buffer.AsStream();

        //Convert the stream into a IRandomAccessStream because I don't know what I'm doing.
        Windows.Storage.Streams.IRandomAccessStream raStream = stream.AsRandomAccessStream();

        //Attempt to encode the stream into a PNG
        BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, raStream);

        //Get a stream for the file the user selected
        Windows.Storage.Streams.IRandomAccessStream fileStream = await saveFile.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite);

        //FIND SOME WAY TO SAVE raStream TO fileStream
        //Something like:
        // await fileStream.WriteAsync(raStream.AsStreamForRead());

    }

}

要么我只是错过了最后:如何将我的raStream写入文件,或者我的方法完全关闭。

我很感激帮助。请记住,我现在只使用Microsoft技术进行了一周的开发。我没有.NET,Silverlight或其他MS技术经验。从iOS上的UIImage控件保存编码图像是一个单一的方法调用,因此我正在盘旋的解决方案的剪切复杂性让我觉得我错过了一些我不知道的非常简单的事情。

1 个答案:

答案 0 :(得分:3)

您需要将像素数据设置为StorageFile流。有关示例,请参阅http://basquang.wordpress.com/2013/09/26/windows-store-8-1-save-visual-element-to-bitmap-image-file/