private static async Task<StorageFile> GenerateResizedImageAsync(StorageFile inputFile, uint width, uint height, uint edgePadding = 5, uint bottomPadding = 20, NameCollisionOption collisionOption = NameCollisionOption.ReplaceExisting)
{
try
{
string fileName = inputFile.DisplayName + width + "x" + height;
string extension = inputFile.Name.Substring(inputFile.Name.LastIndexOf('.'));
string folder = inputFile.Path.Substring(0, inputFile.Path.LastIndexOf('\\'));
var outputFolder = await StorageFolder.GetFolderFromPathAsync(folder);
var newFile = await outputFolder.CreateFileAsync(fileName + extension, CreationCollisionOption.ReplaceExisting);
var inputStream = await inputFile.OpenAsync(Windows.Storage.FileAccessMode.Read);
var outputStream = await newFile.OpenTransactedWriteAsync();
var inMemStream = new InMemoryRandomAccessStream();
var decoder = await BitmapDecoder.CreateAsync(inputStream);
var encoder = await BitmapEncoder.CreateForTranscodingAsync(inMemStream, decoder);
// Find aspect ratio for resize
float nPercentW = (((float)width - (edgePadding * 2)) / (float)decoder.PixelWidth);
float nPercentH = (((float)height - (edgePadding * 2)) / (float)decoder.PixelHeight);
float nPercent = nPercentH < nPercentW ? nPercentH : nPercentW;
// Scale height and width
if (nPercent < 1)
{
encoder.BitmapTransform.ScaledHeight = (uint)(decoder.PixelHeight * nPercent);
encoder.BitmapTransform.ScaledWidth = (uint)(decoder.PixelWidth * nPercent);
}
// Image may still exceed intended bounds, resize as appropriate
if (encoder.BitmapTransform.ScaledWidth > width || encoder.BitmapTransform.ScaledHeight > height)
{
BitmapBounds bounds = new BitmapBounds();
if (encoder.BitmapTransform.ScaledWidth > width)
{
bounds.Width = width;
bounds.X = (encoder.BitmapTransform.ScaledWidth - width) / 2;
}
else
bounds.Width = encoder.BitmapTransform.ScaledWidth;
if (encoder.BitmapTransform.ScaledHeight > height)
{
bounds.Height = height;
bounds.Y = (encoder.BitmapTransform.ScaledHeight - height) / 2;
}
else
bounds.Height = encoder.BitmapTransform.ScaledHeight;
encoder.BitmapTransform.Bounds = bounds;
}
await encoder.FlushAsync();
var outDecoder = await BitmapDecoder.CreateAsync(inMemStream);
var outEncoder = await BitmapEncoder.CreateForTranscodingAsync(outputStream.Stream, outDecoder);
var transparentBytes = GenerateTransparentBitmap(width, height);
PixelDataProvider data = await outDecoder.GetPixelDataAsync();
uint heightOffset = (height - outDecoder.PixelHeight) / 2 - bottomPadding;
uint widthOffset = (width - outDecoder.PixelWidth) / 2;
byte[] bytes = MergePixelArrays(transparentBytes, width, height, data.DetachPixelData(), outDecoder.PixelWidth, outDecoder.PixelHeight, widthOffset, heightOffset);
outEncoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, width, height, 72.0, 72.0, bytes);
await outEncoder.FlushAsync();
return newFile;
}
catch (Exception)
{
}
return null;
}