public async void BitmapTransformAndSaveTest()
{
var uncroppedfile = await Windows.Storage.ApplicationData.Current.LocalFolder.GetFileAsync("uncropped.jpg");
if (uncroppedfile == null)
{
return;
}
WriteableBitmap wb = null;
// create a stream from the file and decode the image
var fileStream = await uncroppedfile.OpenAsync(Windows.Storage.FileAccessMode.Read);
var decoder = await BitmapDecoder.CreateAsync(fileStream);
// create a new stream and encoder for the new image
using (InMemoryRandomAccessStream ras = new InMemoryRandomAccessStream())
{
var enc = await BitmapEncoder.CreateForTranscodingAsync(ras, decoder);
// convert the entire bitmap to a 100px by 100px bitmap
enc.BitmapTransform.ScaledHeight = 100;
enc.BitmapTransform.ScaledWidth = 100;
var bounds = new BitmapBounds();
bounds.Height = 50;
bounds.Width = 50;
bounds.X = 50;
bounds.Y = 50;
enc.BitmapTransform.Bounds = bounds;
// write out to the stream
await enc.FlushAsync();
// create a writeable bitmap from the stream
ras.Seek(0);
wb = new WriteableBitmap(100, 100);
wb.SetSource(ras);
}
// save the cropped file now
var croppedfile = await Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileAsync("cropped.jpg", Windows.Storage.CreationCollisionOption.ReplaceExisting);
using (var stream = await croppedfile.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite))
{
var pixelStream = wb.PixelBuffer.AsStream();
var bytes = new byte[pixelStream.Length];
pixelStream.Seek(0, SeekOrigin.Begin);
await pixelStream.ReadAsync(bytes, 0, (int)pixelStream.Length);
await pixelStream.FlushAsync();
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, stream);
encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, (uint)wb.PixelWidth, (uint)wb.PixelHeight, 0, 0, bytes);
await encoder.FlushAsync();
await stream.FlushAsync();
}
}