Willcode4cash icon

JPG EXIF Metadata - Read/Write

Willcode4cash | PRO | 05/23/17 09:53:10 PM UTC | 0 ⭐ | 375 👁️ | Never ⏰ | []
C# |

3.34 KB

|

None

|

0 👍

/

0 👎

public class Sandbox
{
    public void TestMetadata
    {
        var filePath = "c:\\data\\car.jpg";
        FileInfo originalImage = new FileInfo(filePath);
 
        if (originalImage.Exists)
        {
            JpegBitmapDecoder decoder = null;
            
            using (Stream imageStream = File.Open(originalImage.FullName, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
            {
                decoder = new JpegBitmapDecoder(imageStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
            }           
 
            var bitmapFrame = decoder.Frames[0];
            var metadata = (BitmapMetadata)bitmapFrame.Metadata;
 
            // SubjectLocation
            // Indicates the location and area of the main subject in the overall scene.
            var subjectLocation = metadata.GetQuery("/app1/ifd/exif:{uint=37396}");
 
            // GPSLatitude
            // Indicates the latitude. The latitude is expressed as three RATIONAL values giving the degrees, minutes, 
            // and seconds, respectively. When degrees, minutes and seconds are expressed, the format is dd/1,mm/1,ss/1. 
            // When degrees and minutes are used and, for example, fractions of minutes are given up to two decimal places, 
            // the format is dd/1,mmmm/100,0/1.
            var gpsLatitude = metadata.GetQuery("/app1/ifd/exif:{uint=2}");
            
            // GPSLongitude
            // Indicates the longitude. The longitude is expressed as three RATIONAL values giving the degrees, minutes, 
            // and seconds, respectively. When degrees, minutes and seconds are expressed, the format is ddd/1,mm/1,ss/1. 
            // When degrees and minutes are used and, for example, fractions of minutes are given up to two decimal places, 
            // the format is ddd/1,mmmm/100,0/1.
            var gpsLongitude = metadata.GetQuery("/app1/ifd/exif:{uint=4}");
            
            // UserComment
            // A tag for Exif users to write keywords or comments on the image besides those in <ImageDescription>, and 
            // without the character code limitations of the <ImageDescription> tag.
            var userComment = metadata.GetQuery("/app1/ifd/exif:{uint=37510}");
            
            // ImageDescription:
            // A character string giving the title of the image. It may be a comment such as "1988 company picnic" or the 
            // like. Two-bytes character codes cannot be used. When a 2-bytes code is necessary, the Exif Private tag 
            // <UserComment> is to be used.
            var imageDescription = metadata.GetQuery("/app1/ifd/exif:{uint=270}");
 
            if (bitmapFrame != null)
            {
                BitmapMetadata metadataClone = (BitmapMetadata)bitmapFrame.Metadata.Clone();
                if (metadataClone != null)
                {
                    metadata.SetQuery("/app1/ifd/exif:{uint=2}", 38.12345);                         // GPS Latitude
                    metadata.SetQuery("/app1/ifd/exif:{uint=4}", -80.54321);                          // GPS Longitude
                    metadata.SetQuery("/app1/ifd/exif:{uint=270}", "This is a test description");   // Image Description
                    metadata.SetQuery("/app1/ifd/exif:{uint=37396}", "101 Main Street, Anytown, USA");  // Subject Location
                    metadata.SetQuery("/app1/ifd/exif:{uint=37510}", "This is a a test comment");           // User Comment
 
                    JpegBitmapEncoder encoder = new JpegBitmapEncoder();
                    encoder.Frames.Add(BitmapFrame.Create(bitmapFrame, bitmapFrame.Thumbnail, metadataClone, bitmapFrame.ColorContexts));
                    originalImage.Delete();
                    using (Stream jpegStreamOut = File.Open(filePath, FileMode.CreateNew, FileAccess.ReadWrite))
                    {
                        encoder.Save(jpegStreamOut);
                    }
                }
            }
        }
    }
}

Comments