UWP App: загрузка изображений из папки в галерею без блокировки файлов в .Net Core - PullRequest
0 голосов
/ 07 декабря 2018

В настоящее время я работаю над проектом по созданию приложения UWP на основе .Net Core.

. Для описания моей проблемы:

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

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

Так что я попробовал какой-то код из сети, но проблема в том, что большая часть кода не предназначена для .Net Core.Я попытался использовать System.Drawing.Common и Converter для загрузки изображения, используя BitmapImage, потому что это решение широко распространено, но я получил только библиотеку Windows.UI.Xaml.Media.Imaging, и это не то, что нужно.

Из базового кода у меня есть только URI.Так что это мой xaml

<Image MaxWidth="270" MaxHeight="180" Stretch="Uniform" Margin="5,5,5,15" 
   Tapped="Image_SelectedImage_Tapped">
         <Image.Source>
              <BitmapImage UriSource="{x:Bind ImageUri,Converter={StaticResource ImageConverter}, Mode=OneWay}"DecodePixelWidth="270" DecodePixelType="Logical"/>
         </Image.Source>
</Image>

И ImageConverter, который я пытаюсь использовать:

class ImageConverter :IValueConverter
    {

        public object Convert(object value, Type targetType, object parameter, string language)
        {
            //load the image here, close it and return it
        }

        public object ConvertBack(object value, Type targetType, object parameter, string language)
        {
            throw new NotImplementedException();
        }
    }

ImageConverter сейчас пуст, потому что до сих пор не найдено ни одного найденного решения.В данный момент я пытаюсь использовать библиотеку SixLabors ImageSharp для загрузки образа, но у меня тоже не получается.

Кто-нибудь боролся с подобной проблемой и нашел решение специально для .Net Core?Есть ли возможность загрузить изображение из потока и передать его в xaml?

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

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

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Итак, наконец, я решил проблему с помощью библиотеки SkiaSharp.Мой конвертер возвращает изображение, загруженное через Filestream как WriteableBitmap.С помощью этого решения изображение отображается, но я все еще могу удалить или отредактировать исходный файл в папке.

Вот конвертер:

public object Convert(object value, Type targetType, object parameter, string language)
    {
        string imageFolderPath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "Images");
        var path = (Uri)value;

        SKBitmap map;
        using (FileStream stream = new FileStream(imageFolderPath + "\\" + path.Segments[3],
            System.IO.FileMode.Open, FileAccess.Read))
        {
            map = SKBitmap.Decode(stream);

        }
        return map.ToWriteableBitmap();
    }

А вот привязка xaml:

<Image Source="{x:Bind ImageUri,Converter={StaticResource ImageConverter}}" MaxWidth="270" MaxHeight="180" Stretch="Uniform" Margin="5,5,5,15" 
                               Tapped="Image_SelectedImage_Tapped">
 </Image>

Я не знаю, правильно ли это или даже хорошая практика, но это работает.

В любом случае, спасибо за ваши ответы и потраченное время:)

0 голосов
/ 07 декабря 2018

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

Пример экспортированного изображения

MainPage.Xaml

<Page
    x:Class="App1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:App1"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    x:Name="YourPage"

    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Grid   HorizontalAlignment="Stretch" Background="Aqua" VerticalAlignment="Stretch">
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>

        </Grid.RowDefinitions>
        <Grid x:Name="outputGrid">
        <Image Source="ms-appx:///Assets/1.jpg"></Image>
        <InkCanvas x:Name="inkCanvas"  HorizontalAlignment="Stretch"  VerticalAlignment="Stretch" />
        </Grid>
        <Button Content="Save" Grid.Row="1" Click="Button_Click"></Button>
    </Grid>
</Page>

MainPage.xaml.cs

 public sealed partial class MainPage : Page
    {

        public MainPage() { this.InitializeComponent();
            inkCanvas.InkPresenter.InputDeviceTypes =
              Windows.UI.Core.CoreInputDeviceTypes.Mouse |
              Windows.UI.Core.CoreInputDeviceTypes.Touch |
              Windows.UI.Core.CoreInputDeviceTypes.Pen;
        }

        private async void Button_Click(object sender, RoutedEventArgs e)
        {
            RenderTargetBitmap rtb = new RenderTargetBitmap();
            await rtb.RenderAsync(outputGrid);

            var pixelBuffer = await rtb.GetPixelsAsync();
            var pixels = pixelBuffer.ToArray();
            var displayInformation = DisplayInformation.GetForCurrentView();
            FileSavePicker savePicker = new FileSavePicker();
            savePicker.FileTypeChoices.Add("Jpeg", new List<string>() { ".jpg" });
            savePicker.SuggestedFileName = "chart";
            StorageFile file = await savePicker.PickSaveFileAsync();
            if (file != null)
            {
                using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite))
                {
                    var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream);
                    encoder.SetPixelData(BitmapPixelFormat.Bgra8,
                                         BitmapAlphaMode.Premultiplied,
                                         (uint)rtb.PixelWidth,
                                         (uint)rtb.PixelHeight,
                                         displayInformation.RawDpiX,
                                         displayInformation.RawDpiY,
                                         pixels);
                    await encoder.FlushAsync();
                }
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...