Exemple #1
0
        private static T GetExifDataFromTag <T>(ExifProfile profile, ExifTag tag)
        {
            var outValue = default(T);

            if (profile == null)
            {
                return(outValue);
            }

            try
            {
                outValue = (T)profile.GetValue(tag).Value;
            }
            catch (InvalidCastException)
            {
                if (tag == ExifTag.DateTimeOriginal || tag == ExifTag.DateTime || tag == ExifTag.DateTimeDigitized)
                {
                    var formats = new[] { "yyyy:MM:dd HH:mm:ss", "M-d-yyyy", "dd-MM-yyyy", "MM-dd-yyyy", "M.d.yyyy", "dd.MM.yyyy", "MM.dd.yyyy" };

                    object value = DateTime.ParseExact(profile.GetValue(tag).Value.ToString(), formats, CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal);
                    return((T)value);
                }
            }
            catch
            {// Wert ist nicht vorhanden / konnte nicht konvertiert werden
            }

            return(outValue);
        }
        public void Test_Infinity()
        {
            using (MagickImage image = new MagickImage(Files.FujiFilmFinePixS1ProJPG))
            {
                ExifProfile profile = image.GetExifProfile();
                profile.SetValue(ExifTag.ExposureBiasValue, double.PositiveInfinity);
                image.AddProfile(profile);

                profile = image.GetExifProfile();
                ExifValue value = profile.GetValue(ExifTag.ExposureBiasValue);
                Assert.IsNotNull(value);
                Assert.IsTrue(double.PositiveInfinity.Equals(value.Value));

                profile.SetValue(ExifTag.ExposureBiasValue, double.NegativeInfinity);
                image.AddProfile(profile);

                profile = image.GetExifProfile();
                value   = profile.GetValue(ExifTag.ExposureBiasValue);
                Assert.IsNotNull(value);
                Assert.IsTrue(double.NegativeInfinity.Equals(value.Value));

                profile.SetValue(ExifTag.FlashEnergy, double.NegativeInfinity);
                image.AddProfile(profile);

                profile = image.GetExifProfile();
                value   = profile.GetValue(ExifTag.FlashEnergy);
                Assert.IsNotNull(value);
                Assert.IsTrue(double.PositiveInfinity.Equals(value.Value));
            }
        }
Exemple #3
0
        public void TestExifTag()
        {
            var exifProfile = new ExifProfile();

            exifProfile.SetValue(ExifTag.ResolutionUnit, (ushort)1);
            IExifValue value = exifProfile.GetValue(ExifTag.ResolutionUnit);

            Assert.Equal("None", value.ToString());

            exifProfile.SetValue(ExifTag.ResolutionUnit, (ushort)2);
            value = exifProfile.GetValue(ExifTag.ResolutionUnit);
            Assert.Equal("Inches", value.ToString());

            exifProfile.SetValue(ExifTag.ResolutionUnit, (ushort)3);
            value = exifProfile.GetValue(ExifTag.ResolutionUnit);
            Assert.Equal("Centimeter", value.ToString());

            exifProfile.SetValue(ExifTag.ResolutionUnit, (ushort)4);
            value = exifProfile.GetValue(ExifTag.ResolutionUnit);
            Assert.Equal("4", value.ToString());

            exifProfile.SetValue(ExifTag.ImageWidth, 123U);
            value = exifProfile.GetValue(ExifTag.ImageWidth);
            Assert.Equal("123", value.ToString());
        }
        public void Identify_ReadsLegacyExifData(string imagePath)
        {
            var testFile = TestFile.Create(imagePath);

            using (var stream = new MemoryStream(testFile.Bytes, false))
            {
                IImageInfo imageInfo = Image.Identify(stream);
                Assert.NotNull(imageInfo);
                Assert.NotNull(imageInfo.Metadata.ExifProfile);

                PngMetadata meta = imageInfo.Metadata.GetFormatMetadata(PngFormat.Instance);
                Assert.DoesNotContain(meta.TextData, t => t.Keyword.Equals("Raw profile type exif", StringComparison.OrdinalIgnoreCase));

                ExifProfile exif = imageInfo.Metadata.ExifProfile;
                Assert.Equal(0, exif.InvalidTags.Count);
                Assert.Equal(3, exif.Values.Count);

                Assert.Equal(
                    "A colorful tiling of blue, red, yellow, and green 4x4 pixel blocks.",
                    exif.GetValue(ExifTag.ImageDescription).Value);
                Assert.Equal(
                    "Duplicated from basn3p02.png, then image metadata modified with exiv2",
                    exif.GetValue(ExifTag.ImageHistory).Value);

                Assert.Equal(42, (int)exif.GetValue(ExifTag.ImageNumber).Value);
            }
        }
