Xamarin.forms Xamarin forms UWP:如何从ImageSource保存jpg?

Xamarin.forms Xamarin forms UWP:如何从ImageSource保存jpg?,xamarin.forms,uwp,Xamarin.forms,Uwp,我可以在iOS和Android中保存图片,但我找不到在UWP中保存图片的方法。有什么想法吗 提前谢谢。也许有人需要iOS和Android的解决方案(见下文)。与此同时,我正在等待UWP的想法 网间网操作系统 // ///将图片保存到磁盘。 /// ///将图片复制到磁盘。 ///图像源。 ///标识符。 ///如果设置为true,则覆盖(如果存在)。 ///将图片复制到磁盘。 公共异步void SaveImage(ImageSource imgSrc,字符串id,bool overwriteI

我可以在iOS和Android中保存图片,但我找不到在UWP中保存图片的方法。有什么想法吗


提前谢谢。

也许有人需要iOS和Android的解决方案(见下文)。与此同时,我正在等待UWP的想法

网间网操作系统
//
///将图片保存到磁盘。
/// 
///将图片复制到磁盘。
///图像源。
///标识符。
///如果设置为true,则覆盖(如果存在)。
///将图片复制到磁盘。
公共异步void SaveImage(ImageSource imgSrc,字符串id,bool overwriteIfExist=false)
{
var renderer=new StreamImagesourceHandler();
var photo=await renderer.LoadImageAsync(imgSrc);
字符串jpgFilename=Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal),id+“.jpg”);
if(File.Exists(jpgFilename))
{
文件.Delete(jpgFilename);
}
NSData imgData=photo.AsJPEG();
错误;
if(imgData.Save(jpgFilename、false、out err))
{
Console.WriteLine(“另存为”+jpgFilename);
}
其他的
{
Console.WriteLine(“未另存为”+jpgFilename
+“因为”+错误本地化描述);
}
}
很高兴知道,当iOS将图像保存为jpg时,图像标题会显示png

安卓
//
///将图片保存到磁盘。
/// 
///图像源。
///图像标识符。
///如果设置为true,则覆盖(如果存在)。
///将图片复制到磁盘。
公共异步void SaveImage(ImageSource imgSrc,字符串id,
bool overwriteIfExist=false)
{
var renderer=new StreamImagesourceHandler();
var photo=await renderer.LoadImageAsync(imgSrc,Forms.Context);
字符串jpgFilename=System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal),id+“.jpg”);
if(File.Exists(jpgFilename))
{
文件.Delete(jpgFilename);
}
使用(FileStream fs=newfilestream(jpgFilename,FileMode.OpenOrCreate))
{
photo.Compress(位图.CompressFormat.Jpeg,100,fs);
}
}

也许有人需要iOS和Android的解决方案(见下文)。与此同时,我正在等待UWP的想法

网间网操作系统
//
///将图片保存到磁盘。
/// 
///将图片复制到磁盘。
///图像源。
///标识符。
///如果设置为true,则覆盖(如果存在)。
///将图片复制到磁盘。
公共异步void SaveImage(ImageSource imgSrc,字符串id,bool overwriteIfExist=false)
{
var renderer=new StreamImagesourceHandler();
var photo=await renderer.LoadImageAsync(imgSrc);
字符串jpgFilename=Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal),id+“.jpg”);
if(File.Exists(jpgFilename))
{
文件.Delete(jpgFilename);
}
NSData imgData=photo.AsJPEG();
错误;
if(imgData.Save(jpgFilename、false、out err))
{
Console.WriteLine(“另存为”+jpgFilename);
}
其他的
{
Console.WriteLine(“未另存为”+jpgFilename
+“因为”+错误本地化描述);
}
}
很高兴知道,当iOS将图像保存为jpg时,图像标题会显示png

安卓
//
///将图片保存到磁盘。
/// 
///图像源。
///图像标识符。
///如果设置为true,则覆盖(如果存在)。
///将图片复制到磁盘。
公共异步void SaveImage(ImageSource imgSrc,字符串id,
bool overwriteIfExist=false)
{
var renderer=new StreamImagesourceHandler();
var photo=await renderer.LoadImageAsync(imgSrc,Forms.Context);
字符串jpgFilename=System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal),id+“.jpg”);
if(File.Exists(jpgFilename))
{
文件.Delete(jpgFilename);
}
使用(FileStream fs=newfilestream(jpgFilename,FileMode.OpenOrCreate))
{
photo.Compress(位图.CompressFormat.Jpeg,100,fs);
}
}
我找不到在UWP中保存图像的方法

不,我们无法从Xamarin对象提取图像数据

UWP中有
StreamImagesourceHandler
类实现,请参阅

