c# - 通用应用程序缺少 WriteableBitmap SaveJpeg

标签 c# windows-8.1 windows-phone-8.1 dotnet-httpclient win-universal-app

我正在开发一个通用应用程序,在我的共享代码中,我尝试从网络下载图像并将图像保存到 LocalFolder。

我正在使用 HttpClient 从用户给定的网址下载图像并读取客户端响应以保存图像。我正在使用下面的代码进行保存,但无法找到 Writeable SaveJpeg 方法。

HttpResponseMessage response = await httpClient.GetAsync(imageUri);
await Task.Run(async () =>
{
    if (response.IsSuccessStatusCode)
    {
        // save image locally
        StorageFolder folder = await ApplicationData.Current.LocalFolder.CreateFolderAsync("Images", CreationCollisionOption.OpenIfExists);

        BitmapImage bmp = new BitmapImage();
        var buffer = await response.Content.ReadAsBufferAsync();

        InMemoryRandomAccessStream ras = new InMemoryRandomAccessStream();
        DataWriter writer = new DataWriter(ras.GetOutputStreamAt(0));
        writer.WriteBuffer(buffer);
        bmp.SetSource(ras);
    }
});

将图像响应保存到本地文件夹并具有图像质量%的最佳方法是什么(适用于 WP 和 Windows)。

最佳答案

您应该直接保存流,而不是保存BitmapImage

类似这样的事情。

var ras = new InMemoryRandomAccessStream();
var writer = new DataWriter(ras);
writer.WriteBuffer(buffer);
await writer.StoreAsync();
var inputStream = ras.GetInputStreamAt(0);

// you can still use this to display it on the UI though
//bmp.SetSource(ras);

// write the picture into this folder
var storageFile = await folder.CreateFileAsync("image1.jpg", CreationCollisionOption.GenerateUniqueName);
using (var storageStream = await storageFile.OpenAsync(FileAccessMode.ReadWrite))
{
    await RandomAccessStream.CopyAndCloseAsync(inputStream, storageStream.GetOutputStreamAt(0));
}

更新

您可以使用 BitmapEncoder 并在 SetPixelData 中传入属性 dpi 值。

using (var storageStream = await storageFile.OpenAsync(FileAccessMode.ReadWrite))
{
    var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, storageStream);
    var pixelStream = yourWriteableBitmap.PixelBuffer.AsStream();
    var pixels = new byte[pixelStream.Length];
    await pixelStream.ReadAsync(pixels, 0, pixels.Length);

    encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, (uint)yourWriteableBitmap.PixelWidth, (uint)yourWriteableBitmap.PixelHeight, 48, 48, pixels);
    await encoder.FlushAsync();
}

关于c# - 通用应用程序缺少 WriteableBitmap SaveJpeg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25343475/

相关文章:

c# - 如何防止 iOS Safari 输入标签中的自动大写?

c# - 使用枚举设置元素的可见性?

c# - 列表过滤变体

c# - 在 Windows Phone 8.1 中下拉刷新

c# - Windows Phone 8.1 应用程序部署错误

c# - 在单个 'IDisposable' 语句中嵌套 'using'

windows - 在裸系统上安装 MSCOMCTL.OCX 2.1

c++ - Windows 8(.1) 比需要多睡 1 毫秒

ios - 如何让 iPad 应用程序与 Windows 8 笔记本上的本地服务器通信

xaml - Scrollviewer ChangeView 功能不滚动到底部