1 using System; 2 using System.Threading.Tasks; 3 using System.Runtime.InteropServices.WindowsRuntime; 4 using Windows.Graphics.Imaging; 5 using Windows.UI.Xaml.Media.Imaging; 6 using Windows.Storage; 7 using Windows.Storage.Pickers; 8 using Windows.Storage.Streams; 9 using System.IO; 10 using Windows.Foundation; 11 using System.Collections.Generic; 12 13 namespace Common 14 { 15 public class ImageHelper 16 { 17 public const int THumbLength = 400; 18 public static Size MinSizeSupported = new Size(200, 200); 19 public static Size MaxSizeSupported = new Size(4000, 3000); 20 21 static Guid EncoderIDFromFileExtension(string strExtension) 22 { 23 Guid encoderId; 24 switch (strExtension.ToLower()) 25 { 26 case ".jpg": 27 case ".jpeg": 28 encoderId = BitmapEncoder.JpegEncoderId; 29 break; 30 case ".bmp": 31 encoderId = BitmapEncoder.BmpEncoderId; 32 break; 33 case ".png": 34 default: 35 encoderId = BitmapEncoder.PngEncoderId; 36 break; 37 } 38 return encoderId; 39 } 40 static Guid DecoderIDFromFileExtension(string strExtension) 41 { 42 Guid encoderId; 43 switch (strExtension.ToLower()) 44 { 45 case ".jpg": 46 case ".jpeg": 47 encoderId = BitmapDecoder.JpegDecoderId; 48 break; 49 case ".bmp": 50 encoderId = BitmapDecoder.BmpDecoderId; 51 break; 52 case ".png": 53 default: 54 encoderId = BitmapDecoder.PngDecoderId; 55 break; 56 } 57 return encoderId; 58 } 59 60 public async static Task<WriteableBitmap> ReadBitmap(IRandomAccessStream fileStream, string type) 61 { 62 WriteableBitmap bitmap = null; 63 try 64 { 65 Guid decoderId = DecoderIDFromFileExtension(type); 66 67 BitmapDecoder decoder = await BitmapDecoder.CreateAsync(decoderId, fileStream); 68 BitmapTransform tf = new BitmapTransform(); 69 70 uint width = decoder.OrientedPixelWidth; 71 uint height = decoder.OrientedPixelHeight; 72 double dScale = 1; 73 74 if (decoder.OrientedPixelWidth > MaxSizeSupported.Width || decoder.OrientedPixelHeight > MaxSizeSupported.Height) 75 { 76 dScale = Math.Min(MaxSizeSupported.Width / decoder.OrientedPixelWidth, MaxSizeSupported.Height/decoder.OrientedPixelHeight ); 77 width =(uint)( decoder.OrientedPixelWidth * dScale); 78 height = (uint)(decoder.OrientedPixelHeight * dScale); 79 80 tf.ScaledWidth = (uint)(decoder.PixelWidth* dScale); 81 tf.ScaledHeight = (uint)(decoder.PixelHeight* dScale); 82 } 83 84 85 bitmap = new WriteableBitmap((int)width, (int)height); 86 87 88 89 PixelDataProvider dataprovider = await decoder.GetPixelDataAsync(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, tf, 90 ExifOrientationMode.RespectExifOrientation, ColorManagementMode.DoNotColorManage); 91 byte[] pixels = dataprovider.DetachPixelData(); 92 93 Stream pixelStream2 = bitmap.PixelBuffer.AsStream(); 94 95 pixelStream2.Write(pixels, 0, pixels.Length); 96 //bitmap.SetSource(fileStream); 97 } 98 catch 99 { 100 } 101 102 return bitmap; 103 } 104 105 public async static Task<WriteableBitmap> ReadBitmap(StorageFile file) 106 { 107 IRandomAccessStream stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read); 108 WriteableBitmap bitmap = await ReadBitmap(stream, file.FileType.ToLower()); 109 110 return bitmap; 111 } 112 113 114 public async static Task<bool> SaveBitmap(IRandomAccessStream stream, Guid encoderId, WriteableBitmap bitmap, BitmapTransform bitmapTransform) 115 { 116 bool bSuccess = true; 117 try 118 { 119 Stream pixelStream = bitmap.PixelBuffer.AsStream(); 120 121 BitmapEncoder encoder = await BitmapEncoder.CreateAsync(encoderId, stream); 122 if (bitmapTransform != null) 123 { 124 encoder.BitmapTransform.ScaledWidth = bitmapTransform.ScaledWidth; 125 encoder.BitmapTransform.ScaledHeight = bitmapTransform.ScaledHeight; 126 encoder.BitmapTransform.InterpolationMode = BitmapInterpolationMode.Fant; 127 encoder.BitmapTransform.Bounds = bitmapTransform.Bounds; 128 } 129 130 byte[] pixels = new byte[pixelStream.Length]; 131 132 pixelStream.Read(pixels, 0, pixels.Length); 133 134 encoder.SetPixelData( 135 BitmapPixelFormat.Bgra8, 136 BitmapAlphaMode.Straight, 137 (uint)bitmap.PixelWidth, 138 (uint)bitmap.PixelHeight, 139 96, // Horizontal DPI 140 96, // Vertical DPI 141 pixels 142 ); 143 await encoder.FlushAsync(); 144 145 pixelStream.Dispose(); 146 } 147 catch 148 { 149 bSuccess = false; 150 } 151 152 return bSuccess; 153 } 154 155 async static Task<bool> SaveBitmap(StorageFile file, WriteableBitmap bitmap, BitmapTransform bitmapTransform) 156 { 157 bool bSuccess = true; 158 try 159 { 160 // Application now has read/write access to the saved file 161 Guid encoderId = EncoderIDFromFileExtension(file.FileType); 162 163 164 IRandomAccessStream fileStream = await file.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite); 165 166 bSuccess = await SaveBitmap(fileStream, encoderId,bitmap,bitmapTransform); 167 168 fileStream.Dispose(); 169 170 } 171 catch 172 { 173 bSuccess = false; 174 } 175 176 return bSuccess; 177 } 178 179 public async static Task<bool> SaveBitmap(StorageFile file, WriteableBitmap bitmap) 180 { 181 bool bSuccess = await SaveBitmap(file, bitmap, null); 182 return bSuccess; 183 } 184 185 public async static Task<bool> SaveBitmapWithFilePicker(WriteableBitmap bitmap) 186 { 187 FileSavePicker save = new FileSavePicker(); 188 save.SuggestedStartLocation = PickerLocationId.PicturesLibrary; 189 save.DefaultFileExtension = ".jpg"; 190 save.SuggestedFileName = "new image"; 191 save.FileTypeChoices.Add(".bmp", new List<string>() { ".bmp" }); 192 save.FileTypeChoices.Add(".png", new List<string>() { ".png" }); 193 save.FileTypeChoices.Add(".jpg", new List<string>() { ".jpg", ".jpeg" }); 194 195 StorageFile savedItem = await save.PickSaveFileAsync(); 196 if (savedItem == null) 197 { 198 return false; 199 } 200 201 return await SaveBitmap(savedItem, bitmap); 202 } 203 204 public async static Task<bool> SaveBitmapAsThumb(StorageFile file, WriteableBitmap bitmap, double width, double height) 205 { 206 BitmapTransform transform = new BitmapTransform(); 207 208 double ratio = Math.Min(width / bitmap.PixelWidth, height / bitmap.PixelHeight); 209 210 transform.ScaledWidth = (uint)(bitmap.PixelWidth * ratio); 211 transform.ScaledHeight = (uint)(bitmap.PixelHeight * ratio); 212 transform.InterpolationMode = BitmapInterpolationMode.Fant; 213 214 return await SaveBitmap(file, bitmap, transform); 215 } 216 public async static Task<bool> SaveBitmapAsThumb(StorageFile file, WriteableBitmap bitmap, Windows.Foundation.Rect cropRect) 217 { 218 BitmapTransform transform = new BitmapTransform(); 219 220 221 double ratio =THumbLength/ Math.Max(cropRect.Width, cropRect.Height ); 222 223 transform.ScaledWidth = (uint)(bitmap.PixelWidth * ratio); 224 transform.ScaledHeight = (uint)(bitmap.PixelHeight * ratio); 225 transform.Bounds = new BitmapBounds() 226 { 227 X = (uint)(cropRect.X * ratio), 228 Y = (uint)(cropRect.Y * ratio), 229 Width = (uint)(cropRect.Width * ratio), 230 Height = (uint)(cropRect.Height * ratio) 231 }; 232 transform.InterpolationMode = BitmapInterpolationMode.Fant; 233 234 return await SaveBitmap(file, bitmap, transform); 235 } 236 } 237 }