是否将位图图像保存到uwp中的本地图像文件?

是否将位图图像保存到uwp中的本地图像文件?,uwp,Uwp,我的应用程序中有一个图像控件,并且已经设置了它的源代码 如何将图像保存到本地图像文件 我尝试了以下代码,但没有成功 var saveFile = new FileSavePicker(); saveFile.SuggestedStartLocation = PickerLocationId.PicturesLibrary; saveFile.FileTypeChoices.Add("jpeg", new List<string> { "

我的应用程序中有一个图像控件,并且已经设置了它的源代码

如何将图像保存到本地图像文件

我尝试了以下代码,但没有成功

var saveFile = new FileSavePicker();
            saveFile.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
            saveFile.FileTypeChoices.Add("jpeg", new List<string> { ".jpeg" });
            saveFile.SuggestedFileName = MasterMenuItem.Title + " - " + MasterMenuItem.AlbumArtistsString;
            StorageFile sFile = await saveFile.PickSaveFileAsync();
            try
            {
                if (sFile != null)
                {
                    Guid bitmapEncoderGuid = BitmapEncoder.JpegEncoderId;
                    IRandomAccessStream stream = await sFile.OpenAsync(FileAccessMode.ReadWrite, StorageOpenOptions.None);
                    BitmapEncoder encoder = await BitmapEncoder.CreateAsync(bitmapEncoderGuid, stream);
                    BitmapImage bi = MasterMenuItem.Cover as BitmapImage;
                    WriteableBitmap wb = null;
                    wb = await BitmapFactory.New(1, 1).FromContent(bi.UriSource);
                    Stream pixelStream = wb.PixelBuffer.AsStream();
                    byte[] pixels = new byte[pixelStream.Length];
                    await pixelStream.ReadAsync(pixels, 0, pixels.Length);
                    encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore,
                              (uint)wb.PixelWidth,
                              (uint)wb.PixelHeight,
                              96.0,
                              96.0,
                              pixels);
                    await encoder.FlushAsync();

                    stream.Dispose();
                    pixelStream.Dispose();
                }
            }
            catch { }
var saveFile=new FileSavePicker();
saveFile.SuggestedStartLocation=PickerLocationId.PicturesLibrary;
saveFile.FileTypeChoices.Add(“jpeg”,新列表{.jpeg});
saveFile.SuggestedFileName=MasterMenuItem.Title+“-”+MasterMenuItem.AlbumArtistString;
StorageFile sFile=wait saveFile.PickSaveFileAsync();
尝试
{
if(sFile!=null)
{
Guid bitmapEncoderGuid=BitmapEncoder.JpegEncoderId;
irandomaccesstream=wait sFile.OpenAsync(FileAccessMode.ReadWrite,StorageOpenOptions.None);
BitmapEncoder编码器=等待BitmapEncoder.CreateAsync(bitmapEncoderGuid,流);
BitmapImage bi=主菜单项。覆盖为BitmapImage;
WriteableBitmap wb=null;
wb=等待BitmapFactory.New(1,1).FromContent(bi.UriSource);
Stream pixelStream=wb.PixelBuffer.AsStream();
字节[]像素=新字节[pixelStream.Length];
等待pixelStream.ReadAsync(像素,0,像素,长度);
编码器.SetPixelData(BitmapPixelFormat.Bgra8,BitmapAlphaMode.Ignore,
(uint)wb.PixelWidth,
(uint)wb.PixelHeight,
96.0,
96.0,
像素);
等待编码器。FlushAsync();
stream.Dispose();
pixelStream.Dispose();
}
}
捕获{}

以下是我的一个应用程序的工作方法

基本上,我将
图像
控件转换为
渲染目标位图
,然后使用
文件保存选择器
保存图像

如果不想使用
图像
控件,但想保存
本身,则需要在呈现
图像
控件时保存
软件位图
,然后使用该位图保存
图像
。例如

private async void按钮\u点击(对象发送器,点击路由Deventargs e)
{
var_bitmap=新的RenderTargetBitmap();
wait_bitmap.RenderAsync(myImageSource);//----->这是我的ImageControl。
var savePicker=new FileSavePicker();
savePicker.SuggestedStartLocation=PickerLocationId.PicturesLibrary;
savePicker.FileTypeChoices.Add(“Image”,newlist(){.jpg});
savePicker.SuggestedFileName=“Card”+DateTime.Now.ToString(“yyyyMMddhhmmss”);
StorageFile savefile=wait savePicker.PickSaveFileAsync();
if(savefile==null)
返回;
var pixels=wait_bitmap.GetPixelsAsync();
使用(irandomaccesstream=await savefile.OpenAsync(FileAccessMode.ReadWrite))
{
var编码器=等待
CreateAsync(BitmapEncoder.JpegEncoderId,流);
字节[]字节=像素。ToArray();
编码器.SetPixelData(BitmapPixelFormat.Bgra8,
BitmapAlphaMode。忽略,
(uint)_bitmap.PixelWidth,
(uint)_bitmap.PixelHeight,
200,
200,
字节);
等待编码器。FlushAsync();
}
}

以下是我的一个应用程序的工作方法

基本上,我将
图像
控件转换为
渲染目标位图
,然后使用
文件保存选择器
保存图像

如果不想使用
图像
控件,但想保存
本身,则需要在呈现
图像
控件时保存
软件位图
,然后使用该位图保存
图像
。例如

private async void按钮\u点击(对象发送器,点击路由Deventargs e)
{
var_bitmap=新的RenderTargetBitmap();
wait_bitmap.RenderAsync(myImageSource);//----->这是我的ImageControl。
var savePicker=new FileSavePicker();
savePicker.SuggestedStartLocation=PickerLocationId.PicturesLibrary;
savePicker.FileTypeChoices.Add(“Image”,newlist(){.jpg});
savePicker.SuggestedFileName=“Card”+DateTime.Now.ToString(“yyyyMMddhhmmss”);
StorageFile savefile=wait savePicker.PickSaveFileAsync();
if(savefile==null)
返回;
var pixels=wait_bitmap.GetPixelsAsync();
使用(irandomaccesstream=await savefile.OpenAsync(FileAccessMode.ReadWrite))
{
var编码器=等待
CreateAsync(BitmapEncoder.JpegEncoderId,流);
字节[]字节=像素。ToArray();
编码器.SetPixelData(BitmapPixelFormat.Bgra8,
BitmapAlphaMode。忽略,
(uint)_bitmap.PixelWidth,
(uint)_bitmap.PixelHeight,
200,
200,
字节);
等待编码器。FlushAsync();
}
}

这是我为处理UWP中的图像而提出的一个往返解决方案

此外,我还需要从base-64进行编码和解码

如果不想调用FileOpenPicker,则以下代码是执行此操作的唯一方法

另外,请注意:如果您不调用选择器,那么您在保存文件的位置上的选项是有限的,这就是为什么我默认为用户的下载di
using System;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Security.Cryptography;
using Windows.UI.Xaml.Media.Imaging;
using System.Threading.Tasks;
using Windows.Storage.Streams;
using Windows.Storage;
using Windows.Graphics.Imaging;

namespace Images
{
    public static class ImageHelper
    {
        public static async Task<WriteableBitmap> TestImage()
        {

            // example base64-encoded icon in PNG format at 24x24, 32 bit color
            string base64str = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAONSURBVEhLpVZZaxNRFJ6f4KNb3brZ1XSxrVq17pnpZDJpUxdUDIqgFKQPKhYF2xcXpBb6JPpQSDKZcY1L7YZYFbGKhfjkm/jkc37C8ftuMhBLG6098JHh3nO+s9xz7o1WTFbG9RWr4npsfaJztDJpzdQ6YQV+b0yYw9iz86pLExKvTRijm5OWND88LNHxC3L98125Mjsk/cDljzelB2twJjVOOLsu0TlAm7x5cYGiXZ4MZSNj52Ukc0/mfr0rittzI9Lx9AQd/VwVNwJ5moVlddyINXjdMjh7U6Z/PFkS+t5dlcZUJFuSWMQJ64nayq0vN+TR9/v/hYvv+6UJThDon05Qlg0sizV2Rh58u7MstDzukS2OnclT56QEXQIH0jvTK0Nfry0LRydPS7PbJaXJUEyRM3qWZl1Sl963Z2Xw04Vl4ejkcalMmXTyUzlA7fuq0W6bXV1OTh+TSx9OLwvd41Gp8nTZiixQmQ4NA5Mud0zZ8kiXQy9NlOnIf+Pc2yOy54UhAXA1uhGpSloDWrVjZUpQnqbHOjZ1sSdMib2JLBmnAHPcUBzNT3Spcy0JpOy0hgGR9Q5SwuJebB4aC0p40pCeaVMO/yOiQGhSl+DroOJoAVfAC0uL2zWjcdw3zHPQORGEAR0FxZ5CVkVgQYe6tFEOXuYcNPgOkEGGHdSERaZX6ICwpuBoEXDP16MNbcnBYOtRIgxdWitLhtKVOGQezO7nuhx4FRRjPCgmyfPGC5ETKgCAurQ5CAfkaMB5NnsRqXPsAW1N3OirT9lSjdba8UyX/a9ytSzMQhEVEBdGTvjloW07OGrAtQ13WkXSCqhB88+Bp9+BFBmJjoh8J34mC4E61KWNX54q15QdXjQ3aJRNCXO0NhVWWWxHBDyoQicswXxirvnkrP0+2NC25iF+vajUO3buqqDwsajDw1HqdKqBY6l8J0yd9SVZIbjGPeqQvD2N1oQt+7/N7f7zsqOsjRs2BkNKHUM5YTRMmXUlCaMkIcFvrnGPOgyI5LVuSHZ6PdnSRGjhNwFvb6whFZEyZMJUWU9G1oHO4IwwKwV8c4177Pla6DLyXSBH2xd/1fKZZHmXVKQMZdyItiNR29Mc+M017lW6hrShY3ComUUjny88E7TYcKvbnW3xujA0YZX+ppSuwGug0bOlFcTtuagH8qZLEzrCbRvDCzXMsUcJFFrxjSyH8Uj95W+Lpv0GtNxNNKdkcLwAAAAASUVORK5CYII=";

            // First load the image from the base64 string
            var img = await LoadImageFromBase64(base64str);

            // Now test round-trip Base64 to Base64
            string sTest = await SaveImageToBase64(img);

            img = await LoadImageFromBase64(sTest);

            // now save the round-trip image
            var accTok = await SaveImageToFile("checkbox-round-trip.png", img);

            // now load, round-trip, from disk.
            img = await LoadImageFromFile(accTok, true);

            return img;
        }


        public static async Task<WriteableBitmap> LoadImageFromBase64(string base64str)
        {
            try
            {
                var decodedBin = CryptographicBuffer.DecodeFromBase64String(base64str);

                var readStream = new InMemoryRandomAccessStream();

                await readStream.WriteAsync(decodedBin);
                readStream.Seek(0);

                var decoder = await BitmapDecoder.CreateAsync(readStream);

                var workBmp = new WriteableBitmap((int)decoder.PixelWidth, (int)decoder.PixelHeight);
                readStream.Seek(0);

                await workBmp.SetSourceAsync(readStream);
                return workBmp;

            }
            catch (Exception ex)
            {
                return null;
            }
        }

        public static async Task<string> SaveImageToBase64(WriteableBitmap workBmp)
        {
            try
            {
                var writeStream = new InMemoryRandomAccessStream();
                var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, writeStream);

                // saving to a straight 32 bpp PNG, the dpiX and dpiY values are irrelevant, but also cannot be zero. 
                // We will use the default "since-the-beginning-of-time" 96 dpi.
                encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, (uint)workBmp.PixelWidth, (uint)workBmp.PixelHeight, 96, 96, workBmp.PixelBuffer.ToArray());

                await encoder.FlushAsync();
                writeStream.Seek(0);

                var proxyStream = writeStream.AsStreamForRead();
                byte[] b = new byte[proxyStream.Length];

                await proxyStream.ReadAsync(b, 0, (int)proxyStream.Length);

                proxyStream.Dispose();

                return (string)CryptographicBuffer.EncodeToBase64String(b.AsBuffer());
            }
            catch (Exception ex)
            {
                return null;
            }
        }

        public static async Task<WriteableBitmap> LoadImageFromFile(string fileName, bool isToken = false)
        {
            try
            {
                var xc = Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList;
                StorageFile decodedBin;

                if (!isToken)
                {
                    decodedBin = await StorageFile.GetFileFromPathAsync(fileName);
                }
                else
                {
                    decodedBin = await xc.GetFileAsync(fileName, Windows.Storage.AccessCache.AccessCacheOptions.None);
                }

                var readStream = await decodedBin.OpenReadAsync();

                var decoder = await BitmapDecoder.CreateAsync(readStream);
                var workBmp = new WriteableBitmap((int)decoder.PixelWidth, (int)decoder.PixelHeight);

                readStream.Seek(0);

                await workBmp.SetSourceAsync(readStream);

                readStream.Dispose();
                return workBmp;
            }
            catch (Exception ex)
            {
                return null;
            }
        }

        public static async Task<string> SaveImageToFile(string fileName, WriteableBitmap workBmp)
        {
            try
            {
                var writeStream = new InMemoryRandomAccessStream();
                var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, writeStream);

                // saving to a straight 32 bpp PNG, the dpiX and dpiY values are irrelevant, but also cannot be zero. 
                // We will use the default "since-the-beginning-of-time" 96 dpi.
                encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, (uint)workBmp.PixelWidth, (uint)workBmp.PixelHeight, 96, 96, workBmp.PixelBuffer.ToArray());

                await encoder.FlushAsync();

                writeStream.Seek(0);

                var dl = await DownloadsFolder.CreateFileAsync(fileName, CreationCollisionOption.GenerateUniqueName);
                var imgFileOut = await dl.OpenStreamForWriteAsync();

                var fileProxyStream = writeStream.AsStreamForRead();

                await fileProxyStream.CopyToAsync(imgFileOut);
                await imgFileOut.FlushAsync();

                fileProxyStream.Dispose();
                imgFileOut.Dispose();

                var xc = Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList;

                return xc.Add(dl);
            }
            catch (Exception ex)
            {
                return null;
            }
        }

    }
}