Cómo redimensionar una imagen en Universal Apps

Cómo redimensionar una imagen en Universal Apps
ResizeImagesWinRT

Hoy vamos a ver un pequeño tip de cómo redimensionar una imagen en Universal App. Muchas veces, cuando estamos creando una App que debe subir una imagen a la nube no queremos que se ponga a subir una imagen hecha con el Lumia 1020 de 41MP. Es conveniente, para tu salud y bolsillo, que redimensiones la imagen a las dimensiones que tu App está soportando.

Para ello, os traigo un snippet bastante handy que podéis utilizarlo de aquí en adelante. Se trata básicamente de coger una foto en formato StorageFile, redimensionarla y devolverla en formato byte[] para poder subirla al servidor mediante HttpMultipartFormDataContent añadiendo la imagen como un HttpBufferContent. Aquí el snippet:

public static async Task<byte[]> ResizeImage(StorageFile inputPhoto, int height, int width) { byte[] res; if (inputPhoto == null) { return null; } // create a stream from the file and decode the image var fileStream = await inputPhoto.OpenAsync(Windows.Storage.FileAccessMode.Read); BitmapDecoder decoder = await BitmapDecoder.CreateAsync(fileStream); uint sourceWidth = decoder.PixelWidth; uint sourceHeight = decoder.PixelHeight; double heightWidthFactor = 0; // create a new stream and encoder for the new image InMemoryRandomAccessStream ras = new InMemoryRandomAccessStream(); BitmapEncoder enc = await BitmapEncoder.CreateForTranscodingAsync(ras, decoder); // convert the entire bitmap to a new resized bitmap if (sourceWidth >= sourceHeight) { heightWidthFactor = Convert.ToDouble(sourceWidth) / Convert.ToDouble(sourceHeight); enc.BitmapTransform.ScaledHeight = Convert.ToUInt32(Math.Round(height / heightWidthFactor)); enc.BitmapTransform.ScaledWidth = (uint)width; } else { heightWidthFactor = Convert.ToDouble(sourceHeight) / Convert.ToDouble(sourceWidth); enc.BitmapTransform.ScaledHeight = (uint)width; enc.BitmapTransform.ScaledWidth = Convert.ToUInt32(Math.Round(height / heightWidthFactor)); } // write out to the stream try { await enc.FlushAsync(); } catch (Exception ex) { string s = ex.ToString(); } res = new byte[ras.Size]; var buffer = await ras.ReadAsync(res.AsBuffer(), (uint)ras.Size, InputStreamOptions.None); res = buffer.ToArray(); return res; }

Happy Coding!!