Exemple #5
0
        /// <summary>
        /// Decodes the image data from a specified IFD.
        /// </summary>
        /// <typeparam name="TPixel">The pixel format.</typeparam>
        /// <param name="tags">The IFD tags.</param>
        /// <param name="cancellationToken">The token to monitor cancellation.</param>
        /// <returns> The tiff frame. </returns>
        private ImageFrame <TPixel> DecodeFrame <TPixel>(ExifProfile tags, CancellationToken cancellationToken)
            where TPixel : unmanaged, IPixel <TPixel>
        {
            ImageFrameMetadata imageFrameMetaData = this.ignoreMetadata ?
                                                    new ImageFrameMetadata() :
                                                    new ImageFrameMetadata {
                ExifProfile = tags, XmpProfile = tags.GetValue(ExifTag.XMP)?.Value
            };

            TiffFrameMetadata tiffFrameMetaData = imageFrameMetaData.GetTiffMetadata();

            TiffFrameMetadata.Parse(tiffFrameMetaData, tags);

            this.VerifyAndParse(tags, tiffFrameMetaData);

            int width  = GetImageWidth(tags);
            int height = GetImageHeight(tags);
            var frame  = new ImageFrame <TPixel>(this.Configuration, width, height, imageFrameMetaData);

            int rowsPerStrip = tags.GetValue(ExifTag.RowsPerStrip) != null ? (int)tags.GetValue(ExifTag.RowsPerStrip).Value : TiffConstants.RowsPerStripInfinity;

            Number[] stripOffsets    = tags.GetValue(ExifTag.StripOffsets)?.Value;
            Number[] stripByteCounts = tags.GetValue(ExifTag.StripByteCounts)?.Value;

            if (this.PlanarConfiguration == TiffPlanarConfiguration.Planar)
            {
                this.DecodeStripsPlanar(frame, rowsPerStrip, stripOffsets, stripByteCounts, cancellationToken);
            }
            else
            {
                this.DecodeStripsChunky(frame, rowsPerStrip, stripOffsets, stripByteCounts, cancellationToken);
            }

            return(frame);
        }
        public void Test_Infinity()
        {
            using (IMagickImage image = new MagickImage(Files.FujiFilmFinePixS1ProJPG))
            {
                ExifProfile profile = image.GetExifProfile();
                profile.SetValue(ExifTag.ExposureBiasValue, new SignedRational(double.PositiveInfinity));
                image.AddProfile(profile);

                profile = image.GetExifProfile();
                ExifValue value = profile.GetValue(ExifTag.ExposureBiasValue);
                Assert.IsNotNull(value);
                Assert.AreEqual(double.PositiveInfinity, ((SignedRational)value.Value).ToDouble());

                profile.SetValue(ExifTag.ExposureBiasValue, new SignedRational(double.NegativeInfinity));
                image.AddProfile(profile);

                profile = image.GetExifProfile();
                value   = profile.GetValue(ExifTag.ExposureBiasValue);
                Assert.IsNotNull(value);
                Assert.AreEqual(double.NegativeInfinity, ((SignedRational)value.Value).ToDouble());

                profile.SetValue(ExifTag.FlashEnergy, new Rational(double.NegativeInfinity));
                image.AddProfile(profile);

                profile = image.GetExifProfile();
                value   = profile.GetValue(ExifTag.FlashEnergy);
                Assert.IsNotNull(value);
                Assert.AreEqual(double.PositiveInfinity, ((Rational)value.Value).ToDouble());
            }
        }
Exemple #7
0
        private static void TestProfile(ExifProfile profile)
        {
            Assert.NotNull(profile);

            // todo: duplicate tags
            Assert.Equal(2, profile.Values.Count(v => (ushort)v.Tag == 59932));

            Assert.Equal(16, profile.Values.Count);

            foreach (IExifValue value in profile.Values)
            {
                Assert.NotNull(value.GetValue());
            }

            IExifValue <string> software = profile.GetValue(ExifTag.Software);

            Assert.Equal("Windows Photo Editor 10.0.10011.16384", software.Value);

            IExifValue <Rational> xResolution = profile.GetValue(ExifTag.XResolution);

            Assert.Equal(new Rational(300.0), xResolution.Value);

            IExifValue <Number> xDimension = profile.GetValue(ExifTag.PixelXDimension);

            Assert.Equal(2338U, xDimension.Value);
        }
