сохранить изображение Использование средства выбора файлов в Windows Phone 8.1

Я добавляю студентов и сохраняю данные профиля в базе данных SQLite. Добавленные профили учащихся отображаются в виде списка, как показано ниже.

введите здесь описание изображения введите здесь описание изображения

Я хочу добавить изображение ученика с помощью средства выбора файлов и сохранить его. Как я могу этого добиться? Любое предложение или аналогичный пример будут более полезными.

Пока мои коды

   private string mruToken = null;   
    private NavigationHelper navigationHelper;
    public AddConatct()
    {
        this.InitializeComponent();
        this.navigationHelper = new NavigationHelper(this);
        this.Loaded += LoadSchoolToCombo;
        this.navigationHelper.LoadState += navigationHelper_LoadState;
        this.navigationHelper.SaveState += navigationHelper_SaveState;

    }
    private async void navigationHelper_LoadState(object sender, LoadStateEventArgs e)
    {

        if (e.PageState != null && e.PageState.ContainsKey("mruToken"))
        {
            object value = null;
            if (e.PageState.TryGetValue("mruToken", out value))
            {
                if (value != null)
                {
                    mruToken = value.ToString();

                    // Open the file via the token that you stored when adding this file into the MRU list.
                    Windows.Storage.StorageFile file =
                        await Windows.Storage.AccessCache.StorageApplicationPermissions.MostRecentlyUsedList.GetFileAsync(mruToken);

                    if (file != null)
                    {
                        // Open a stream for the selected file.
                        Windows.Storage.Streams.IRandomAccessStream fileStream =
                            await file.OpenAsync(Windows.Storage.FileAccessMode.Read);

                        // Set the image source to a bitmap.
                        Windows.UI.Xaml.Media.Imaging.BitmapImage bitmapImage =
                            new Windows.UI.Xaml.Media.Imaging.BitmapImage();

                        bitmapImage.SetSource(fileStream);
                        img.Source = bitmapImage;

                        // Set the data context for the page.
                        this.DataContext = file;
                    }
                }
            }
        }
    }
    private void navigationHelper_SaveState(object sender, SaveStateEventArgs e)
    {
        if (!string.IsNullOrEmpty(mruToken))
        {
            e.PageState["mruToken"] = mruToken;
        }

    }


   private async void PickPhoto_Click(object sender, RoutedEventArgs e){
        Windows.Storage.Pickers.FileOpenPicker openPicker = new Windows.Storage.Pickers.FileOpenPicker();
        openPicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.PicturesLibrary;
        openPicker.ViewMode = Windows.Storage.Pickers.PickerViewMode.Thumbnail;

        // Filter to include a sample subset of file types.
        openPicker.FileTypeFilter.Clear();
        openPicker.FileTypeFilter.Add(".bmp");
        openPicker.FileTypeFilter.Add(".png");
        openPicker.FileTypeFilter.Add(".jpeg");
        openPicker.FileTypeFilter.Add(".jpg");

        // Open the file picker.
        Windows.Storage.StorageFile file = await openPicker.PickSingleFileAsync();

        // file is null if user cancels the file picker.
        if (file != null)
        {
            // Open a stream for the selected file.
            Windows.Storage.Streams.IRandomAccessStream fileStream =
                await file.OpenAsync(Windows.Storage.FileAccessMode.Read);

            // Set the image source to the selected bitmap.
            Windows.UI.Xaml.Media.Imaging.BitmapImage bitmapImage =
                new Windows.UI.Xaml.Media.Imaging.BitmapImage();

            bitmapImage.SetSource(fileStream);
            img.Source = bitmapImage;
            this.DataContext = file;

            // Add picked file to MostRecentlyUsedList.
            mruToken = Windows.Storage.AccessCache.StorageApplicationPermissions.MostRecentlyUsedList.Add(file);
        }
    }

    private async void AddContact_Click(object sender, RoutedEventArgs e)
    {
        DatabaseHelperClass Db_Helper = new DatabaseHelperClass();//Creating object for DatabaseHelperClass.cs from ViewModel/DatabaseHelperClass.cs 
        if (NametxtBx.Text != "" & AgetxtBx.Text != "" & AddresstxtBx.Text != "" & SchoolComboBx.SelectedValue.ToString() != "" & GardienttxtBx.Text != "" & PhonetxtBx.Text != "" & LattxtBx.Text != "" & LongtxtBx.Text != "")
        {
            Db_Helper.Insert(new Contacts(NametxtBx.Text, AgetxtBx.Text, AddresstxtBx.Text, SchoolComboBx.SelectedValue.ToString(), GardienttxtBx.Text, PhonetxtBx.Text, LattxtBx.Text, LongtxtBx.Text));
            Frame.Navigate(typeof(ReadContactList));//after add contact redirect to contact listbox page 
        }
        else
        {
            MessageDialog messageDialog = new MessageDialog("Please fill all fields");//Text should not be empty 
            await messageDialog.ShowAsync();
        }
    }

