Ejemplo n.º 1
0
        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()}");
            }
        }
Ejemplo n.º 2
0
        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()}");
            }
        }