/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the Qt scene graph research project. ** ** $QT_BEGIN_LICENSE:LGPL$ ** No Commercial Usage ** This file contains pre-release code and may not be distributed. ** You may use this file in accordance with the terms and conditions ** contained in the Technology Preview License Agreement accompanying ** this package. ** ** GNU Lesser General Public License Usage ** Alternatively, this file may be used under the terms of the GNU Lesser ** General Public License version 2.1 as published by the Free Software ** Foundation and appearing in the file LICENSE.LGPL included in the ** packaging of this file. Please review the following information to ** ensure the GNU Lesser General Public License version 2.1 requirements ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** ** ** ** ** ** ** ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // This file was copied from Qt Extended 4.5 #ifndef QEXIFIMAGEHEADER_H_ #define QEXIFIMAGEHEADER_H_ #include #include #include #include #include #include typedef QPair QExifURational; typedef QPair QExifSRational; class QExifValuePrivate; class QExifValue { public: enum Type { Byte = 1, Ascii = 2, Short = 3, Long = 4, Rational = 5, Undefined = 7, SignedLong = 9, SignedRational = 10 }; enum TextEncoding { NoEncoding, AsciiEncoding, JisEncoding, UnicodeEncoding, UndefinedEncoding }; QExifValue(); QExifValue(quint8 value); QExifValue(const QVector &value); QExifValue(const QString &value, TextEncoding encoding = NoEncoding); QExifValue(quint16 value); QExifValue(const QVector &value); QExifValue(quint32 value); QExifValue(const QVector &value); QExifValue(const QExifURational &value); QExifValue(const QVector &value); QExifValue(const QByteArray &value); QExifValue(qint32 value); QExifValue(const QVector &value); QExifValue(const QExifSRational &value); QExifValue(const QVector &value); QExifValue(const QDateTime &value); QExifValue(const QExifValue &other); QExifValue &operator=(const QExifValue &other); ~QExifValue(); bool operator==(const QExifValue &other) const; bool isNull() const; int type() const; int count() const; TextEncoding encoding() const; quint8 toByte() const; QVector toByteVector() const; QString toString() const; quint16 toShort() const; QVector toShortVector() const; quint32 toLong() const; QVector toLongVector() const; QExifURational toRational() const; QVector toRationalVector() const; QByteArray toByteArray() const; qint32 toSignedLong() const; QVector toSignedLongVector() const; QExifSRational toSignedRational() const; QVector toSignedRationalVector() const; QDateTime toDateTime() const; private: QExplicitlySharedDataPointer d; }; struct ExifIfdHeader; class QExifImageHeaderPrivate; class QExifImageHeader { Q_DISABLE_COPY(QExifImageHeader) public: enum ImageTag { ImageWidth = 0x0100, ImageLength = 0x0101, BitsPerSample = 0x0102, Compression = 0x0103, PhotometricInterpretation = 0x0106, Orientation = 0x0112, SamplesPerPixel = 0x0115, PlanarConfiguration = 0x011C, YCbCrSubSampling = 0x0212, XResolution = 0x011A, YResolution = 0x011B, ResolutionUnit = 0x0128, StripOffsets = 0x0111, RowsPerStrip = 0x0116, StripByteCounts = 0x0117, TransferFunction = 0x012D, WhitePoint = 0x013E, PrimaryChromaciticies = 0x013F, YCbCrCoefficients = 0x0211, ReferenceBlackWhite = 0x0214, DateTime = 0x0132, ImageDescription = 0x010E, Make = 0x010F, Model = 0x0110, Software = 0x0131, Artist = 0x013B, Copyright = 0x8298 }; enum ExifExtendedTag { ExifVersion = 0x9000, FlashPixVersion = 0xA000, ColorSpace = 0xA001, ComponentsConfiguration = 0x9101, CompressedBitsPerPixel = 0x9102, PixelXDimension = 0xA002, PixelYDimension = 0xA003, MakerNote = 0x927C, UserComment = 0x9286, RelatedSoundFile = 0xA004, DateTimeOriginal = 0x9003, DateTimeDigitized = 0x9004, SubSecTime = 0x9290, SubSecTimeOriginal = 0x9291, SubSecTimeDigitized = 0x9292, ImageUniqueId = 0xA420, ExposureTime = 0x829A, FNumber = 0x829D, ExposureProgram = 0x8822, SpectralSensitivity = 0x8824, ISOSpeedRatings = 0x8827, Oecf = 0x8828, ShutterSpeedValue = 0x9201, ApertureValue = 0x9202, BrightnessValue = 0x9203, ExposureBiasValue = 0x9204, MaxApertureValue = 0x9205, SubjectDistance = 0x9206, MeteringMode = 0x9207, LightSource = 0x9208, Flash = 0x9209, FocalLength = 0x920A, SubjectArea = 0x9214, FlashEnergy = 0xA20B, SpatialFrequencyResponse = 0xA20C, FocalPlaneXResolution = 0xA20E, FocalPlaneYResolution = 0xA20F, FocalPlaneResolutionUnit = 0xA210, SubjectLocation = 0xA214, ExposureIndex = 0xA215, SensingMethod = 0xA217, FileSource = 0xA300, SceneType = 0xA301, CfaPattern = 0xA302, CustomRendered = 0xA401, ExposureMode = 0xA402, WhiteBalance = 0xA403, DigitalZoomRatio = 0xA404, FocalLengthIn35mmFilm = 0xA405, SceneCaptureType = 0xA406, GainControl = 0xA407, Contrast = 0xA408, Saturation = 0xA409, Sharpness = 0xA40A, DeviceSettingDescription = 0xA40B, SubjectDistanceRange = 0x40C }; enum GpsTag { GpsVersionId = 0x0000, GpsLatitudeRef = 0x0001, GpsLatitude = 0x0002, GpsLongitudeRef = 0x0003, GpsLongitude = 0x0004, GpsAltitudeRef = 0x0005, GpsAltitude = 0x0006, GpsTimeStamp = 0x0007, GpsSatellites = 0x0008, GpsStatus = 0x0009, GpsMeasureMode = 0x000A, GpsDop = 0x000B, GpsSpeedRef = 0x000C, GpsSpeed = 0x000D, GpsTrackRef = 0x000E, GpsTrack = 0x000F, GpsImageDirectionRef = 0x0010, GpsImageDirection = 0x0011, GpsMapDatum = 0x0012, GpsDestLatitudeRef = 0x0013, GpsDestLatitude = 0x0014, GpsDestLongitudeRef = 0x0015, GpsDestLongitude = 0x0016, GpsDestBearingRef = 0x0017, GpsDestBearing = 0x0018, GpsDestDistanceRef = 0x0019, GpsDestDistance = 0x001A, GpsProcessingMethod = 0x001B, GpsAreaInformation = 0x001C, GpsDateStamp = 0x001D, GpsDifferential = 0x001E }; QExifImageHeader(); explicit QExifImageHeader(const QString &fileName); ~QExifImageHeader(); bool loadFromJpeg(const QString &fileName); bool loadFromJpeg(QIODevice *device); bool saveToJpeg(const QString &fileName) const; bool saveToJpeg(QIODevice *device) const; bool read(QIODevice *device); qint64 write(QIODevice *device) const; qint64 size() const; QSysInfo::Endian byteOrder() const; void clear(); QList imageTags() const; QList extendedTags() const; QList gpsTags() const; bool contains(ImageTag tag) const; bool contains(ExifExtendedTag tag) const; bool contains(GpsTag tag) const; void remove(ImageTag tag); void remove(ExifExtendedTag tag); void remove(GpsTag tag); QExifValue value(ImageTag tag) const; QExifValue value(ExifExtendedTag tag) const; QExifValue value(GpsTag tag) const; void setValue(ImageTag tag, const QExifValue &value); void setValue(ExifExtendedTag tag, const QExifValue &value); void setValue(GpsTag tag, const QExifValue &value); QImage thumbnail() const; void setThumbnail(const QImage &thumbnail); private: enum PrivateTag { ExifIfdPointer = 0x8769, GpsInfoIfdPointer = 0x8825, InteroperabilityIfdPointer = 0xA005, JpegInterchangeFormat = 0x0201, JpegInterchangeFormatLength = 0x0202 }; QByteArray extractExif(QIODevice *device) const; QList readIfdHeaders(QDataStream &stream) const; QExifValue readIfdValue(QDataStream &stream, int startPos, const ExifIfdHeader &header) const; template QMap readIfdValues(QDataStream &stream, int startPos, const QList &headers) const; template QMap readIfdValues(QDataStream &stream, int startPos, const QExifValue &pointer) const; quint32 writeExifHeader(QDataStream &stream, quint16 tag, const QExifValue &value, quint32 offset) const; void writeExifValue(QDataStream &stream, const QExifValue &value) const; template quint32 writeExifHeaders(QDataStream &stream, const QMap &values, quint32 offset) const; template void writeExifValues(QDataStream &target, const QMap &values) const; quint32 sizeOf(const QExifValue &value) const; template quint32 calculateSize(const QMap &values) const; QExifImageHeaderPrivate *d; }; #endif // ifndef QEXIFIMAGEHEADER_H_