Контакты.cs

public class Contacts
{
    //The Id property is marked as the Primary Key
    [SQLite.PrimaryKey, SQLite.AutoIncrement]
    public int Id { get; set; }
    public string Name { get; set; }
    public string Age { get; set; }
    public string Address { get; set; }
    public string School { get; set; }
    public string Gardient { get; set; }
    public string PhoneNumber { get; set; }
    public string Latitude { get; set; }
    public string Longitude { get; set; }
    public string CreationDate { get; set; }
    public Contacts()
    {
        //empty constructor
    }
    public Contacts( string name, string age, string address, string school, string gardient, string phone_no, string latitude, string longitude)
    {

        Name = name;
        Age = age;
        Address = address;
        School = school;
        Gardient = gardient;
        PhoneNumber = phone_no;
        Latitude = latitude;
        Longitude = longitude;
        CreationDate = DateTime.Now.ToString();
    }
}

person Thilina Akalanka    schedule 01.01.2016    source источник


Ответы (1)


Это не очень хорошая идея. Вы должны сохранять файлы в локальной папке и сохранять путь к базе данных. В этом подходе

Вам нужно сохранить изображения в локальной папке по имени пользователя или любому другому уникальному атрибуту, как вам нравится. Я сделал это так. Сначала выберите файл

private void choose_galary_pic_tapped(object sender, TappedRoutedEventArgs e)
    {
        try
        {
            FileOpenPicker openPicker = new FileOpenPicker();
            openPicker.ViewMode = PickerViewMode.Thumbnail;
            openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
            openPicker.FileTypeFilter.Add(".jpg");
            openPicker.FileTypeFilter.Add(".jpeg");
            openPicker.FileTypeFilter.Add(".png");
            openPicker.PickSingleFileAndContinue();
        }
        catch { }
    }

а теперь для сохранения файла

public async void ContinueFileOpenPicker(FileOpenPickerContinuationEventArgs args)
    {
        try
        {
            if (args.Files.Count > 0)
            {
                StorageFile sf = args.Files[0];
                await sf.CopyAsync(ApplicationData.Current.LocalFolder, args.Files[0].Name, NameCollisionOption.ReplaceExisting);
                System.Diagnostics.Debug.WriteLine(sf.Name);
                ApplicationData.Current.LocalSettings.Values["GImage"] = sf.Name;
                var stream = await args.Files[0].OpenAsync(Windows.Storage.FileAccessMode.Read);
                await bitmapImage.SetSourceAsync(stream);
                userImage.Source = bitmapImage;      
            }
            else
            {

            }
        }
        catch { }
    }

или если вы хотите напрямую сохранять изображения, то Base-64 — лучший метод кодирования для хранения изображений в SQLite. Попробуйте приведенный ниже код. Один метод даст вам строку StorageFile в кодировке base-64, а другой вернет вам объект BitmapImage, который можно установить как источник <Image />.

private async Task<BitmapImage> Base64StringToBitmap(string source)
{
    var ims = new InMemoryRandomAccessStream();
    var bytes = Convert.FromBase64String(source);
    var dataWriter = new DataWriter(ims);
    dataWriter.WriteBytes(bytes);
    await dataWriter.StoreAsync();
    ims.Seek(0);
    var img = new BitmapImage();
    img.SetSource(ims);
    return img;
}

private async Task<string> ConvertStorageFileToBase64String(StorageFile imageFile)
{
var stream = await imageFile.OpenReadAsync();

using (var dataReader = new DataReader(stream))
{
    var bytes = new byte[stream.Size];
    await dataReader.LoadAsync((uint)stream.Size);
    dataReader.ReadBytes(bytes);

    return Convert.ToBase64String(bytes);
}

}

Надеюсь, поможет.

person Rohit    schedule 04.01.2016
comment
Как в ContinueFileOpenPicker сохранить изображение. Если это лучший способ сохранить путь, как это сделать? Помоги мне - person Thilina Akalanka; 05.01.2016
comment
Здесь метод continueFileOpenPicker сохраняет изображение в локальной папке с помощью метода CopyAsync. Если вы хотите, чтобы он сохранялся в базе данных, получите свойство Path файла и сохраните его в базе данных. - person Rohit; 06.01.2016
comment
Мне удалось сохранить изображение как строку base64 и вернуть его обратно как изображение с помощью вашего кода. Теперь у меня возникли проблемы с отображением изображения в представлении списка, когда я открыл другой вопрос (stackoverflow.com/questions/34637185/). Я очень ценю, если вы можете помочь и в этом. - person Thilina Akalanka; 06.01.2016