如何从图库中 select 图像并保存到 xamarin 中的 sql 数据库

How to select image from gallery and save to sql database in xamarin

我使用 Xamarin Media Plugin 上传图片,我想将该图片保存在 Sqlite 中并从 Sqlite 中检索回来。我该怎么做?

存储:将Image位图转换为Base64String并存储到SQLite。

public static string Base64Encode(string plainText) {
  var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
  return System.Convert.ToBase64String(plainTextBytes);
}

检索:获取 Base64String 并再次将其转换为位图。

public static string Base64Decode(string base64EncodedData) {
  var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
  return System.Text.Encoding.UTF8.GetString(base64EncodedBytes);
}

以及如何从图库中 select 图像并保存到 xamarin 中的 sql 数据库 -- 如果像这样,我在哪里实现这些 Base64Encode?

using Plugin.Media;
using Plugin.Media.Abstractions;
using System;
using Xamarin.Forms;
using SQLite;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace PersonListData
{
    public class Person
    {   
        [PrimaryKey, AutoIncrement]
        public int IdSis { get; set; }
        public string NamePerson { get; set; }
        public byte[] PersonImg { get; set; }
    }
    
    async void SaveOnClik(object sender, EventArgs e)
    {
        var person = (Person)BindingContext;
        await App.Database.SavePersonAsync(person);
        await Navigation.PopAsync();
    }

    async void PickPhotos(object sender, EventArgs e)
    {
        if (CrossMedia.Current.IsPickPhotoSupported)
        {
            var file = await CrossMedia.Current.PickPhotoAsync(new Plugin.Media.Abstractions.PickMediaOptions
            {
                PhotoSize = PhotoSize.Medium,
            });
            if (file == null)
                return;

            image.Source = ImageSource.FromStream(() =>
            {
                var stream = file.GetStream();
                file.Dispose();
                return stream;
            });          
        }
        else
        {
            await DisplayAlert("Image error", ":( Hcant do thid.", "Ok");
            return;
        }

    }
    readonly SQLiteAsyncConnection _database;
    public DataPerson(string dbPath)
    {
        _database = new SQLiteAsyncConnection(dbPath);
        _database.CreateTableAsync<Person>().Wait();
    }
    public Task<List<Person>> GetPersonListAsync()
    {
        return _database.Table<Person>().ToListAsync();
    }
    public Task<Person> GetPersonAsync(int id)
    {
        return _database.Table<Person>()
        .Where(i => i.IdSis == id)
        .FirstOrDefaultAsync();
    }
    public Task<int> SavePersonAsync(Person person)
    {
        if (person.IdSis != 0)
        {
            return _database.UpdateAsync(person);
        }
        else
        {
            return _database.InsertAsync(person);
        }
    }
    public Task<int> DeletePersonAsync(Person person)
    {
        return _database.DeleteAsync(person);
    }
}

我对这个位置感到困惑

您可以尝试将图片路径保存到sqlite数据库中。

在模型中创建路径 属性。

 public class Person
{   
    [PrimaryKey, AutoIncrement]
    public int IdSis { get; set; }
    public string NamePerson { get; set; }
    public string Path{ get; set; }
    public byte[] PersonImg { get; set; }
}

然后将字符串存入数据库。

   public Task<int> SaveItemAsync(Person item)
    {
        if (item.ID != 0)
        {
            return Database.UpdateAsync(item);
        }
        else
        {
            return Database.InsertAsync(item);
        }
    }

您可以查看下面的 link 代码示例,了解如何将字符串保存到 sqlite 数据库中。 https://docs.microsoft.com/en-us/xamarin/xamarin-forms/data-cloud/data/databases

如果你还想把byte[]保存到sqlite数据库,你需要把stream转成byte[]。请检查有关如何将图像从流转换为字节的方式。

我不再考虑用base64保存照片

在 c#

using Plugin.Media;
....

async void GetPersonImage(object sender, EventArgs e)
    {
        if (!CrossMedia.Current.IsPickPhotoSupported)
        {
            await DisplayAlert("Foto tidak didukung", ":( Hak akses dibatasi.", "Oke deh ..");
            return;
        }
        var file = await Plugin.Media.CrossMedia.Current.PickPhotoAsync(new Plugin.Media.Abstractions.PickMediaOptions
        {
            PhotoSize = Plugin.Media.Abstractions.PhotoSize.Medium,
    
        });
    
        if (file == null)
            return;
    
        string path = file.Path;
        FtSiswa.Text = path; //this label hide
    
        await DisplayAlert("Foto disimpan di: ", file.Path, "OK");
    
        KameraFotos.Source = ImageSource.FromStream(() =>
        {
            var stream = file.GetStream();
            file.Dispose();
            return stream;
        });
    }

在xaml

.... <Image x:Name="KameraFotos" BackgroundColor="Bisque" Grid.Column="2" Grid.RowSpan="2" Aspect="AspectFit"> <Image.Source> <FileImageSource File="{Binding PersonImg}" /> </Image.Source> <TapGestureRecognizer Tapped="GetPersonImage" NumberOfTapsRequired="1" /> </Image.GestureRecognizers> </Image> ....

我觉得把图片保存在数据库中记录的路径和文件地址效率更高