static async Task ConvertFile(string filename) { try { if (!System.IO.Path.IsPathRooted(filename)) { filename = System.IO.Path.GetFullPath(filename); } filename = System.IO.Path.GetFullPath(filename); var inputFile = await Windows.Storage.StorageFile.GetFileFromPathAsync(filename); using (var stream = await inputFile.OpenReadAsync()) { var decoder = await Windows.Graphics.Imaging.BitmapDecoder.CreateAsync(stream); if (decoder.DecoderInformation.CodecId == Windows.Graphics.Imaging.BitmapDecoder.JpegDecoderId) { // Already JPEG file if (!decoder.DecoderInformation.FileExtensions.Contains(inputFile.FileType, StringComparer.OrdinalIgnoreCase)) { //Rename to .JPG file var filename2 = System.IO.Path.ChangeExtension(filename, ".jpg"); await inputFile.RenameAsync(System.IO.Path.ChangeExtension(filename, ".jpg")); Console.WriteLine($"Renamed '{filename}' to '{filename2}'"); } else { Console.WriteLine($"'{filename}' is already a JPEG file."); } return; } var bitmap = await decoder.GetSoftwareBitmapAsync(); var outputFilename = System.IO.Path.GetFileName(System.IO.Path.ChangeExtension(filename, ".jpg")); var outputFile = await(await inputFile.GetParentAsync()) .CreateFileAsync(outputFilename, Windows.Storage.CreationCollisionOption.ReplaceExisting); using (var outputStream = await outputFile.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite)) { var encoder = await Windows.Graphics.Imaging.BitmapEncoder.CreateAsync(Windows.Graphics.Imaging.BitmapEncoder.JpegEncoderId, outputStream); encoder.SetSoftwareBitmap(bitmap); encoder.IsThumbnailGenerated = true; await encoder.FlushAsync(); } // Copy EXIF data. //Get the EXIF data from the original photo. var photoProperties = await inputFile.Properties.RetrievePropertiesAsync(SystemPhotoProperties.Union(SystemGpsProperties)); foreach (var p in photoProperties.OrderBy(k => k.Key)) { //Console.WriteLine($"{p.Key}: {p.Value}"); System.Diagnostics.Trace.WriteLine($"{p.Key}: {(p.Value is Array ? string.Join(",", ((Array)p.Value).Cast<object>()) : p.Value)}"); } await outputFile.Properties.SavePropertiesAsync(photoProperties); } } catch (Exception ex) { Console.WriteLine($"Error converting file '{filename}': {ex.Message}"); System.Diagnostics.Trace.WriteLine($"Error converting file '{filename}': {ex.ToString()}"); } }
static async Task ConvertFile(string filename) { try { await Task.CompletedTask; filename = System.IO.Path.GetFullPath(filename); var imagingFactory = new WIC.WICImagingFactory(); var decoder = imagingFactory.CreateDecoderFromFilename(filename, Guid.Empty, WIC.StreamAccessMode.GENERIC_READ, WIC.WICDecodeOptions.WICDecodeMetadataCacheOnLoad); //ShowMetadata(decoder.GetFrame(0)); if (decoder.GetDecoderInfo().GetCLSID() == WIC.Decoder.Jpeg) { Console.WriteLine($"'{filename}' is already a JPEG file."); return; } var output = imagingFactory.CreateStream(); output.InitializeFromFilename(System.IO.Path.ChangeExtension(filename, ".jpg"), WIC.StreamAccessMode.GENERIC_WRITE); var encoder = imagingFactory.CreateEncoder(ContainerFormat.Jpeg); encoder.Initialize(output, WICBitmapEncoderCacheOption.WICBitmapEncoderNoCache); for (int i = 0; i < decoder.GetFrameCount(); i++) { var frame = decoder.GetFrame(i); encoder.CreateNewFrame(out var frameJpg, null); frameJpg.Initialize(null); frameJpg.SetSize(frame.GetSize()); frameJpg.SetResolution(frame.GetResolution()); frameJpg.SetPixelFormat(frame.GetPixelFormat()); var reader = frame.AsMetadataBlockReader(); var count = reader.GetCount(); //Get the EXIF data from the original photo. var metadataReader = frame.GetMetadataQueryReader(); var metadataWriter = frameJpg.GetMetadataQueryWriter(); foreach (var name in metadataReader.GetNamesRecursive()) { try { var val = metadataReader.GetMetadataByName(name); if (name.StartsWith("/ifd/")) { metadataWriter.SetMetadataByName("/app1" + name.Replace("/ifd/{ushort=34665}/", "/ifd/exif/").Replace("/ifd/{ushort=34853}/", "/ifd/gps/"), val); } else if (name.StartsWith("/xmp/")) { metadataWriter.SetMetadataByName(name, val); } } catch { System.Diagnostics.Trace.WriteLine($"Error setting '{name}'"); } } var photoProperties = SystemProperties.Concat(SystemPhotoProperties.Concat(SystemGpsProperties)); foreach (var photoProp in photoProperties) { var action = "getting"; try { var val = metadataReader.GetMetadataByName(photoProp); //System.Diagnostics.Trace.WriteLine($"{photoProp} = {val}"); action = "setting"; metadataWriter.SetMetadataByName(photoProp, val); } catch (Exception ex) { System.Diagnostics.Trace.WriteLine($"Error {action} '{photoProp}': " + ex.Message); } } frameJpg.WriteSource(frame); frameJpg.Commit(); frame = null; frameJpg = null; } encoder.Commit(); output.Commit(WIC.STGC.STGC_DEFAULT); encoder = null; output = null; } catch (Exception ex) { Console.WriteLine($"Error converting file '{filename}': {ex.Message}"); System.Diagnostics.Trace.WriteLine($"Error converting file '{filename}': {ex.ToString()}"); } }