Exemple #8
0
        private async Task <GeoLocation?> GetGeoLocationDataAsync(
            ExifProfile exifProfile,
            CancellationToken cancellationToken)
        {
            IExifValue <Rational[]> lat    = exifProfile.GetValue(ExifTag.GPSLatitude);
            IExifValue <Rational[]> lon    = exifProfile.GetValue(ExifTag.GPSLongitude);
            IExifValue <string>     latRef = exifProfile.GetValue(ExifTag.GPSLatitudeRef);
            IExifValue <string>     lonRef = exifProfile.GetValue(ExifTag.GPSLongitudeRef);
            IExifValue <Rational>   alt    = exifProfile.GetValue(ExifTag.GPSAltitude);

            if (lat != null)
            {
                var gps = new GeoLocation()
                {
                    Type  = "gps",
                    Point = new GeoPoint()
                };
                var latValue = ConvertToLocation(lat.Value);
                var lonValue = ConvertToLocation(lon.Value);

                if (latRef.Value.ToString() == "S")
                {
                    latValue = latValue * -1;
                }
                if (lonRef.Value.ToString() == "W")
                {
                    lonValue = lonValue * -1;
                }

                gps.Point = GeoPoint.Create(latValue, lonValue);
                if (alt != null)
                {
                    var dominator = (int)alt.Value.Denominator;
                    if (dominator == 0)
                    {
                        dominator = 1;
                    }
                    gps.Altitude = (int)alt.Value.Numerator / dominator;
                }

                gps.GeoHash = GeoHash.Encode(gps.Point.Coordinates[1], gps.Point.Coordinates[0]);
                gps.Address = await _geoDecoderService.DecodeAsync(
                    gps.Point.Coordinates[1],
                    gps.Point.Coordinates[0],
                    cancellationToken);

                return(gps);
            }

            return(null);
        }
        /// <summary>
        /// Decodes the image data from a specified IFD.
        /// </summary>
        /// <typeparam name="TPixel">The pixel format.</typeparam>
        /// <param name="tags">The IFD tags.</param>
        /// <param name="cancellationToken">The token to monitor cancellation.</param>
        /// <returns> The tiff frame. </returns>
        private ImageFrame <TPixel> DecodeFrame <TPixel>(ExifProfile tags, CancellationToken cancellationToken)
            where TPixel : unmanaged, IPixel <TPixel>
        {
            var imageFrameMetaData = new ImageFrameMetadata();

            if (!this.ignoreMetadata)
            {
                imageFrameMetaData.ExifProfile = tags;
            }

            TiffFrameMetadata tiffFrameMetaData = imageFrameMetaData.GetTiffMetadata();

            TiffFrameMetadata.Parse(tiffFrameMetaData, tags);

            this.VerifyAndParse(tags, tiffFrameMetaData);

            int width  = GetImageWidth(tags);
            int height = GetImageHeight(tags);
            var frame  = new ImageFrame <TPixel>(this.Configuration, width, height, imageFrameMetaData);

            int rowsPerStrip = tags.GetValue(ExifTag.RowsPerStrip) != null ? (int)tags.GetValue(ExifTag.RowsPerStrip).Value : TiffConstants.RowsPerStripInfinity;

            var stripOffsetsArray    = (Array)tags.GetValueInternal(ExifTag.StripOffsets).GetValue();
            var stripByteCountsArray = (Array)tags.GetValueInternal(ExifTag.StripByteCounts).GetValue();

            IMemoryOwner <ulong> stripOffsetsMemory    = this.ConvertNumbers(stripOffsetsArray, out Span <ulong> stripOffsets);
            IMemoryOwner <ulong> stripByteCountsMemory = this.ConvertNumbers(stripByteCountsArray, out Span <ulong> stripByteCounts);

            if (this.PlanarConfiguration == TiffPlanarConfiguration.Planar)
            {
                this.DecodeStripsPlanar(
                    frame,
                    rowsPerStrip,
                    stripOffsets,
                    stripByteCounts,
                    cancellationToken);
            }
            else
            {
                this.DecodeStripsChunky(
                    frame,
                    rowsPerStrip,
                    stripOffsets,
                    stripByteCounts,
                    cancellationToken);
            }

            stripOffsetsMemory?.Dispose();
            stripByteCountsMemory?.Dispose();
            return(frame);
        }
