Beispiel #1
0
        private static IReadOnlyList <XmpDirectory> ReadJpegSegments(IEnumerable <JpegSegment> segments)
        {
            // This is a modified version of XmpReader.ReadJpegSegments
            // The original version specifically tests the buffer against the classic XMP preamble and discards everything else.
            // Here we also test against the extended XMP preamble and regroup all the extended segments into a single buffer.
            // Note that we do not import any of the usual tags as in ProcessXmpTags(). Users of the class have to go
            // through XmpMeta methods.

            var directories = new List <XmpDirectory>();

            byte[] extendedData = null;

            int maxPreambleLength = Math.Max(XmpJpegPreamble.Length, XmpJpegExtendedPreamble.Length);

            try
            {
                foreach (var segment in segments)
                {
                    string extractedPreamble = Encoding.UTF8.GetString(segment.Bytes, 0, maxPreambleLength);

                    if (extractedPreamble.StartsWith(XmpJpegPreamble))
                    {
                        ParseNormalXmpSegment(directories, segment.Bytes);
                    }
                    else if (extractedPreamble.StartsWith(XmpJpegExtendedPreamble))
                    {
                        ParseExtendedXmpSegment(ref extendedData, segment.Bytes);
                    }
                }
            }
            catch (JpegProcessingException)
            {
                return(directories);
            }

            if (extendedData == null)
            {
                return(directories);
            }

            // We have collected extended XMP data, let's parse the reconstructed buffer.
            XmpDirectory directory = new XmpDirectory();

            try
            {
                var xmpMeta = XmpMetaFactory.ParseFromBuffer(extendedData);
                directory.SetXmpMeta(xmpMeta);
            }
            catch (XmpException e)
            {
                directory.AddError("Error processing XMP data: " + e.Message);
            }

            directories.Add(directory);
            return(directories);
        }
Beispiel #2
0
        private static void ParseNormalXmpSegment(List <XmpDirectory> directories, byte[] segmentBytes)
        {
            byte[] xmpBytes = new byte[segmentBytes.Length - XmpJpegPreamble.Length];
            Array.Copy(segmentBytes, XmpJpegPreamble.Length, xmpBytes, 0, xmpBytes.Length);

            XmpDirectory directory = new XmpDirectory();

            try
            {
                var xmpMeta = XmpMetaFactory.ParseFromBuffer(xmpBytes);
                directory.SetXmpMeta(xmpMeta);
            }
            catch (XmpException e)
            {
                directory.AddError("Error processing XMP data: " + e.Message);
            }

            directories.Add(directory);
        }
Beispiel #3
0
        public void ExifRead_GetExifDateTimeTest_GetXmpData()
        {
            var container = new List <Directory>();
            var dir2      = new XmpDirectory();

            dir2.SetXmpMeta(new XmpMeta());
            if (dir2.XmpMeta == null)
            {
                throw new NullReferenceException(
                          "ExifRead_GetExifDateTimeTest_GetXmpData xmpMeta Field");
            }

            dir2.XmpMeta.SetProperty("http://ns.adobe.com/photoshop/1.0/", "photoshop:DateCreated", "2020-03-14T14:00:51");
            container.Add(dir2);

            var result = new ReadMetaExif(null).GetExifDateTime(container);
            var expectedExifDateTime = new DateTime(2020, 3, 14, 14, 0, 51);

            Assert.AreEqual(expectedExifDateTime, result);
        }