如何将 Forms.Image 中的最终照片保存到 xamarin 表单中的本地

Posted

技术标签:

【中文标题】如何将 Forms.Image 中的最终照片保存到 xamarin 表单中的本地【英文标题】:How to save the final photo in Forms.Image to local in xamarin forms 【发布时间】:2019-02-17 04:34:40 【问题描述】:

我正在使用 Xamarin 表单为 android 制作一个应用程序,用户可以从他们的库中选择一张照片,添加一个白色边框使其成为正方形,然后保存它。我卡在保存部分,无法弄清楚

我使用的是普通的 Xamarin.Forms.Image 控件

 <Image HorizontalOptions="CenterAndExpand" 
                         VerticalOptions="Center" 
                         BackgroundColor="Transparent"
                         Grid.Column="0" 
                         Grid.Row="0"
                         x:Name="imgViewer"/>

这就是我选择照片的方式


 async void tbAdd_Activated(object sender, System.EventArgs e)
 
     var file = await CrossFilePicker.Current.PickFile();
     if (file != null)
     
         imgViewer.Source = ImageSource.FromFile(file.FilePath);
         imgViewer.BackgroundColor = Color.White;
     
  

但是我有一个保存按钮,可以将带有边框的最终图像保存到相机胶卷,但我不知道如何保存它,我到处搜索,但似乎找不到!

有人知道怎么做吗?

【问题讨论】:

如果您想处理图像,请查看 SkiaSharp。 我已经发布了一个答案并测试了它。请尝试一下。 【参考方案1】:

您必须在 ios 和 android 中使用特定代码来保存图像,并通过将此密钥添加到 info.Plist 文件来在 iOS 中添加所需的权限

<key>NSPhotoLibraryAddUsageDescription</key>
<string>$(PRODUCT_NAME)</string>

安卓:

MediaStore.Images.Media.InsertImage(Application.Context.ContentResolver, [YourFileName],
System.IO.Path.GetFileName([YourFileName]), string.Empty);

iOS:

var imageSource = CGImageSource.FromUrl(NSUrl.FromFilename( [YourFileName]));
UIImage.FromImage(imageSource.CreateImage(0, null), 1, imageOrientation)
.SaveToPhotosAlbum((image, error) =>  // handle success & error here... );

您可以查看此link 了解更多信息。

【讨论】:

【参考方案2】:

可以通过以下代码保存图片:

void save_Activated(object sender, System.EventArgs e)

    if (file != null)
    
        byte[] imageBytes;
        var FileImage = new Image();

        string base64;
        using (var fs = new FileStream(file.FilePath, FileMode.Open, FileAccess.Read))
        
            var buffer = new byte[fs.Length];
            fs.Read(buffer, 0, (int)fs.Length);
            base64 = Convert.ToBase64String(buffer);
        

        imageBytes = Convert.FromBase64String(base64); 

        File.WriteAllBytes(filename, imageBytes);

    

所以完整的代码是这样的:

    string documentsFolder;
    string filename;
    FileData file;
    ImageSource imageSource;

    public MainPage()
    
        InitializeComponent();
        documentsFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        filename = Path.Combine(documentsFolder, "myfile.jpg");
    

    async void tbAdd_Activated(object sender, System.EventArgs e)
    
        file = await CrossFilePicker.Current.PickFile();
        if (file != null)
        
            imgViewer.Source = ImageSource.FromFile(file.FilePath);
            imgViewer.BackgroundColor = Color.White;
            imageSource = imgViewer.Source;
        
    

    void save_Activated(object sender, System.EventArgs e)
    
        if (file != null)
        
            byte[] imageBytes;
            var FileImage = new Image();

            string base64;
            using (var fs = new FileStream(file.FilePath, FileMode.Open, FileAccess.Read))
            
                var buffer = new byte[fs.Length];
                fs.Read(buffer, 0, (int)fs.Length);
                base64 = Convert.ToBase64String(buffer);
            

            imageBytes = Convert.FromBase64String(base64); 

            File.WriteAllBytes(filename, imageBytes);

        
    

xamal 是:

<Button Text="AddImage" Clicked="tbAdd_Activated">
</Button>
<Button Text="SaveImage" Clicked="save_Activated">
</Button>
<Image HorizontalOptions="CenterAndExpand" 
                 VerticalOptions="Center" 
                 BackgroundColor="Transparent"
                 Grid.Column="0" 
                 Grid.Row="0"
                 x:Name="imgViewer"/>

【讨论】:

以上是关于如何将 Forms.Image 中的最终照片保存到 xamarin 表单中的本地的主要内容,如果未能解决你的问题,请参考以下文章

如何将照片库中的图像保存到应用程序的文档文件夹

如何将相机/照片库中的图像保存到要在 UICollectionView 中显示的数组中

如何将图像保存到 iPhone 中的照片而不损失质量?

如何将一些图像作为一个图像保存到swift中的照片库?

iOS - 从设备中获取所有照片并将它们保存到应用程序

如何正确使用 Xamarin.Forms 的 Image Source 属性?