Exemple #10
0
        public void ShouldReadTheExifChunk()
        {
            using (var input = new MagickImage(MagickColors.YellowGreen, 1, 1))
            {
                IExifProfile exifProfile = new ExifProfile();
                exifProfile.SetValue(ExifTag.ImageUniqueID, "Have a nice day");

                input.SetProfile(exifProfile);

                using (var memoryStream = new MemoryStream())
                {
                    input.Write(memoryStream, MagickFormat.Png);

                    memoryStream.Position = 0;

                    using (var output = new MagickImage(memoryStream))
                    {
                        exifProfile = output.GetExifProfile();

                        Assert.NotNull(exifProfile);

                        var value = exifProfile.GetValue(ExifTag.ImageUniqueID);
                        Assert.Equal("Have a nice day", value.ToString());
                    }
                }
            }
        }
Exemple #11
0
        public static PixelResolutionUnit ExifProfileToResolutionUnit(ExifProfile?profile)
        {
            var resolution = profile?.GetValue(ExifTag.ResolutionUnit);

            // EXIF is 1, 2, 3 so we minus "1" off the result.
            return(resolution is null ? default : (PixelResolutionUnit)(byte)(resolution.Value - 1));
        }
Exemple #12
0
        private CameraData?GetCameraData(ExifProfile exifProfile)
        {
            IExifValue <string> model = exifProfile.GetValue(ExifTag.Model);
            IExifValue <string> make  = exifProfile.GetValue(ExifTag.Make);

            if (model?.GetValue() != null)
            {
                return(new CameraData
                {
                    Model = model.ToString(),
                    Make = make.ToString()
                });
            }

            return(null);
        }
Exemple #13
0
 internal static void ClearValue(this ExifProfile profile, ExifTag tag)
 {
     if (profile.GetValue(tag) != null)
     {
         profile.RemoveValue(tag);
     }
 }
 private static void RemoveTag <T>(ExifTag <T> exifTag, ExifProfile exifProfile)
 {
     if (exifProfile.GetValue <T>(exifTag) != null)
     {
         exifProfile.RemoveValue(exifTag);
     }
 }
        public string getImageComment(string jpegFileInputPath)
        {
            string result = null;

            if (!File.Exists(jpegFileInputPath))
            {
                log.Error(String.Format("File does not exist. File : {0}.", jpegFileInputPath));
            }
            else
            {
                try
                {
                    using (MagickImage image = new MagickImage(jpegFileInputPath))
                    {
                        ExifProfile profile = image.GetExifProfile();

                        ExifValue value = profile.GetValue(ExifTag.ImageDescription);

                        result = value.ToString();
                    }
                }
                catch (Exception ex)
                {
                    log.Error(String.Format("Problem reading comments from file \"{0}\". Exception : {1}.", jpegFileInputPath, ex));
                }
            }

            return(result);
        }
Exemple #16
0
        public void ReadWriteLargeProfileJpg(ExifTag exifValueToChange)
        {
            // arrange
            var junk = new StringBuilder();

            for (int i = 0; i < 65600; i++)
            {
                junk.Append("a");
            }
            var         image               = new Image <Rgba32>(100, 100);
            ExifProfile expectedProfile     = CreateExifProfile();
            var         expectedProfileTags = expectedProfile.Values.Select(x => x.Tag).ToList();

            expectedProfile.SetValue(exifValueToChange, junk.ToString());
            image.MetaData.ExifProfile = expectedProfile;

            // act
            Image <Rgba32> reloadedImage = WriteAndRead(image, TestImageWriteFormat.Jpeg);

            // assert
            ExifProfile actualProfile = reloadedImage.MetaData.ExifProfile;

            Assert.NotNull(actualProfile);
            foreach (ExifTag expectedProfileTag in expectedProfileTags)
            {
                ExifValue actualProfileValue   = actualProfile.GetValue(expectedProfileTag);
                ExifValue expectedProfileValue = expectedProfile.GetValue(expectedProfileTag);
                Assert.Equal(expectedProfileValue.Value, actualProfileValue.Value);
            }
        }
