WriteableBitmap

private WriteableBitmap _bitmap;  
  
        private async void On_Open(object sender, RoutedEventArgs e)  
        {  
            var open = new FileOpenPicker()  
            {  
                SuggestedStartLocation = PickerLocationId.PicturesLibrary,  
                ViewMode = PickerViewMode.Thumbnail,  
                FileTypeFilter = { ".bmp", ".png", ".jpeg", ".jpg" }  
            };  
  
  
            // Open a stream for the selected file   
            StorageFile file = await open.PickSingleFileAsync();  
  
            IRandomAccessStream fileStream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read);  
  
            Guid decoderId;  
            switch (file.FileType.ToLower())  
            {  
                case ".jpg":  
                case ".jpeg":  
                    decoderId = BitmapDecoder.JpegDecoderId;  
                    break;  
                case ".bmp":  
                    decoderId = BitmapDecoder.BmpDecoderId;  
                    break;  
                case ".png":  
                    decoderId = BitmapDecoder.PngDecoderId;  
                    break;  
                default:  
                    return;  
  
            }  
            BitmapDecoder decoder = await BitmapDecoder.CreateAsync(decoderId, fileStream);  
  
            int width = (int)decoder.PixelWidth;  
            int height = (int)decoder.PixelHeight;  
              
            PixelDataProvider dataprovider = await decoder.GetPixelDataAsync();  
  
            byte[] pixels = dataprovider.DetachPixelData();  
  
            _bitmap = new WriteableBitmap(width, height);  
            Stream pixelStream = _bitmap.PixelBuffer.AsStream();  
            //rgba in original   
            //to display ,convert to bgra   
            for (int i = 0; i < pixels.Length; i += 4)  
            {  
                byte temp = pixels[i];  
                pixels[i] = pixels[i + 2];  
                pixels[i + 2] = temp;  
            }  
            pixelStream.Write(pixels, 0, pixels.Length);  
              
            this.Image.Source = _bitmap; 
}
private async void On_Save(object sender, RoutedEventArgs e) { FileSavePicker save = new FileSavePicker(); save.SuggestedStartLocation = PickerLocationId.PicturesLibrary; save.DefaultFileExtension = ".jpg"; save.SuggestedFileName = "new image"; save.FileTypeChoices.Add(".bmp", new List<string>() { ".bmp" }); save.FileTypeChoices.Add(".png", new List<string>() { ".png" }); save.FileTypeChoices.Add(".jpg", new List<string>() { ".jpg", ".jpeg" }); StorageFile savedItem = await save.PickSaveFileAsync(); try { // Application now has read/write access to the saved file Guid encoderId; switch (savedItem.FileType.ToLower()) { case ".jpg": encoderId = BitmapEncoder.JpegEncoderId; break; case ".bmp": encoderId = BitmapEncoder.BmpEncoderId; break; case ".png": default: encoderId = BitmapEncoder.PngEncoderId; break; } IRandomAccessStream fileStream = await savedItem.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite); BitmapEncoder encoder = await BitmapEncoder.CreateAsync(encoderId, fileStream); Stream pixelStream = _bitmap.PixelBuffer.AsStream(); byte[] pixels = new byte[pixelStream.Length]; pixelStream.Read(pixels, 0, pixels.Length); //pixal format should convert to rgba8 encoder.SetPixelData( BitmapPixelFormat.Rgba8, BitmapAlphaMode.Straight, (uint)_bitmap.PixelWidth, (uint)_bitmap.PixelHeight, 96, // Horizontal DPI 96, // Vertical DPI pixels ); await encoder.FlushAsync(); } catch(Exception e1) { } }

 

posted @ 2012-05-23 16:46  无尽空虚  阅读(424)  评论(0)    收藏  举报