Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
 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();
     }
 }
Example #4
0
        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);
        }
Example #5
0
        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();
                }
            }
        }
Example #6
0
 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);
 }
Example #7
0
        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;
        }