как преобразовать StorageFile (изображение PNG) в прозрачное растровое изображение PNG в c#? - PullRequest
0 голосов
/ 06 августа 2020

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

теперь обо всем по порядку:

  • Я использую FileOpenPicker, чтобы выбрать файл хранилища.

Работа, которую я пробовал

public async void Button_AddSign_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            var _filePicker = new FileOpenPicker();
            _filePicker.SuggestedStartLocation = PickerLocationId.Desktop;
            _filePicker.ViewMode = PickerViewMode.Thumbnail;
            _filePicker.FileTypeFilter.Add(".png");
            IStorageFile _file = await _filePicker.PickSingleFileAsync();
            StorageFolder storageFolder = await ApplicationData.Current.LocalFolder.GetFolderAsync(CurrentUser);
            if (_file != null)
            {
                StorageFile storageFile = await _file.CopyAsync(storageFolder, "Signature.png");
                await MakeSignTransparentAsync(storageFile);
            }
         }
         catch{Exception ex}
     }



public static async Task MakeSignTransparentAsync(StorageFile Inputfile)
    {
        var memStream = new InMemoryRandomAccessStream();
        using (IRandomAccessStream fileStream = await Inputfile.OpenAsync(FileAccessMode.ReadWrite))
        {
            BitmapDecoder decoder = await BitmapDecoder.CreateAsync(fileStream);

            BitmapEncoder encoder = await BitmapEncoder.CreateForTranscodingAsync(memStream, decoder);

            encoder.BitmapTransform.ScaledWidth = 600;
            encoder.BitmapTransform.ScaledHeight = 200;

            await encoder.FlushAsync();

            memStream.Seek(0);
            fileStream.Seek(0);
            fileStream.Size = 0;
            await RandomAccessStream.CopyAsync(memStream, fileStream);

            memStream.Dispose();
        }



        Bitmap bmp;
        using (MemoryStream ms = new MemoryStream(memStream))  //Getting an error at this line
        {
            bmp = new Bitmap(ms);
        }
        bmp.MakeTransparent();
        bmp.Save(bmpInput.Path + "test.png", ImageFormat.Png);
    }

Ошибка: Аргумент 1: невозможно преобразовать из 'Windows. Storage.Streams.InMemoryRandomAccessStream 'to' byte []

Любая помощь приветствуется. Если есть другой способ, отличный от этого, это тоже приветствуется.

1 Ответ

0 голосов
/ 06 августа 2020

Нашел решение с помощью библиотеки ImageMagick

using ImageMagick;

public static async Task MakeSignTransparentAsync(StorageFile bmpInput)
    {
        using (var img = new MagickImage(bmpInput.Path))
        {
            // -fuzz XX%
            img.ColorFuzz = new Percentage(10);
            // -transparent white
            img.Transparent(MagickColors.White);
            img.Write(bmpInput.Path);
        }
     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...