SickGear/lib/hachoir/metadata/cr2.py
2023-02-09 13:41:15 +00:00

59 lines
1.8 KiB
Python

"""
Canon CR2 raw image data, version 2.0 image metadata extractor.
Authors: Fernando Crespo
Creation date: 21 february 2017
"""
from hachoir.metadata.metadata import (registerExtractor, RootMetadata)
from hachoir.parser.image import CR2File
from hachoir.metadata.safe import fault_tolerant
class CR2Metadata(RootMetadata):
key_to_attr = {
"ImageWidth": "width",
"ImageLength": "height",
"ImageDescription": "comment",
"DocumentName": "title",
"XResolution": "width_dpi",
"YResolution": "height_dpi",
}
def extract(self, tiff):
if "ifd[0]" in tiff:
self.useIFD(tiff["ifd[0]"])
self.camera_manufacturer = tiff["ifd[0]"]["value[4]"].value
self.camera_model = tiff["ifd[0]"]["value[5]"].value
if "exif[0]" in tiff:
self.date_time_original = tiff["exif[0]"]["value[7]"].value
self.date_time_digitized = tiff["exif[0]"]["value[8]"].value
def useIFD(self, ifd):
attr = {}
for entry in ifd.array("entry"):
self.processIfdEntry(ifd, entry, attr)
if 'BitsPerSample' in attr and 'SamplesPerPixel' in attr:
self.bits_per_pixel = attr[
'BitsPerSample'] * attr['SamplesPerPixel']
@fault_tolerant
def processIfdEntry(self, ifd, entry, attr):
tag = entry["tag"].display
if tag in {"BitsPerSample", "SamplesPerPixel"}:
value = ifd.getEntryValues(entry)[0].value
attr[tag] = value
return
try:
attrname = self.key_to_attr[tag]
except KeyError:
return
value = ifd.getEntryValues(entry)[0].value
if tag in {"XResolution", "YResolution"}:
value = round(value)
setattr(self, attrname, value)
registerExtractor(CR2File, CR2Metadata)