XAML in Xamarin.Forms 基礎篇 電子書

XAML in Xamarin.Forms 基礎篇 電子書
XAML in Xamarin.Forms 基礎篇 電子書

Xamarin.Forms 快速入門 電子書

Xamarin.Forms 快速入門 電子書
Xamarin.Forms 快速入門 電子書

2014/07/09

在 Windows 8.1 中,如何將 BitmapImage 的圖片內容透過 WriteableBitmap 寫入到磁碟檔案上

WriteableBitmap 是個很好用的程式庫,因為我們可以透過 WriteableBitmap 任意繪製與產生您所想要的圖片與內容,不過,要如何將 WriteableBitmap 的圖片內容,轉換成為圖片檔案呢(jpg, jpeg, png)?

在底下的程式碼,我們從 App Package 套件中的 Assets 目錄下,讀入一個圖片檔案,並且將這個圖片檔案設定到 BitmapImage 物件中,這是為了要知道這個圖片的長度與寬度。

接著,我們產生一個 WriteableBitmap 物件,在建構式中,我們傳入的 WriteableBitmap 所需要的寬度與高度,接著,將剛剛讀入的圖片檔案,使用 SetSourceAsync 設定到 WriteableBitmap 物件上,接著,我們就可以透過 SaveToFile 這個方法,把這個 WriteableBitmap 寫入到圖片檔案內。

            StorageFile storageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/Images/Pages/PageBackground.jpg"));
            IRandomAccessStream stream = await storageFile.OpenAsync(FileAccessMode.Read);
            BitmapImage bitmapImage = new BitmapImage();
            await bitmapImage.SetSourceAsync(stream);
            stream.Seek(0);

            var wb1 = new WriteableBitmap(bitmapImage.PixelWidth, bitmapImage.PixelHeight);
            await wb1.SetSourceAsync(stream);
            StorageFile sf1 = await ApplicationData.Current.LocalFolder.CreateFileAsync("your.png");
            await SaveToFile(wb1, sf1, BitmapEncoder.PngEncoderId);



        public async Task SaveToFile(WriteableBitmap writeableBitmap, IStorageFile outputFile, Guid encoderId)
        {
            try
            {
                Stream stream = writeableBitmap.PixelBuffer.AsStream();
                byte[] pixels = new byte[(uint)stream.Length];
                await stream.ReadAsync(pixels, 0, pixels.Length);

                using (var writeStream = await outputFile.OpenAsync(FileAccessMode.ReadWrite))
                {
                    var encoder = await BitmapEncoder.CreateAsync(encoderId, writeStream);
                    encoder.SetPixelData(
                        BitmapPixelFormat.Bgra8,
                        BitmapAlphaMode.Premultiplied,
                        (uint)writeableBitmap.PixelWidth,
                        (uint)writeableBitmap.PixelHeight,
                        96,
                        96,
                        pixels);
                    await encoder.FlushAsync();

                    using (var outputStream = writeStream.GetOutputStreamAt(0))
                    {
                        await outputStream.FlushAsync();
                    }
                }
            }
            catch (Exception ex)
            {
                string s = ex.ToString();
            }
        }




沒有留言:

張貼留言