Resize image from StorageFile I have created a function that will take as a parameter a StorageFile and return a WriteableBitmap. I use this data type so that I can later encode the image into a base64 string.

My concern is with the intermediary BitmapImage that I create to get the original dimensions. Any other improvements would be welcomed as well.

Also, it should be noted that this is Windows 10 Universal code, so I am unable to use the System.Drawing libraries.

public static async Task&lt;WriteableBitmap&gt; ScaledWImage(StorageFile file, int maxWidth, int maxHeight)
{
    WriteableBitmap newImage;

    using (var fileStream = await file.OpenReadAsync())
    {
        var bitmap = new BitmapImage();
        bitmap.SetSource(fileStream);
        var origHeight = bitmap.PixelHeight;
        var origWidth = bitmap.PixelWidth;
        var ratioX = maxWidth / (float)origWidth;
        var ratioY = maxHeight / (float)origHeight;
        var ratio = Math.Min(ratioX, ratioY);
        var newHeight = (int)(origHeight * ratio);
        var newWidth = (int)(origWidth * ratio);

        if (ratio &gt; 1)
        {
            newHeight = origHeight;
            newWidth = origWidth;
        }

        newImage = new WriteableBitmap(newWidth, newHeight);
        fileStream.Seek(0);
        var decoder = await BitmapDecoder.CreateAsync(fileStream);

        // Scale image to appropriate size 
        var transform = new BitmapTransform()
        {
            ScaledWidth = Convert.ToUInt32(newImage.PixelWidth),
            ScaledHeight = Convert.ToUInt32(newImage.PixelHeight)
        };
        var pixelData = await decoder.GetPixelDataAsync(
            BitmapPixelFormat.Bgra8, // WriteableBitmap uses BGRA format 
            BitmapAlphaMode.Straight,
            transform,
            ExifOrientationMode.IgnoreExifOrientation, // This sample ignores Exif orientation 
            ColorManagementMode.DoNotColorManage
        );

        // An array containing the decoded image data, which could be modified before being displayed 
        var sourcePixels = pixelData.DetachPixelData();

        // Open a stream to copy the image contents to the WriteableBitmap's pixel buffer 
        using (var stream = newImage.PixelBuffer.AsStream())
        {
            await stream.WriteAsync(sourcePixels, 0, sourcePixels.Length);
        }
    }

    return newImage;
}


This code is adapted from a Microsoft sample found here.
If you're still looking for a way how to find out the dimensions of a StorageFile image, there is an easy way to do that. I am using it in uwp as well.

I guess it would be less expensive than creation of a new BitmapImage.

        StorageFile image;
        ImageProperties properties = await image.Properties.GetImagePropertiesAsync();
        int height = (int)properties.Height;
        int width = (int)properties.Width;


As well I have this one method which I am using couple of places: 

        private async Task&lt;WriteableBitmap&gt; StorageFileToWbmp(StorageFile file)
              {
        ImageProperties props = await file.Properties.GetImagePropertiesAsync();
        WriteableBitmap bitmap = new WriteableBitmap((int) props.Width, (int) props.Height);
        await bitmap.SetSourceAsync(await file.OpenReadAsync());
        return bitmap;
              }