Exemple #17
0
        public static PixelResolutionUnit ExifProfileToResolutionUnit(ExifProfile profile)
        {
            IExifValue <ushort> resolution = profile.GetValue(ExifTag.ResolutionUnit);

            // EXIF is 1, 2, 3 so we minus "1" off the result.
            return(resolution is null ? DefaultResolutionUnit : (PixelResolutionUnit)(byte)(resolution.Value - 1));
        }
        private DateTime GetPictureDate(MagickImage image)
        {
            //Set Date
            DateTime?pictureDate = null;

            //Get Date Taken
            ExifProfile profile = image.GetExifProfile();

            if (!(profile is null))
            {
                ExifValue dateTakeExif = profile.GetValue(ExifTag.DateTimeDigitized);
                if (!(dateTakeExif is null))
                {
                    pictureDate = DateTime.ParseExact(dateTakeExif.Value.ToString().TrimEnd('\0'), "yyyy:MM:dd HH:mm:ss", null);
                }
            }
            //Get File Creation Date
            if (pictureDate is null)
            {
                pictureDate = File.GetCreationTime(image.FileName);
            }
            //Default to Today
            if (pictureDate is null)
            {
                pictureDate = DateTime.Now;
            }

            return(pictureDate.Value);
        }
        public void TiffDecoder_SubIfd8 <TPixel>(TestImageProvider <TPixel> provider)
            where TPixel : unmanaged, IPixel <TPixel>
        {
            using Image <TPixel> image = provider.GetImage(TiffDecoder);

            ExifProfile meta = image.Frames.RootFrame.Metadata.ExifProfile;

            Assert.Equal(0, meta.InvalidTags.Count);
            Assert.Equal(6, meta.Values.Count);
            Assert.Equal(64, (int)meta.GetValue(ExifTag.ImageWidth).Value);
            Assert.Equal(64, (int)meta.GetValue(ExifTag.ImageLength).Value);
            Assert.Equal(64, (int)meta.GetValue(ExifTag.RowsPerStrip).Value);

            Assert.Equal(1, meta.Values.Count(v => (ushort)v.Tag == (ushort)ExifTagValue.ImageWidth));
            Assert.Equal(1, meta.Values.Count(v => (ushort)v.Tag == (ushort)ExifTagValue.StripOffsets));
            Assert.Equal(1, meta.Values.Count(v => (ushort)v.Tag == (ushort)ExifTagValue.StripByteCounts));
        }
        private static void VerifyExifDataIsPresent(ExifProfile exif)
        {
            Assert.Equal(1, exif.Values.Count);
            IExifValue <string> software = exif.GetValue(ExifTag.Software);

            Assert.NotNull(software);
            Assert.Equal("ImageSharp", software.Value);
        }
        private static void VerifyRequiredFieldsArePresent(ExifProfile exifProfile, TiffFrameMetadata frameMetadata)
        {
            if (exifProfile.GetValue(ExifTag.StripOffsets) == null)
            {
                TiffThrowHelper.ThrowImageFormatException("StripOffsets are missing and are required for decoding the TIFF image!");
            }

            if (exifProfile.GetValue(ExifTag.StripByteCounts) == null)
            {
                TiffThrowHelper.ThrowImageFormatException("StripByteCounts are missing and are required for decoding the TIFF image!");
            }

            if (frameMetadata.BitsPerPixel == null)
            {
                TiffThrowHelper.ThrowNotSupported("The TIFF BitsPerSample entry is missing which is required to decode the image!");
            }
        }
            public void ShouldCorrectlyHandleArray()
            {
                Rational[] latitude = new Rational[] { new Rational(12.3), new Rational(4.56), new Rational(789.0) };

                var profile = new ExifProfile();

                profile.SetValue(ExifTag.GPSLatitude, latitude);

                var value = profile.GetValue(ExifTag.GPSLatitude);

                value = profile.GetValue(ExifTag.GPSLatitude);

                Assert.IsNotNull(value);
                Rational[] values = (Rational[])value.Value;
                Assert.IsNotNull(values);
                CollectionAssert.AreEqual(latitude, values);
            }
            public void ShouldReturnTheExifTagDescriptionWhenItIsPresent(ushort input, string expected)
            {
                var exifProfile = new ExifProfile();

                exifProfile.SetValue(ExifTag.ResolutionUnit, input);
                var value = exifProfile.GetValue(ExifTag.ResolutionUnit);

                Assert.Equal(expected, value.ToString());
            }
