本文共 5105 字,大约阅读时间需要 17 分钟。
Metro style app
一.图片Scale ,Crop操作
public class PhotoEdit { public async static Task<WriteableBitmap> ScaleAndCorpPhoto(IStorageFile file) { if (file == null ) return null ; // create a stream from the file and decode the image var fileStream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read); BitmapDecoder decoder = await BitmapDecoder.CreateAsync(fileStream); BitmapTransform transform = new BitmapTransform(); BitmapBounds bounds = new BitmapBounds(); transform.ScaledWidth = 500; transform.ScaledHeight = 500; const int croppedHeight = 400; const int croppedWidth = 400; bounds.Height = croppedHeight; bounds.Width = croppedWidth; bounds.X = 0; bounds.Y = 0; transform.Bounds = bounds; // Get the pixels in Bgra8 to match what the WriteableBitmap will expect PixelDataProvider pixelData = await decoder.GetPixelDataAsync(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, transform, ExifOrientationMode.RespectExifOrientation, ColorManagementMode.ColorManageToSRgb); byte [] pixels = pixelData.DetachPixelData(); // And stream them into a WriteableBitmap WriteableBitmap cropBmp = new WriteableBitmap(croppedHeight, croppedWidth); Stream pixStream = cropBmp.PixelBuffer.AsStream(); pixStream.Write(pixels, 0, pixels.Length); return cropBmp; } } |
调用方法
private async System.Threading.Tasks.Task ScaleAndCorpPhoto() { FileOpenPicker fileOpenPicker = new FileOpenPicker(); fileOpenPicker.CommitButtonText = "打开" ; fileOpenPicker.FileTypeFilter.Insert(0, ".jpg" ); StorageFile file = await fileOpenPicker.PickSingleFileAsync(); if (file == null ) return ; image.Source = await PhotoEdit.ScaleAndCorpPhoto(file); } |
二、图片的打开与保存
1.图片的打开. 选择要显示的图片,最后将图片显示在Image控件中.
private static BitmapImage srcImage = new BitmapImage(); private static WriteableBitmap wbsrcImage; public async static void OpenImage(Image ImageOne) { FileOpenPicker imagePicker = new FileOpenPicker { ViewMode = PickerViewMode.Thumbnail, SuggestedStartLocation = PickerLocationId.PicturesLibrary, FileTypeFilter = { ".jpg" , ".jpeg" , ".png" , ".bmp" } }; Guid decoderId; StorageFile imageFile = await imagePicker.PickSingleFileAsync(); if (imageFile != null ) { srcImage = new BitmapImage(); using (IRandomAccessStream stream = await imageFile.OpenAsync(FileAccessMode.Read)) { srcImage.SetSource(stream); switch (imageFile.FileType.ToLower()) { case ".jpg" : case ".jpeg" : decoderId = Windows.Graphics.Imaging.BitmapDecoder.JpegDecoderId; break ; case ".bmp" : decoderId = Windows.Graphics.Imaging.BitmapDecoder.BmpDecoderId; break ; case ".png" : decoderId = Windows.Graphics.Imaging.BitmapDecoder.PngDecoderId; break ; default : return ; } Windows.Graphics.Imaging.BitmapDecoder decoder = await Windows.Graphics.Imaging.BitmapDecoder.CreateAsync(decoderId, stream); int width = ( int )decoder.PixelWidth; int height = ( int )decoder.PixelHeight; Windows.Graphics.Imaging.PixelDataProvider dataprovider = await decoder.GetPixelDataAsync(); byte [] pixels = dataprovider.DetachPixelData(); wbsrcImage = new WriteableBitmap(width, height); Stream pixelStream = wbsrcImage.PixelBuffer.AsStream(); //rgba in original //to display ,convert tobgra 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); pixelStream.Dispose(); stream.Dispose(); } ImageOne.Source = wbsrcImage; ImageOne.Width = wbsrcImage.PixelWidth; ImageOne.Height = wbsrcImage.PixelHeight; } } |
2.图片的保存. 将获得的WriteableBitmap保存起来. 比如你可以将Scale和Crop的图片保存起来.
public async static Task SaveImage(WriteableBitmap src) { FileSavePicker save = new FileSavePicker(); save.SuggestedStartLocation = PickerLocationId.PicturesLibrary; save.DefaultFileExtension = ".jpg" ; save.SuggestedFileName = "newimage" ; 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 { 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 = src.PixelBuffer.AsStream(); byte [] pixels = new byte [pixelStream.Length]; pixelStream.Read(pixels, 0, pixels.Length); //pixal format shouldconvert to rgba8 for ( int i = 0; i < pixels.Length; i += 4) { byte temp = pixels[i]; pixels[i] = pixels[i + 2]; pixels[i + 2] = temp; } encoder.SetPixelData( BitmapPixelFormat.Rgba8, BitmapAlphaMode.Straight, ( uint )src.PixelWidth, ( uint )src.PixelHeight, 96, // Horizontal DPI 96, // Vertical DPI pixels ); await encoder.FlushAsync(); } catch (Exception e) { throw e; } } |
本文转自Work Hard Work Smart博客园博客,原文链接:http://www.cnblogs.com/linlf03/archive/2012/11/28/2792726.html,如需转载请自行联系原作者