From 2dc92f4bfe9e81edc2b0b24ecacf3bc44b344984 Mon Sep 17 00:00:00 2001 From: alwin Date: Mon, 01 Nov 2004 19:52:25 +0000 Subject: exif class added (taken from opie-eye_slave and more c++ like reworked) it is used in oimageview while loading jpegs checking BEFORE loading if the image should be scaled loaded. ToDo: documentation of the interface, remove it from opie-eye_slave (it should use of course the library version) --- (limited to 'libopie2/opiemm/opieexif.h') diff --git a/libopie2/opiemm/opieexif.h b/libopie2/opiemm/opieexif.h new file mode 100644 index 0000000..efaed71 --- a/dev/null +++ b/libopie2/opiemm/opieexif.h @@ -0,0 +1,139 @@ +#ifndef _OPIE_EXIF_H +#define _OPIE_EXIF_H + +#include +#include +#include +#include + +#include + +namespace Opie { namespace MM { + +#ifndef uchar +typedef unsigned char uchar; +#endif + +//#define MAX_SECTIONS 20 +//#define PSEUDO_IMAGE_MARKER 0x123; // Extra value. + +//! Class for reading exif data from images +/*! + * This class is mostly used inside OImageScrollView for testing jpegs headers for a faster + * loading and scaling. It is taken from libexif and converted into an C++ structure. + * + * \see OImageScrollView + * \since 1.2 + */ +class ExifData { +public: + enum ReadMode_t { + READ_EXIF = 1, + READ_IMAGE = 2, + READ_ALL = 3 + }; + + //-------------------------------------------------------------------------- + // This structure is used to store jpeg file sections in memory. + struct Section_t { + uchar * Data; + int Type; + unsigned Size; + }; + + struct TagTable_t { + unsigned short Tag; + const char*const Desc; + }; + +private: + static const int MAX_SECTIONS=20; + static const unsigned int PSEUDO_IMAGE_MARKER=0x123; + Section_t Sections[MAX_SECTIONS]; + + QString CameraMake; + QString CameraModel; + QString DateTime; + int Orientation; + int Height, Width; + int ExifImageLength, ExifImageWidth; + int IsColor; + int Process; + int FlashUsed; + float FocalLength; + float ExposureTime; + float ApertureFNumber; + float Distance; + int Whitebalance; + int MeteringMode; + float CCDWidth; + float ExposureBias; + int ExposureProgram; + int ISOequivalent; + int CompressionLevel; + QString UserComment; + QString Comment; + QImage Thumbnail; + + unsigned char * LastExifRefd; + int ExifSettingsLength; + double FocalplaneXRes; + double FocalplaneUnits; + int MotorolaOrder; + int SectionsRead; + + int ReadJpegSections (QFile & infile, ReadMode_t ReadMode); + void DiscardData(void); + int Get16u(void * Short); + int Get32s(void * Long); + unsigned Get32u(void * Long); + double ConvertAnyFormat(void * ValuePtr, int Format); + void ProcessExifDir(unsigned char * DirStart, unsigned char * OffsetBase, unsigned ExifLength); + void process_COM (const uchar * Data, int length); + void process_SOFn (const uchar * Data, int marker); + int Get16m(const void * Short); + void process_EXIF(unsigned char * CharBuf, unsigned int length); + int Exif2tm(struct ::tm * timeptr, char * ExifTime); + +public: + //! Contructor for initialising + ExifData(); + //! destructor + virtual ~ExifData(); + //! scan a given file + /*! + * try to scan the EXIF data of a image file + * \param aFile the file to scan + * \return true if success, otherwise false + */ + bool scan(const QString &aFile); + QString getCameraMake() { return CameraMake; } + QString getCameraModel() { return CameraModel; } + QString getDateTime() { return DateTime; } + int getOrientation() { return Orientation; } + int getHeight() { return Height; } + int getWidth() { return Width; } + int getIsColor() { return IsColor; } + int getProcess() { return Process; } + int getFlashUsed() { return FlashUsed; } + float getFocalLength() { return FocalLength; } + float getExposureTime() { return ExposureTime; } + float getApertureFNumber() { return ApertureFNumber; } + float getDistance() { return Distance; } + int getWhitebalance() { return Whitebalance; } + int getMeteringMode() { return MeteringMode; } + float getCCDWidth() { return CCDWidth; } + float getExposureBias() { return ExposureBias; } + int getExposureProgram() { return ExposureProgram; } + int getISOequivalent() { return ISOequivalent; } + int getCompressionLevel() { return CompressionLevel; } + QString getUserComment() { return UserComment; } + QString getComment() { return Comment; } + QImage getThumbnail(); + bool isThumbnailSane(); + bool isNullThumbnail() { return !isThumbnailSane(); } +}; + +} +} +#endif -- cgit v0.9.0.2