Exemple #24
0
        public void WriteFraction()
        {
            using (MemoryStream memStream = new MemoryStream())
            {
                double exposureTime = 1.0 / 1600;

                ExifProfile profile = GetExifProfile();

                profile.SetValue(ExifTag.ExposureTime, new Rational(exposureTime));

                Image image = new Image(1, 1);
                image.ExifProfile = profile;

                image.SaveAsJpeg(memStream);

                memStream.Position = 0;
                image = new Image(memStream);

                profile = image.ExifProfile;
                Assert.NotNull(profile);

                ExifValue value = profile.GetValue(ExifTag.ExposureTime);
                Assert.NotNull(value);
                Assert.NotEqual(exposureTime, ((Rational)value.Value).ToDouble());

                memStream.Position = 0;
                profile            = GetExifProfile();

                profile.SetValue(ExifTag.ExposureTime, new Rational(exposureTime, true));
                image.ExifProfile = profile;

                image.SaveAsJpeg(memStream);

                memStream.Position = 0;
                image = new Image(memStream);

                profile = image.ExifProfile;
                Assert.NotNull(profile);

                value = profile.GetValue(ExifTag.ExposureTime);
                Assert.Equal(exposureTime, ((Rational)value.Value).ToDouble());
            }
        }
Exemple #25
0
        private void lsbResimlistesi_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                for (int i = 0; i < lsbislem.Items.Count; i++)
                {
                    int sonuc = lsbislem.Items[i].ToString().IndexOf(lsbResimlistesi.SelectedItem.ToString());
                    if (sonuc > 0)
                    {
                        lsbislem.SelectedItem = lsbislem.Items[i];
                    }
                }
                txtAciklama.Text  = "";
                txtBaslik.Text    = "";
                txtEtiketler.Text = "";
                txtKonu.Text      = "";
                secilen           = lsbislem.SelectedItem.ToString();

                using (MagickImage image = new MagickImage(secilen))
                {
                    try
                    {
                        ExifProfile profile2 = image.GetExifProfile();

                        ExifValue Baslik    = profile2.GetValue(ImageMagick.ExifTag.XPTitle);
                        ExifValue Aciklama  = profile2.GetValue(ImageMagick.ExifTag.XPComment);
                        ExifValue Etiketler = profile2.GetValue(ImageMagick.ExifTag.XPKeywords);
                        ExifValue Konu      = profile2.GetValue(ImageMagick.ExifTag.XPSubject);

                        txtBaslik.Text    = Encoding.Unicode.GetString((byte[])Baslik.Value);
                        txtAciklama.Text  = Encoding.Unicode.GetString((byte[])Aciklama.Value);
                        txtEtiketler.Text = Encoding.Unicode.GetString((byte[])Etiketler.Value);
                        txtKonu.Text      = Encoding.Unicode.GetString((byte[])Konu.Value);
                    }
                    catch (Exception)
                    {
                    }
                }
            }
            catch (Exception)
            {
            }
        }
            public void ShouldAllowNullValues()
            {
                var profile = new ExifProfile();

                profile.SetValue(ExifTag.ReferenceBlackWhite, null);

                var value = profile.GetValue(ExifTag.ReferenceBlackWhite);

                TestValue(value, null);
            }
        private GeoLocation ExtractGeoLocation(ExifProfile exifProfile)
        {
            if (exifProfile?.GetValue(ExifTag.GPSLatitude) == null)
            {
                // no GPS exifProfile found.
                return(null);
            }

            GeoLocation geo = new GeoLocation()
            {
                Latitude = ParseCoordinate(exifProfile.GetValue(ExifTag.GPSLatitudeRef)?.Value,
                                           exifProfile.GetValue(ExifTag.GPSLongitude)?.Value),

                Longtitude = ParseCoordinate(exifProfile.GetValue(ExifTag.GPSLongitudeRef)?.Value,
                                             exifProfile.GetValue(ExifTag.GPSLongitude)?.Value)
            };

            return(geo);
        }
            public void ShouldReturnFalseWhenValueIsInvalidDataType1()
            {
                var profile = new ExifProfile();

                profile.SetValue(ExifTag.Software, "Magick.NET");

                IExifValue value = profile.GetValue(ExifTag.Software);

                Assert.False(value.SetValue(10.5));
            }
            public void ShouldReturnFalseWhenValueIsInvalidDataType2()
            {
                var profile = new ExifProfile();

                profile.SetValue(ExifTag.ShutterSpeedValue, new SignedRational(75.55));

                IExifValue value = profile.GetValue(ExifTag.ShutterSpeedValue);

                Assert.False(value.SetValue(75));
            }
            public void ShouldReturnStringWhenValueIsString()
            {
                var profile = new ExifProfile();

                profile.SetValue(ExifTag.Software, "Magick.NET");

                var value = profile.GetValue(ExifTag.Software);

                TestValue(value, "Magick.NET");
            }