private static async Task <Photo.Metadata> reloadAndSave( Photo photo, bool forceJpeg, string destFile) { using (var mmap = MemoryMappedFile.OpenExisting( mmapName(photo.FileName), MemoryMappedFileRights.Read)) { using (var stream = new UnsafeMemoryMapStream( mmap.CreateViewAccessor(0, 0, MemoryMappedFileAccess.Read), FileAccess.Read)) { (var sourceFrame, var format) = loadFrame(stream.Stream); var md = sourceFrame.Metadata.Clone() as BitmapMetadata; Photo.Metadata newMetadata = await Exif.SetMetadata(photo, md); newMetadata.Width = sourceFrame.PixelWidth; newMetadata.Height = sourceFrame.PixelHeight; BitmapEncoder encoder = forceJpeg ? new JpegBitmapEncoder() : BitmapEncoder.Create(format); encoder.Frames.Add( BitmapFrame.Create( sourceFrame, null, md, sourceFrame.ColorContexts)); if (encoder is JpegBitmapEncoder jpg) { jpg.Rotation = Exif.SaveRotation(md); } sourceFrame = null; using (var outFile = new FileStream(destFile, FileMode.CreateNew)) { encoder.Save(outFile); } return(newMetadata); } } }