コード例 #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);
        }
コード例 #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);
        }