如何在c#中将StorageFile(png图像)转换为透明的PNG位图? [英] how to convert StorageFile (png image) to transparent PNG Bitmap in c#?

查看:213
本文介绍了如何在c#中将StorageFile(png图像)转换为透明的PNG位图?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在制作一个UWP应用,我想在其中选择用户扫描的用户签名并使图片透明.

I am making a UWP app where i want to pick a user signature scanned by the user and make the picture transparent.

现在首先要注意的是:

  • 我正在使用FileOpenPicker来选择存储文件.
  • I am using FileOpenPicker to pick the storage file.
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"转换为"byte []

Error: Argument 1: cannot convert from 'Windows.Storage.Streams.InMemoryRandomAccessStream' to 'byte[]

感谢您的帮助. 如果还有其他解决方法,那么也请谅解.

Any help is appreciated. If there is another way around other than this that is also appreciated.

推荐答案

使用库 ImageMagick

找到了解决方案

Found a solution using a library 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);
        }
     }

这篇关于如何在c#中将StorageFile(png图像)转换为透明的PNG位图?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