在Xamarin页面的代码隐藏中:

    var memoryStream = new MemoryStream(Convert.FromBase64String("iVBOxxxxxxxxxxMVEX/uQOAuwPzUxxxxxxxxxxxx="));
    ImageSource imgsource = ImageSource.FromStream(() => memoryStream);

    if (Device.OS == TargetPlatform.Windows|| Device.OS == TargetPlatform.WinPhone)
         DependencyService.Get<ISaveImage>().SavePictureToDiskWINRT(memoryStream, "1");
    else
         DependencyService.Get<ISaveImage>().SavePictureToDisk(imgsource, "1");
请在

关于UWP文件存储指南,请参阅

我找不到在UWP中保存图像的方法

不,我们无法从Xamarin对象提取图像数据

UWP中有
StreamImagesourceHandler
类实现,请参阅

在Xamarin页面的代码隐藏中:

    var memoryStream = new MemoryStream(Convert.FromBase64String("iVBOxxxxxxxxxxMVEX/uQOAuwPzUxxxxxxxxxxxx="));
    ImageSource imgsource = ImageSource.FromStream(() => memoryStream);

    if (Device.OS == TargetPlatform.Windows|| Device.OS == TargetPlatform.WinPhone)
         DependencyService.Get<ISaveImage>().SavePictureToDiskWINRT(memoryStream, "1");
    else
         DependencyService.Get<ISaveImage>().SavePictureToDisk(imgsource, "1");
请在


关于UWP文件存储指南,请参见

到目前为止您尝试了什么?你有密码吗?iOS和Android的代码是什么样子的?对于iOS和Android来说,工作正常。在UWP不工作的情况下,一些在线教程是错误的或不完整的。我可以分享我的代码。请分享一些代码,也许它会给我一些关于你的要求的提示,以及你是如何在iOS和Android中解决的。请使用您正在遵循的代码和/或教程更新您的问题。据我所知,如果您想保存文件,您需要从原始源获取流/字节数组,但xamarin的
ImageSource
没有此类方法,我们需要保留对原始源的引用。那么你在IOS和Android中是如何做到的呢?你的图像来源是什么?到目前为止你尝试了什么?你有密码吗?iOS和Android的代码是什么样子的?对于iOS和Android来说,工作正常。在UWP不工作的情况下,一些在线教程是错误的或不完整的。我可以分享我的代码。请分享一些代码,也许我可以
public sealed class StreamImageSourceHandler : IImageSourceHandler
{
    public async Task<Windows.UI.Xaml.Media.ImageSource> LoadImageAsync(ImageSource imagesource, CancellationToken cancellationToken = new CancellationToken())
    {
        BitmapImage bitmapimage = null;

        //Omitted

        return bitmapimage;
    }
}
public interface ISaveImage
{
    void SavePictureToDisk(ImageSource imgSrc, string Id, bool OverwriteIfExist = false);
    void SavePictureToDiskWINRT(System.IO.Stream imgStream, string Id, bool OverwriteIfExist = false);
}
    var memoryStream = new MemoryStream(Convert.FromBase64String("iVBOxxxxxxxxxxMVEX/uQOAuwPzUxxxxxxxxxxxx="));
    ImageSource imgsource = ImageSource.FromStream(() => memoryStream);

    if (Device.OS == TargetPlatform.Windows|| Device.OS == TargetPlatform.WinPhone)
         DependencyService.Get<ISaveImage>().SavePictureToDiskWINRT(memoryStream, "1");
    else
         DependencyService.Get<ISaveImage>().SavePictureToDisk(imgsource, "1");
using Xamarin.Forms;
using WorkingWithImages.WinUniversal;
using System.IO;
using System;
using Windows.Storage.Streams;

[assembly: Xamarin.Forms.Dependency(typeof(SaveImageImplementation))]
namespace WorkingWithImages.WinUniversal
{
    public class SaveImageImplementation : ISaveImage
    {
        public SaveImageImplementation() { }

        public void SavePictureToDisk(ImageSource imgSrc, string Id, bool OverwriteIfExist = false)
        {
            throw new NotImplementedException();
        }

        public async void SavePictureToDiskWINRT(Stream imgStream, string Id, bool OverwriteIfExist = false)
        {
            var inStream = imgStream.AsRandomAccessStream();
            var fileBytes = new byte[inStream.Size];
            using (DataReader reader = new DataReader(inStream))
            {
                await reader.LoadAsync((uint)inStream.Size);
                reader.ReadBytes(fileBytes);
            }

            var file = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync(Id+".jpg", Windows.Storage.CreationCollisionOption.ReplaceExisting);
            using (var fs = await file.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite))
            {
                var outStream = fs.GetOutputStreamAt(0);
                var dataWriter = new DataWriter(outStream);
                dataWriter.WriteBytes(fileBytes);
                await dataWriter.StoreAsync();
                dataWriter.DetachStream();
                await outStream.FlushAsync();
                outStream.Dispose();
                fs.Dispose();
            }
        }
    }
}