Arhn - архитектура программирования

Получить источник изображения из изображения после загрузки

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

Ниже находится xaml для изображения и кнопка, которую пользователь нажимает, чтобы загрузить изображение.

                <Button Text="Pick a Profile Image"
                        Clicked="OnPictureButton_Clicked"
                        Grid.Column="0"></Button>
                <Image Source="{Binding Employee.ProfilePicture}"
                        Grid.Column="1"
                        x:Name="profilePicture"
                        Grid.RowSpan="2"
                        WidthRequest="200"></Image>

Вот соответствующий код C #:

    private async void OnPictureButton_Clicked(object sender, EventArgs e)
    {
        (sender as Button).IsEnabled = false;

        // _stream is a private global variable
        // Allow the user to view images on the phone
        _stream = await DependencyService.Get<IPhotoPickerService>().GetImageStreamASync();

        // If they select an image, set it as the source for profilePicture
        if (_stream != null)
        {
            profilePicture.Source = ImageSource.FromStream(() => _stream);
        }

        (sender as Button).IsEnabled = true;

    }

    private async void Clicked_EmployeeSaved(object sender, EventArgs e)
    {
        var data = (EmployeeFull)BindingContext;
        var uploadedPicture = profilePicture.Source;    // Should be uploaded image

        // Testing how to get the source for the image (Can disregard for question)
        Bitmap bitmap = BitmapFactory.DecodeStream(_stream);
        MemoryStream ms = new MemoryStream();

        bitmap.Compress(Bitmap.CompressFormat.Jpeg, 100, ms);

        byte[] byteArray;

        byteArray = ms.ToArray();

    }

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

Однако я не могу получить имя изображения, которое я выбрал для загрузки. На экране пользователь может видеть это изображение, поскольку я установил выбранное изображение в качестве источника для тега profilePicture, но когда я пытаюсь получить этот источник, когда пользователь нажимает кнопку «сохранить», он показывает объект ImageSource`, а не строка, которую я ожидал.

Есть ли другой способ получить имя загруженного изображения?


  • вам необходимо сохранить ссылку на выбранное изображение, когда пользователь выберет его, и повторно использовать эту ссылку позже. 24.10.2019
  • @ Джейсон Я это видел. Так что сохраните ссылку на memoryStream и получите доступ к ней во втором методе, таком как MemoryStream ms = new MemoryStream(); `_stream.CopyTo (ms);`? 24.10.2019
  • или сохранить байт [] из потока в памяти. Или записать в файл. 24.10.2019
  • @Jason А как мне получить значение во второй функции? 24.10.2019
  • использовать переменную уровня класса 24.10.2019
  • Попробуйте использовать какой-нибудь шаблон, например MVVM, вместо того, чтобы делать все в коде программной части. Рано или поздно это станет проблемой или будет сложно поддерживать / вносить изменения. 24.10.2019
  • Вы имеете в виду, что хотите получить путь к изображению? 25.10.2019
  • @ LeoZhu-MSFT По сути, да. Я могу предварительно просмотреть изображение, но хочу сохранить его в базе данных. Для этого мне нужно имя изображения, однако я не могу получить его в коде после закрытия потока. 25.10.2019
  • @JamesS, если вы хотите получить имя файла из потока источника изображения, извините, что вы не можете этого сделать, Stream - это объект, который содержит загрузку байтов в памяти. Он не хранит место происхождения этих байтов. Данные внутри Stream могли быть получены из файла, веб-страницы или любого другого источника. 29.10.2019

Ответы:


1

Если вы уверены, что ImageSource является потоком, вы можете использовать приведение ImageSource к StreamImageSource, а затем получить из него поток.

Пример:

var imageStreamSource = (StreamImageSource)profilePicture.Source;
Stream actualStream = await imageStreamSource.Stream(new CancellationToken());
24.10.2019
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..