def __init__(self, file): core.Image.__init__(self) self.iptc = None self.mime = 'image/tiff' self.type = 'TIFF image' self.intel = 0 iptc = {} header = file.read(8) if header[:4] == MOTOROLASIGNATURE: self.intel = 0 (offset, ) = struct.unpack(">I", header[4:8]) file.seek(offset) (len, ) = struct.unpack(">H", file.read(2)) app = file.read(len * 12) for i in range(len): (tag, type, length, value, offset) = \ struct.unpack('>HHIHH', app[i*12:i*12+12]) if tag == 0x8649: file.seek(offset, 0) iptc = IPTC.parseiptc(file.read(1000)) elif tag == 0x0100: if value != 0: self.width = value else: self.width = offset elif tag == 0x0101: if value != 0: self.height = value else: self.height = offset elif header[:4] == INTELSIGNATURE: self.intel = 1 (offset, ) = struct.unpack("<I", header[4:8]) file.seek(offset, 0) (len, ) = struct.unpack("<H", file.read(2)) app = file.read(len * 12) for i in range(len): (tag, type, length, offset, value) = \ struct.unpack('<HHIHH', app[i*12:i*12+12]) if tag == 0x8649: file.seek(offset) iptc = IPTC.parseiptc(file.read(1000)) elif tag == 0x0100: if value != 0: self.width = value else: self.width = offset elif tag == 0x0101: if value != 0: self.height = value else: self.height = offset else: raise core.ParseError() if iptc: self._appendtable('IPTC', iptc)
def __init__(self,file): core.Image.__init__(self) self.iptc = None self.mime = 'image/tiff' self.type = 'TIFF image' self.intel = 0 iptc = {} header = file.read(8) if header[:4] == MOTOROLASIGNATURE: self.intel = 0 (offset,) = struct.unpack(">I", header[4:8]) file.seek(offset) (len,) = struct.unpack(">H", file.read(2)) app = file.read(len*12) for i in range(len): (tag, type, length, value, offset) = \ struct.unpack('>HHIHH', app[i*12:i*12+12]) if tag == 0x8649: file.seek(offset,0) iptc = IPTC.parseiptc(file.read(1000)) elif tag == 0x0100: if value != 0: self.width = value else: self.width = offset elif tag == 0x0101: if value != 0: self.height = value else: self.height = offset elif header[:4] == INTELSIGNATURE: self.intel = 1 (offset,) = struct.unpack("<I", header[4:8]) file.seek(offset,0) (len,) = struct.unpack("<H", file.read(2)) app = file.read(len*12) for i in range(len): (tag, type, length, offset, value) = \ struct.unpack('<HHIHH', app[i*12:i*12+12]) if tag == 0x8649: file.seek(offset) iptc = IPTC.parseiptc(file.read(1000)) elif tag == 0x0100: if value != 0: self.width = value else: self.width = offset elif tag == 0x0101: if value != 0: self.height = value else: self.height = offset else: raise core.ParseError() if iptc: self._appendtable('IPTC', iptc)
def __init__(self, file): core.Image.__init__(self) self.mime = 'image/jpeg' self.type = 'jpeg image' if file.read(2) != '\xff\xd8': raise core.ParseError() file.seek(-2, 2) if file.read(2) != '\xff\xd9': # Normally an JPEG should end in ffd9. This does not however # we assume it's an jpeg for now log.info("Wrong encode found for jpeg") file.seek(2) app = file.read(4) self.meta = {} while (len(app) == 4): (ff, segtype, seglen) = struct.unpack(">BBH", app) if ff != 0xff: break if segtype == 0xd9: break elif SOF.has_key(segtype): data = file.read(seglen - 2) (precision,self.height,self.width,\ num_comp) = struct.unpack('>BHHB', data[:6]) elif segtype == 0xe1: data = file.read(seglen - 2) type = data[:data.find('\0')] if type == 'Exif': # create a fake file from the data we have to # pass it to the EXIF parser fakefile = cStringIO.StringIO() fakefile.write('\xFF\xD8') fakefile.write(app) fakefile.write(data) fakefile.seek(0) exif = EXIF.process_file(fakefile) fakefile.close() if exif: self.thumbnail = exif.get('JPEGThumbnail', None) if self.thumbnail: self.thumbnail = str(self.thumbnail) self._appendtable('EXIF', exif) if 'Image Orientation' in exif: orientation = str(exif['Image Orientation']) if orientation.find('90 CW') > 0: self.rotation = 90 elif orientation.find('90') > 0: self.rotation = 270 elif orientation.find('180') > 0: self.rotation = 180 t = exif.get('Image DateTimeOriginal') if not t: # sometimes it is called this way t = exif.get('EXIF DateTimeOriginal') if not t: t = exif.get('Image DateTime') if t: try: t = time.strptime(str(t), '%Y:%m:%d %H:%M:%S') self.timestamp = int(time.mktime(t)) except ValueError: # Malformed time string. pass elif type == 'http://ns.adobe.com/xap/1.0/': # FIXME: parse XMP data (xml) doc = data[data.find('\0') + 1:] else: pass elif segtype == 0xed: iptc = IPTC.parseiptc(file.read(seglen - 2)) if iptc: self._appendtable('IPTC', iptc) elif segtype == 0xe7: # information created by libs like epeg data = file.read(seglen - 2) if data.count('\n') == 1: key, value = data.split('\n') self.meta[key] = value elif segtype == 0xfe: self.comment = file.read(seglen - 2) if self.comment.startswith('<?xml'): # This could be a comment based on # http://www.w3.org/TR/photo-rdf/ log.error('xml comment parser not integrated') self.comment = '' else: # Huffman table marker (FFC4) # Start of Scan marker (FFDA) # Quantization table marker (FFDB) # Restart Interval (FFDD) ??? if not segtype in (0xc4, 0xda, 0xdb, 0xdd): log.info("SEGMENT: 0x%x%x, len=%d" % (ff, segtype, seglen)) file.seek(seglen - 2, 1) app = file.read(4) if len(self.meta.keys()): self._appendtable('JPGMETA', self.meta) for key, value in self.meta.items(): if key.startswith('Thumb:') or key == 'Software': self._set(key, value)
def __init__(self,file): mediainfo.ImageInfo.__init__(self) iptc_info = None self.mime = 'image/jpeg' self.type = 'jpeg image' self.valid = 1 if file.read(2) != '\xff\xd8': self.valid = 0 return file.seek(-2,2) if file.read(2) != '\xff\xd9': # Normally an JPEG should end in ffd9. This does not however # we assume it's an jpeg for now mediainfo._debug("Wrong encode found for jpeg") file.seek(2) app = file.read(4) self.meta = {} while (len(app) == 4): (ff,segtype,seglen) = struct.unpack(">BBH", app) if ff != 0xff: break _debug("SEGMENT: 0x%x%x, len=%d" % (ff,segtype,seglen)) if segtype == 0xd9: break elif SOF.has_key(segtype): data = file.read(seglen-2) (precision,self.height,self.width,num_comp) = struct.unpack('>BHHB', data[:6]) #_debug("H/W: %i / %i" % (self.height, self.width)) elif segtype == 0xed: app = file.read(seglen-2) iptc_info = IPTC.flatten(IPTC.parseiptc(app)) break elif segtype == 0xe7: # information created by libs like epeg data = file.read(seglen-2) if data.count('\n') == 1: key, value = data.split('\n') self.meta[key] = value else: file.seek(seglen-2,1) app = file.read(4) file.seek(0) exif_info = EXIF.process_file(file) if exif_info: self.setitem( 'date', exif_info, 'Image DateTime', True ) self.setitem( 'artist', exif_info, 'Image Artist', True ) self.setitem( 'hardware', exif_info, 'Image Model', True ) self.setitem( 'software', exif_info, 'Image Software', True ) self.setitem( 'thumbnail', exif_info, 'JPEGThumbnail', True ) self.appendtable( 'EXIF', exif_info ) if iptc_info: self.setitem( 'title', iptc_info, 517, True ) self.setitem( 'date' , iptc_info, 567, True ) self.setitem( 'comment', iptc_info, 617, True ) self.setitem( 'keywords', iptc_info, 537, True ) self.setitem( 'artist', iptc_info, 592, True ) self.setitem( 'country', iptc_info, 612, True ) self.setitem( 'caption', iptc_info, 632, True ) self.appendtable( 'IPTC', iptc_info ) if len(self.meta.keys()): self.appendtable( 'JPGMETA', self.meta ) for key, value in self.meta.items(): if key.startswith('Thumb:') or key == 'Software': setattr(self, key, value) if not key in self.keys: self.keys.append(key) ImageInfo.add(file.name, self) return
def __init__(self,file): core.Image.__init__(self) self.mime = 'image/jpeg' self.type = 'jpeg image' if file.read(2) != '\xff\xd8': raise core.ParseError() file.seek(-2,2) if file.read(2) != '\xff\xd9': # Normally an JPEG should end in ffd9. This does not however # we assume it's an jpeg for now log.info("Wrong encode found for jpeg") file.seek(2) app = file.read(4) self.meta = {} while (len(app) == 4): (ff,segtype,seglen) = struct.unpack(">BBH", app) if ff != 0xff: break if segtype == 0xd9: break elif SOF.has_key(segtype): data = file.read(seglen-2) (precision,self.height,self.width,\ num_comp) = struct.unpack('>BHHB', data[:6]) elif segtype == 0xe1: data = file.read(seglen-2) type = data[:data.find('\0')] if type == 'Exif': # create a fake file from the data we have to # pass it to the EXIF parser fakefile = cStringIO.StringIO() fakefile.write('\xFF\xD8') fakefile.write(app) fakefile.write(data) fakefile.seek(0) exif = EXIF.process_file(fakefile) fakefile.close() if exif: self.thumbnail = exif.get('JPEGThumbnail', None) if self.thumbnail: self.thumbnail = str(self.thumbnail) self._appendtable('EXIF', exif) if 'Image Orientation' in exif: orientation = str(exif['Image Orientation']) if orientation.find('90 CW') > 0: self.rotation = 90 elif orientation.find('90') > 0: self.rotation = 270 elif orientation.find('180') > 0: self.rotation = 180 t = exif.get('Image DateTimeOriginal') if not t: # sometimes it is called this way t = exif.get('EXIF DateTimeOriginal') if not t: t = exif.get('Image DateTime') if t: try: t = time.strptime(str(t), '%Y:%m:%d %H:%M:%S') self.timestamp = int(time.mktime(t)) except ValueError: # Malformed time string. pass elif type == 'http://ns.adobe.com/xap/1.0/': # FIXME: parse XMP data (xml) doc = data[data.find('\0')+1:] else: pass elif segtype == 0xed: iptc = IPTC.parseiptc(file.read(seglen-2)) if iptc: self._appendtable('IPTC', iptc) elif segtype == 0xe7: # information created by libs like epeg data = file.read(seglen-2) if data.count('\n') == 1: key, value = data.split('\n') self.meta[key] = value elif segtype == 0xfe: self.comment = file.read(seglen-2) if self.comment.startswith('<?xml'): # This could be a comment based on # http://www.w3.org/TR/photo-rdf/ log.error('xml comment parser not integrated') self.comment = '' else: # Huffman table marker (FFC4) # Start of Scan marker (FFDA) # Quantization table marker (FFDB) # Restart Interval (FFDD) ??? if not segtype in (0xc4, 0xda, 0xdb, 0xdd): log.info("SEGMENT: 0x%x%x, len=%d" % (ff,segtype,seglen)) file.seek(seglen-2,1) app = file.read(4) if len(self.meta.keys()): self._appendtable( 'JPGMETA', self.meta ) for key, value in self.meta.items(): if key.startswith('Thumb:') or key == 'Software': self._set(key, value)
def __init__(self, file): mediainfo.ImageInfo.__init__(self) iptc_info = None self.mime = 'image/jpeg' self.type = 'jpeg image' self.valid = 1 if file.read(2) != '\xff\xd8': self.valid = 0 return file.seek(-2, 2) if file.read(2) != '\xff\xd9': # Normally an JPEG should end in ffd9. This does not however # we assume it's an jpeg for now mediainfo._debug("Wrong encode found for jpeg") file.seek(2) app = file.read(4) self.meta = {} while (len(app) == 4): (ff, segtype, seglen) = struct.unpack(">BBH", app) if ff != 0xff: break _debug("SEGMENT: 0x%x%x, len=%d" % (ff, segtype, seglen)) if segtype == 0xd9: break elif SOF.has_key(segtype): data = file.read(seglen - 2) (precision, self.height, self.width, num_comp) = struct.unpack('>BHHB', data[:6]) #_debug("H/W: %i / %i" % (self.height, self.width)) elif segtype == 0xed: app = file.read(seglen - 2) iptc_info = IPTC.flatten(IPTC.parseiptc(app)) break elif segtype == 0xe7: # information created by libs like epeg data = file.read(seglen - 2) if data.count('\n') == 1: key, value = data.split('\n') self.meta[key] = value else: file.seek(seglen - 2, 1) app = file.read(4) file.seek(0) exif_info = EXIF.process_file(file) if exif_info: self.setitem('date', exif_info, 'Image DateTime', True) self.setitem('artist', exif_info, 'Image Artist', True) self.setitem('hardware', exif_info, 'Image Model', True) self.setitem('software', exif_info, 'Image Software', True) self.setitem('thumbnail', exif_info, 'JPEGThumbnail', True) self.appendtable('EXIF', exif_info) if iptc_info: self.setitem('title', iptc_info, 517, True) self.setitem('date', iptc_info, 567, True) self.setitem('comment', iptc_info, 617, True) self.setitem('keywords', iptc_info, 537, True) self.setitem('artist', iptc_info, 592, True) self.setitem('country', iptc_info, 612, True) self.setitem('caption', iptc_info, 632, True) self.appendtable('IPTC', iptc_info) if len(self.meta.keys()): self.appendtable('JPGMETA', self.meta) for key, value in self.meta.items(): if key.startswith('Thumb:') or key == 'Software': setattr(self, key, value) if not key in self.keys: self.keys.append(key) ImageInfo.add(file.name, self) return
def __init__(self,file): mediainfo.ImageInfo.__init__(self) self.iptc = None self.mime = 'image/tiff' self.type = 'TIFF image' self.intel = 0 self.valid = 0 iptc = {} header = file.read(8) if header[:4] == MOTOROLASIGNATURE: self.valid = 1 self.intel = 0 (offset,) = struct.unpack(">I", header[4:8]) file.seek(offset) (len,) = struct.unpack(">H", file.read(2)) app = file.read(len*12) for i in range(len): (tag, type, length, value, offset) = struct.unpack('>HHIHH', app[i*12:i*12+12]) _debug("[%i/%i] tag: 0x%.4x, type 0x%.4x, len %d, value %d, offset %d)" % (i,len,tag,type,length,value,offset)) if tag == 0x8649: file.seek(offset,0) iptc = IPTC.flatten(IPTC.parseiptc(file.read(1000))) elif tag == 0x0100: if value != 0: self.width = value else: self.width = offset elif tag == 0x0101: if value != 0: self.height = value else: self.height = offset elif header[:4] == INTELSIGNATURE: self.valid = 1 self.intel = 1 (offset,) = struct.unpack("<I", header[4:8]) file.seek(offset,0) (len,) = struct.unpack("<H", file.read(2)) app = file.read(len*12) for i in range(len): (tag, type, length, offset, value) = struct.unpack('<HHIHH', app[i*12:i*12+12]) _debug("[%i/%i] tag: 0x%.4x, type 0x%.4x, len %d, value %d, offset %d)" % (i,len,tag,type,length,value,offset)) if tag == 0x8649: file.seek(offset) iptc = IPTC.flatten(IPTC.parseiptc(file.read(1000))) elif tag == 0x0100: if value != 0: self.width = value else: self.width = offset elif tag == 0x0101: if value != 0: self.height = value else: self.height = offset else: ImageInfo.add(file.name, self) return if iptc: self.setitem( 'title', iptc, 517 ) self.setitem( 'date' , iptc, 567 ) self.setitem( 'comment', iptc, 617 ) self.setitem( 'keywords', iptc, 537 ) self.setitem( 'artist', iptc, 592 ) self.setitem( 'country', iptc, 612 ) self.setitem( 'caption', iptc, 632 ) self.appendtable('IPTC', iptc) ImageInfo.add(file.name, self) return