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); }
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); }
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); }