public void ReadTag(ushort tag, ExifHeader headerType, ExifPhoto photo) { var currentPos = _jpegFileReader.BaseStream.Position; var fieldtype = (ExifFieldType)_binaryReader.ReadUInt16(); var length = _binaryReader.ReadUInt32(); var value = _binaryReader.ReadUInt32(); switch (fieldtype) { case ExifFieldType.AsciiStrings: SeekToTiffHeaderRelativeOffset(value); photo.SetMatchingProperty(tag, headerType, _binaryReader.ReadString((int)length)); break; case ExifFieldType.UnsignedRational: SeekToTiffHeaderRelativeOffset(value); photo.SetMatchingProperty(tag, headerType, _binaryReader.ReadUnsignedRational()); break; case ExifFieldType.UnsignedLong: photo.SetMatchingProperty(tag, headerType, value); break; } _jpegFileReader.BaseStream.Seek(currentPos + 2 + 4 + 4, SeekOrigin.Begin); }
public void ReadTag(ushort tag, ExifHeader headerType, ExifPhoto photo) { var currentPos = _jpegFileReader.BaseStream.Position; var fieldtype = (ExifFieldType)_binaryReader.ReadUInt16(); var length = _binaryReader.ReadUInt32(); var value = _binaryReader.ReadUInt32(); switch (fieldtype) { case ExifFieldType.AsciiStrings: SeekToTiffHeaderRelativeOffset(value); photo.SetMatchingProperty(tag, headerType, _binaryReader.ReadString((int)length)); break; case ExifFieldType.UnsignedRational: SeekToTiffHeaderRelativeOffset(value); photo.SetMatchingProperty(tag, headerType, _binaryReader.ReadUnsignedRational()); break; case ExifFieldType.UnsignedLong: photo.SetMatchingProperty(tag, headerType, value); break; } _jpegFileReader.BaseStream.Seek(currentPos + 2 + 4 + 4, SeekOrigin.Begin); }
public void ReadIFDHeader(ExifHeader headerType, uint headerPosition, ExifPhoto photo) { SeekToTiffHeaderRelativeOffset(headerPosition); var numberOfTags = _binaryReader.ReadUInt16(); for (var i = 0; i < numberOfTags; i++) { var tag = _binaryReader.ReadUInt16(); if (ExifPhoto.HasMatchingProperty(tag, headerType)) { ReadTag(tag, headerType, photo); if (!photo.HasUnsetProperties(headerType)) break; } else MoveToTheNextTag(); } }
public ExifPhoto GetPhotoInfo() { var fileHeader = _jpegFileReader.ReadBytes(2); if (!IsJpeg(fileHeader)) { throw new InvalidDataException("File is not a recognisable jpeg file"); } var nextHeader = _jpegFileReader.ReadBytes(2); if (!IsExif(nextHeader)) { if (!IsJfif(nextHeader)) { throw new InvalidDataException("File does not start with JPEG Exif header"); } var jfifLength = _binaryReader.ReadUInt16(); _jpegFileReader.BaseStream.Seek(jfifLength - 2, SeekOrigin.Current); nextHeader = _jpegFileReader.ReadBytes(2); if (!IsExif(nextHeader)) { throw new InvalidDataException("Could not find Exif header"); } TiffHeaderOffset = _jpegFileReader.BaseStream.Position + 8; } if (!IsBigEndian()) { _binaryReader = new LittleEndianBinaryReader(_jpegFileReader); } var photo = new ExifPhoto(); ReadIFDHeader(ExifHeader.IFD0, 8, photo); if (photo.SubIFDPosition == 0) { throw new InvalidDataException("Have not found ExifSubIdTag inside the file"); } ReadIFDHeader(ExifHeader.SubIFD, photo.SubIFDPosition, photo); if (photo.Manufacturer == null || photo.Model == null) { throw new InvalidDataException("Could not read photo manufacturer or model from the Exif header"); } return(photo); }
public void ReadIFDHeader(ExifHeader headerType, uint headerPosition, ExifPhoto photo) { SeekToTiffHeaderRelativeOffset(headerPosition); var numberOfTags = _binaryReader.ReadUInt16(); for (var i = 0; i < numberOfTags; i++) { var tag = _binaryReader.ReadUInt16(); if (ExifPhoto.HasMatchingProperty(tag, headerType)) { ReadTag(tag, headerType, photo); if (!photo.HasUnsetProperties(headerType)) { break; } } else { MoveToTheNextTag(); } } }
private void AddFocalLength(ExifPhoto photo) { var manufacturerElement = _focalLengths.GetOrAdd(photo.Manufacturer, new ConcurrentDictionary<string, ConcurrentDictionary<decimal, int>>()); var modelElement = manufacturerElement.GetOrAdd(photo.Model, new ConcurrentDictionary<decimal, int>()); var focalLengthElement = modelElement.AddOrUpdate(photo.FocalLength, 1, (x, y) => y + 1); }
public ExifPhoto GetPhotoInfo() { var fileHeader = _jpegFileReader.ReadBytes(2); if (!IsJpeg(fileHeader)) throw new InvalidDataException("File is not a recognisable jpeg file"); var nextHeader = _jpegFileReader.ReadBytes(2); if (!IsExif(nextHeader)) { if (!IsJfif(nextHeader)) throw new InvalidDataException("File does not start with JPEG Exif header"); var jfifLength = _binaryReader.ReadUInt16(); _jpegFileReader.BaseStream.Seek(jfifLength - 2, SeekOrigin.Current); nextHeader = _jpegFileReader.ReadBytes(2); if (!IsExif(nextHeader)) throw new InvalidDataException("Could not find Exif header"); TiffHeaderOffset = _jpegFileReader.BaseStream.Position + 8; } if (!IsBigEndian()) _binaryReader = new LittleEndianBinaryReader(_jpegFileReader); var photo = new ExifPhoto(); ReadIFDHeader(ExifHeader.IFD0, 8, photo); if (photo.SubIFDPosition == 0) throw new InvalidDataException("Have not found ExifSubIdTag inside the file"); ReadIFDHeader(ExifHeader.SubIFD, photo.SubIFDPosition, photo); if (photo.Manufacturer == null || photo.Model == null) throw new InvalidDataException("Could not read photo manufacturer or model from the Exif header"); return photo; }