20#include "kis_exif_io.h"
25#include <libexif/exif-tag.h>
26#include <libexif/exif-log.h>
29KisExifIO::KisExifIO(KisExifInfo* ei) : m_exifInfo(ei)
33void KisExifIO::readExifFromFile(
const char* fileName)
35 readExifData( exif_data_new_from_file(fileName) );
38void KisExifIO::readExifFromMem(
const unsigned char* data ,
unsigned int size)
40 readExifData( exif_data_new_from_data(data, size) );
43void KisExifIO::saveExifToMem(
unsigned char** data,
unsigned int *size)
45 ExifData* exifData = exif_data_new();
46 writeExifData( exifData );
47 exif_data_save_data( exifData, data, size);
50ExifValue::ExifType KisExifIO::format2type(ExifFormat format)
54 case EXIF_FORMAT_BYTE:
55 return ExifValue::EXIF_TYPE_BYTE;
56 case EXIF_FORMAT_ASCII:
57 return ExifValue::EXIF_TYPE_ASCII;
58 case EXIF_FORMAT_SHORT:
59 return ExifValue::EXIF_TYPE_SHORT;
60 case EXIF_FORMAT_LONG:
61 return ExifValue::EXIF_TYPE_LONG;
62 case EXIF_FORMAT_RATIONAL:
63 return ExifValue::EXIF_TYPE_RATIONAL;
64 case EXIF_FORMAT_SBYTE:
65 return ExifValue::EXIF_TYPE_SBYTE;
66 case EXIF_FORMAT_SSHORT:
67 return ExifValue::EXIF_TYPE_SSHORT;
68 case EXIF_FORMAT_SLONG:
69 return ExifValue::EXIF_TYPE_SLONG;
70 case EXIF_FORMAT_SRATIONAL:
71 return ExifValue::EXIF_TYPE_SRATIONAL;
72 case EXIF_FORMAT_FLOAT:
73 return ExifValue::EXIF_TYPE_FLOAT;
74 case EXIF_FORMAT_DOUBLE:
75 return ExifValue::EXIF_TYPE_DOUBLE;
77 case EXIF_FORMAT_UNDEFINED:
78 return ExifValue::EXIF_TYPE_UNDEFINED;
82void KisExifIO::readExifData( ExifData* exifData)
84 ExifValue::ByteOrder bO;
85 if(exif_data_get_byte_order( exifData) == EXIF_BYTE_ORDER_MOTOROLA)
87 bO = ExifValue::BYTE_ORDER_MOTOROLA;
89 bO = ExifValue::BYTE_ORDER_INTEL;
91 static ExifIfd ifds[5] = {
95 EXIF_IFD_INTEROPERABILITY,
98 for(
int ifd = 0; ifd < 5; ifd ++)
100 ExifContent* content = exifData->ifd[ifds[ifd]];
101 kdDebug() <<
"There are " << content->count <<
" values in ifd=" << ifd << endl;
102 for (uint i = 0; i < content->count; i++)
104 ExifEntry* entry = content->entries[i];
105 TQString tagname = exif_tag_get_name ( entry->tag );
108 ExifValue value( format2type(entry->format), entry->data, entry->size, ifds[ifd], entry->components, bO );
111 m_exifInfo->setValue( tagname, value);
117ExifFormat KisExifIO::type2format( ExifValue::ExifType type)
121 case ExifValue::EXIF_TYPE_BYTE:
122 return EXIF_FORMAT_BYTE;
123 case ExifValue::EXIF_TYPE_ASCII:
124 return EXIF_FORMAT_ASCII;
125 case ExifValue::EXIF_TYPE_SHORT:
126 return EXIF_FORMAT_SHORT;
127 case ExifValue::EXIF_TYPE_LONG:
128 return EXIF_FORMAT_LONG;
129 case ExifValue::EXIF_TYPE_RATIONAL:
130 return EXIF_FORMAT_RATIONAL;
131 case ExifValue::EXIF_TYPE_SBYTE:
132 return EXIF_FORMAT_SBYTE;
133 case ExifValue::EXIF_TYPE_SSHORT:
134 return EXIF_FORMAT_SSHORT;
135 case ExifValue::EXIF_TYPE_SLONG:
136 return EXIF_FORMAT_SLONG;
137 case ExifValue::EXIF_TYPE_SRATIONAL:
138 return EXIF_FORMAT_SRATIONAL;
139 case ExifValue::EXIF_TYPE_FLOAT:
140 return EXIF_FORMAT_FLOAT;
141 case ExifValue::EXIF_TYPE_DOUBLE:
142 return EXIF_FORMAT_DOUBLE;
144 case ExifValue::EXIF_TYPE_UNDEFINED:
145 return EXIF_FORMAT_UNDEFINED;
150void KisExifIO::writeExifData( ExifData* exifData)
152 ExifValue::ByteOrder bO;
153 if(exif_data_get_byte_order( exifData) == EXIF_BYTE_ORDER_MOTOROLA)
155 bO = ExifValue::BYTE_ORDER_MOTOROLA;
157 bO = ExifValue::BYTE_ORDER_INTEL;
160 for( KisExifInfo::evMap::const_iterator it = m_exifInfo->begin(); it != m_exifInfo->end(); ++it)
162 ExifValue ev = it.data();
165 ExifEntry * entry = exif_entry_new();
166 ExifContent* content = exifData->ifd[ev.ifd()];
167 exif_content_add_entry(content, entry);
168 kdDebug() <<
"Saving tag:" << it.key() <<
" " << ev.toString() << endl;
169 ExifTag tag = exif_tag_from_name( it.key().ascii());
170 entry->components = ev.components();
171 entry->format = type2format( ev.type());
174 ev.convertToData(&entry->data, &entry->size, bO);