degal/lib/exif_data.py
author Tero Marttila <terom@fixme.fi>
Sun, 14 Jun 2009 16:10:30 +0300
branchnew-exif
changeset 108 f74d8cf678ce
parent 106 degal/exif_data.py@a4f605bd122c
permissions -rw-r--r--
relocate the new exif module to lib/, as it's not really part of degal as such
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#!/usr/bin/env python
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
# -*- coding: utf-8 -*-
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
"""
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
    EXIF file format data, including tag names, types, etc.
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
    Most of this was copied with modifications from EXIFpy:
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
        # Library to extract EXIF information from digital camera image files
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
        # http://sourceforge.net/projects/exif-py/
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
        #
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
        # VERSION 1.1.0
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
        #
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
        # Copyright (c) 2002-2007 Gene Cash All rights reserved
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
        # Copyright (c) 2007-2008 Ianaré Sévi All rights reserved
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
        #
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
        # Redistribution and use in source and binary forms, with or without
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
        # modification, are permitted provided that the following conditions
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
        # are met:
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
        #
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
        #  1. Redistributions of source code must retain the above copyright
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
        #     notice, this list of conditions and the following disclaimer.
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
        #
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
        #  2. Redistributions in binary form must reproduce the above
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
        #     copyright notice, this list of conditions and the following
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
        #     disclaimer in the documentation and/or other materials provided
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
        #     with the distribution.
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
        #
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
        #  3. Neither the name of the authors nor the names of its contributors
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
        #     may be used to endorse or promote products derived from this
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
        #     software without specific prior written permission.
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
        #
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
        # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
        # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
        # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
        # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
        # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
        # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
        # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
        # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
        # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
        # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
        # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
"""
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
103
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    46
import decimal, itertools
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    47
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    48
def filter_ascii (values) :
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    49
    """
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    50
        Default post-filter for ASCII values.
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    51
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
    52
        This takes a single item of string data, splits it up into strings by ASCII-NUL.
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
    53
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
    54
        These sub-strings are then decoded into unicode as ASCII, and stripped.
103
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    55
    """
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    56
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
    57
    return [string.decode('ascii', 'replace').rstrip() for string in values[0].split('\x00') if string]
103
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    58
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    59
def build_ratio (num, denom) :
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    60
    """
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    61
        Builds a Decimal ratio out of the given numerator and denominator
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    62
    """
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
    63
    
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
    64
    # XXX: this may be slow
103
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    65
    return decimal.Decimal(num) / decimal.Decimal(denom)
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    66
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    67
def filter_ratio (values) :
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    68
    """
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    69
        Default post-filter for Ratio values.
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    70
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    71
        This takes the pairs of numerator/denominator values and builds Decimals out of them
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    72
    """
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    73
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    74
    return [build_ratio(values[i], values[i + 1]) for i in xrange(0, len(values), 2)]
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    75
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    76
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    77
# IFD Tag type information, indexed by code
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    78
#  { type_code: (type_fmt, name, filter_func) }
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    79
#
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    80
# type_fmt's that are one char will be prefixed with the count for use with struct.unpack, those with more chars will
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    81
# be repeated as many times for use with struct.unpack.
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    82
FIELD_TYPES = {
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    83
#    0x0000: (None,  'Proprietary'   ), # ??? no such type
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    84
    0x0001: ('B',   'Byte',         None            ),
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    85
    0x0002: ('s',   'ASCII',        filter_ascii    ),
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    86
    0x0003: ('H',   'Short',        None            ),
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    87
    0x0004: ('L',   'Long',         None            ),
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    88
    0x0005: ('LL',  'Ratio',        filter_ratio    ),
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    89
    0x0006: ('b',   'Signed Byte',  None            ),
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    90
    0x0007: ('s',   'Undefined',    None            ),
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    91
    0x0008: ('h',   'Signed Short', None            ),
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    92
    0x0009: ('l',   'Signed Long',  None            ),
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    93
    0x000A: ('ll',  'Signed Ratio', filter_ratio    ),
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    94
}
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
    95
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
    96
# magic value to indicate sub-IFDs
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
    97
SUB_IFD_MAGIC = object()
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
    98
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
    99
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   100
class Tag (object) :
103
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
   101
    """
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   102
        Represents an Exif Tag
103
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
   103
    """
63e89dc2d6f1 new exif.py seems to work now, although still missing sub-IFDs
Tero Marttila <terom@fixme.fi>
parents: 102
diff changeset
   104
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   105
    def __init__ (self, name) :
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   106
        """
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   107
            Build Exif tag with given name, and optional external values-filter function.
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   108
        """
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   109
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   110
        self.name = name
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   111
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   112
    def map_values (self, values) :
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   113
        """
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   114
            Map the given tag value to a printable string using the given value spec.
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   115
        """
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   116
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   117
        # default value-mapping
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   118
        return ", ".join(str(value) for value in values)
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   120
class TagDict (Tag) :
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   121
    """
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   122
        A tag with a dict mapping values to names
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   123
    """
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   124
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   125
    def __init__ (self, name, values_dict) :
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   126
        super(TagDict, self).__init__(name)
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   128
        self.values_dict = values_dict
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   129
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   130
    def map_values (self, values) :
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   131
        """
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   132
            Map the values through our dict, defaulting to the repr.
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   133
        """
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   134
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   135
        return ", ".join(self.values_dict.get(value, repr(value)) for value in values)
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   136
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   137
class TagFunc (Tag) :
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   138
    """
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   139
        A tag with a simple function mapping values to names
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   140
    """
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   141
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   142
    def __init__ (self, name, values_func) :
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   143
        super(TagFunc, self).__init__(name)
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   144
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   145
        self.values_func = values_func
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   146
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   147
    def map_values (self, values) :
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   148
        """
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   149
            Map the values through our func
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   150
        """
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   151
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   152
        return self.values_func(values)
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
106
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   154
class IFDTag (Tag) :
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   155
    """
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   156
        A tag that references another IFD
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   157
    """
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   158
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   159
    def __init__ (self, name, ifd_tags=None) :
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   160
        """
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   161
            A tag that points to another IFD block. `ifd_tags`, if given, lists the tags for that block, otherwise,
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   162
            the same tags as for the current block are used.
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   163
        """
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   164
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   165
        super(IFDTag, self).__init__(name)
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   166
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   167
        self.ifd_tags = ifd_tags
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   168
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   169
USER_COMMENT_CHARSETS = {
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   170
    'ASCII':    ('ascii',   'replace'   ),
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   171
    'JIS':      ('jis',     'error'     ),
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   172
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   173
    # XXX: WTF? What kind of charset is 'Unicode' supposed to be?
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   174
    # UTF-16? Little-endian? Big-endian?
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   175
    # Confusing reigns: http://www.cpanforum.com/threads/7329
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   176
    'UNICODE':  ('utf16',   'error'     ),
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   177
}
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   178
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   179
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   180
def decode_UserComment (values) :
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   181
    """
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   182
        A UserComment field starts with an eight-byte encoding designator.
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   183
    """
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   184
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   185
    # single binary string
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   186
    value, = values
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   187
    
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   188
    # split up
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   189
    charset, comment_raw = value[:8], value[8:]
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   190
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   191
    # strip NILs
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   192
    charset = charset.rstrip('\x00')
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   193
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   194
    # map
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   195
    encoding, replace = USER_COMMENT_CHARSETS.get(charset, ('ascii', 'replace'))
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   196
    
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   197
    # decode
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   198
    return [comment_raw.decode(encoding, replace)]
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   199
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   200
# Mappings of Exif tag codes to name and decoding information.
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   201
# { tag : (name, value_dict/value_func/None/SUB_IFD_MAGIC) }
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   202
#
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   203
# name is the official Exif tag name
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   204
# value_dict is a { value: value_name } mapping for human-readable values
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   205
# value_func is a `(values) -> values` mapping function which *overrides* the tag's type_func.
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   206
#   XXX: or does it?
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   207
# SUB_IFD_MAGIC signifies that this IFD points to 
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   208
# otherwise, the value is left as-is.
106
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   209
# interoperability tags
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   210
INTR_TAGS = {
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   211
    0x0001: Tag('InteroperabilityIndex'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   212
    0x0002: Tag('InteroperabilityVersion'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   213
    0x1000: Tag('RelatedImageFileFormat'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   214
    0x1001: Tag('RelatedImageWidth'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   215
    0x1002: Tag('RelatedImageLength'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   216
    }
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   217
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   218
# GPS tags (not used yet, haven't seen camera with GPS)
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   219
GPS_TAGS = {
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   220
    0x0000: Tag('GPSVersionID'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   221
    0x0001: Tag('GPSLatitudeRef'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   222
    0x0002: Tag('GPSLatitude'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   223
    0x0003: Tag('GPSLongitudeRef'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   224
    0x0004: Tag('GPSLongitude'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   225
    0x0005: Tag('GPSAltitudeRef'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   226
    0x0006: Tag('GPSAltitude'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   227
    0x0007: Tag('GPSTimeStamp'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   228
    0x0008: Tag('GPSSatellites'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   229
    0x0009: Tag('GPSStatus'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   230
    0x000A: Tag('GPSMeasureMode'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   231
    0x000B: Tag('GPSDOP'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   232
    0x000C: Tag('GPSSpeedRef'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   233
    0x000D: Tag('GPSSpeed'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   234
    0x000E: Tag('GPSTrackRef'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   235
    0x000F: Tag('GPSTrack'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   236
    0x0010: Tag('GPSImgDirectionRef'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   237
    0x0011: Tag('GPSImgDirection'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   238
    0x0012: Tag('GPSMapDatum'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   239
    0x0013: Tag('GPSDestLatitudeRef'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   240
    0x0014: Tag('GPSDestLatitude'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   241
    0x0015: Tag('GPSDestLongitudeRef'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   242
    0x0016: Tag('GPSDestLongitude'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   243
    0x0017: Tag('GPSDestBearingRef'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   244
    0x0018: Tag('GPSDestBearing'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   245
    0x0019: Tag('GPSDestDistanceRef'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   246
    0x001A: Tag('GPSDestDistance'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   247
    0x001D: Tag('GPSDate'),
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   248
    }
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   249
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   250
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   251
EXIF_TAGS = {
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   252
    0x0100: Tag('ImageWidth'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   253
    0x0101: Tag('ImageLength'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   254
    0x0102: Tag('BitsPerSample'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   255
    0x0103: TagDict('Compression',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   256
             {1: 'Uncompressed',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   257
              2: 'CCITT 1D',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   258
              3: 'T4/Group 3 Fax',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   259
              4: 'T6/Group 4 Fax',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   260
              5: 'LZW',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   261
              6: 'JPEG (old-style)',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   262
              7: 'JPEG',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   263
              8: 'Adobe Deflate',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   264
              9: 'JBIG B&W',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   265
              10: 'JBIG Color',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   266
              32766: 'Next',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   267
              32769: 'Epson ERF Compressed',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   268
              32771: 'CCIRLEW',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   269
              32773: 'PackBits',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   270
              32809: 'Thunderscan',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   271
              32895: 'IT8CTPAD',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   272
              32896: 'IT8LW',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   273
              32897: 'IT8MP',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   274
              32898: 'IT8BL',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   275
              32908: 'PixarFilm',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   276
              32909: 'PixarLog',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   277
              32946: 'Deflate',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   278
              32947: 'DCS',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   279
              34661: 'JBIG',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   280
              34676: 'SGILog',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   281
              34677: 'SGILog24',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   282
              34712: 'JPEG 2000',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   283
              34713: 'Nikon NEF Compressed',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   284
              65000: 'Kodak DCR Compressed',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   285
              65535: 'Pentax PEF Compressed'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   286
    0x0106: Tag('PhotometricInterpretation'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   287
    0x0107: Tag('Thresholding'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   288
    0x010A: Tag('FillOrder'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   289
    0x010D: Tag('DocumentName'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   290
    0x010E: Tag('ImageDescription'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   291
    0x010F: Tag('Make'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   292
    0x0110: Tag('Model'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   293
    0x0111: Tag('StripOffsets'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   294
    0x0112: TagDict('Orientation',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   295
             {1: 'Horizontal (normal)',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   296
              2: 'Mirrored horizontal',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   297
              3: 'Rotated 180',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   298
              4: 'Mirrored vertical',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   299
              5: 'Mirrored horizontal then rotated 90 CCW',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   300
              6: 'Rotated 90 CW',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   301
              7: 'Mirrored horizontal then rotated 90 CW',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   302
              8: 'Rotated 90 CCW'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   303
    0x0115: Tag('SamplesPerPixel'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   304
    0x0116: Tag('RowsPerStrip'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   305
    0x0117: Tag('StripByteCounts'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   306
    0x011A: Tag('XResolution'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   307
    0x011B: Tag('YResolution'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   308
    0x011C: Tag('PlanarConfiguration'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   309
    0x011D: Tag('PageName'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   310
    0x0128: TagDict('ResolutionUnit',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   311
             {1: 'Not Absolute',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   312
              2: 'Pixels/Inch',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   313
              3: 'Pixels/Centimeter'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   314
    0x012D: Tag('TransferFunction'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   315
    0x0131: Tag('Software'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   316
    0x0132: Tag('DateTime'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   317
    0x013B: Tag('Artist'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   318
    0x013E: Tag('WhitePoint'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   319
    0x013F: Tag('PrimaryChromaticities'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   320
    0x0156: Tag('TransferRange'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   321
    0x0200: Tag('JPEGProc'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   322
    0x0201: Tag('JPEGInterchangeFormat'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   323
    0x0202: Tag('JPEGInterchangeFormatLength'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   324
    0x0211: Tag('YCbCrCoefficients'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   325
    0x0212: Tag('YCbCrSubSampling'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   326
    0x0213: TagDict('YCbCrPositioning',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   327
             {1: 'Centered',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   328
              2: 'Co-sited'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   329
    0x0214: Tag('ReferenceBlackWhite'),
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   330
    
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   331
    0x4746: Tag('Rating'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   332
    
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   333
    0x828D: Tag('CFARepeatPatternDim'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   334
    0x828E: Tag('CFAPattern'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   335
    0x828F: Tag('BatteryLevel'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   336
    0x8298: Tag('Copyright'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   337
    0x829A: Tag('ExposureTime'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   338
    0x829D: Tag('FNumber'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   339
    0x83BB: Tag('IPTC/NAA'),
106
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   340
    0x8769: IFDTag('ExifOffset', None),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   341
    0x8773: Tag('InterColorProfile'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   342
    0x8822: TagDict('ExposureProgram',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   343
             {0: 'Unidentified',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   344
              1: 'Manual',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   345
              2: 'Program Normal',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   346
              3: 'Aperture Priority',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   347
              4: 'Shutter Priority',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   348
              5: 'Program Creative',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   349
              6: 'Program Action',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   350
              7: 'Portrait Mode',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   351
              8: 'Landscape Mode'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   352
    0x8824: Tag('SpectralSensitivity'),
106
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   353
    0x8825: IFDTag('GPSInfo', GPS_TAGS),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   354
    0x8827: Tag('ISOSpeedRatings'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   355
    0x8828: Tag('OECF'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   356
    0x9000: Tag('ExifVersion'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   357
    0x9003: Tag('DateTimeOriginal'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   358
    0x9004: Tag('DateTimeDigitized'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   359
    0x9101: TagDict('ComponentsConfiguration',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   360
             {0: '',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   361
              1: 'Y',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   362
              2: 'Cb',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   363
              3: 'Cr',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   364
              4: 'Red',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   365
              5: 'Green',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   366
              6: 'Blue'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   367
    0x9102: Tag('CompressedBitsPerPixel'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   368
    0x9201: Tag('ShutterSpeedValue'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   369
    0x9202: Tag('ApertureValue'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   370
    0x9203: Tag('BrightnessValue'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   371
    0x9204: Tag('ExposureBiasValue'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   372
    0x9205: Tag('MaxApertureValue'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   373
    0x9206: Tag('SubjectDistance'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   374
    0x9207: TagDict('MeteringMode',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   375
             {0: 'Unidentified',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   376
              1: 'Average',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   377
              2: 'CenterWeightedAverage',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   378
              3: 'Spot',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   379
              4: 'MultiSpot',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   380
              5: 'Pattern'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   381
    0x9208: TagDict('LightSource',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   382
             {0: 'Unknown',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   383
              1: 'Daylight',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   384
              2: 'Fluorescent',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   385
              3: 'Tungsten',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   386
              9: 'Fine Weather',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   387
              10: 'Flash',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   388
              11: 'Shade',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   389
              12: 'Daylight Fluorescent',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   390
              13: 'Day White Fluorescent',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   391
              14: 'Cool White Fluorescent',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   392
              15: 'White Fluorescent',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   393
              17: 'Standard Light A',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   394
              18: 'Standard Light B',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   395
              19: 'Standard Light C',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   396
              20: 'D55',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   397
              21: 'D65',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   398
              22: 'D75',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   399
              255: 'Other'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   400
    0x9209: TagDict('Flash',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   401
             {0: 'No',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   402
              1: 'Fired',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   403
              5: 'Fired (?)', # no return sensed
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   404
              7: 'Fired (!)', # return sensed
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   405
              9: 'Fill Fired',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   406
              13: 'Fill Fired (?)',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   407
              15: 'Fill Fired (!)',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   408
              16: 'Off',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   409
              24: 'Auto Off',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   410
              25: 'Auto Fired',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   411
              29: 'Auto Fired (?)',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   412
              31: 'Auto Fired (!)',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   413
              32: 'Not Available'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   414
    0x920A: Tag('FocalLength'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   415
    0x9214: Tag('SubjectArea'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   416
    0x927C: Tag('MakerNote'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   417
    0x9286: TagFunc('UserComment', decode_UserComment),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   418
    0x9290: Tag('SubSecTime'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   419
    0x9291: Tag('SubSecTimeOriginal'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   420
    0x9292: Tag('SubSecTimeDigitized'),
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   421
    
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   422
    # used by Windows Explorer
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   423
    0x9C9B: Tag('XPTitle'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   424
    0x9C9C: Tag('XPComment'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   425
    0x9C9D: Tag('XPAuthor'), #(ignored by Windows Explorer if Artist exists)
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   426
    0x9C9E: Tag('XPKeywords'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   427
    0x9C9F: Tag('XPSubject'),
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   428
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   429
    0xA000: Tag('FlashPixVersion'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   430
    0xA001: TagDict('ColorSpace',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   431
             {1: 'sRGB',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   432
              2: 'Adobe RGB',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   433
              65535: 'Uncalibrated'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   434
    0xA002: Tag('ExifImageWidth'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   435
    0xA003: Tag('ExifImageLength'),
106
a4f605bd122c add support for sub-IFDs, kind of hacky
Tero Marttila <terom@fixme.fi>
parents: 105
diff changeset
   436
    0xA005: IFDTag('InteroperabilityOffset', INTR_TAGS),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   437
    0xA20B: Tag('FlashEnergy'),               # 0x920B in TIFF/EP
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   438
    0xA20C: Tag('SpatialFrequencyResponse'),  # 0x920C
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   439
    0xA20E: Tag('FocalPlaneXResolution'),     # 0x920E
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   440
    0xA20F: Tag('FocalPlaneYResolution'),     # 0x920F
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   441
    0xA210: Tag('FocalPlaneResolutionUnit'),  # 0x9210
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   442
    0xA214: Tag('SubjectLocation'),           # 0x9214
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   443
    0xA215: Tag('ExposureIndex'),             # 0x9215
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   444
    0xA217: TagDict('SensingMethod',                # 0x9217
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   445
             {1: 'Not defined',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   446
              2: 'One-chip color area',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   447
              3: 'Two-chip color area',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   448
              4: 'Three-chip color area',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   449
              5: 'Color sequential area',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   450
              7: 'Trilinear',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   451
              8: 'Color sequential linear'}),             
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   452
    0xA300: TagDict('FileSource',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   453
             {1: 'Film Scanner',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   454
              2: 'Reflection Print Scanner',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   455
              3: 'Digital Camera'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   456
    0xA301: TagDict('SceneType',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   457
             {1: 'Directly Photographed'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   458
    0xA302: Tag('CVAPattern'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   459
    0xA401: TagDict('CustomRendered',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   460
             {0: 'Normal',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   461
              1: 'Custom'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   462
    0xA402: TagDict('ExposureMode',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   463
             {0: 'Auto Exposure',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   464
              1: 'Manual Exposure',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   465
              2: 'Auto Bracket'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   466
    0xA403: TagDict('WhiteBalance',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   467
             {0: 'Auto',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   468
              1: 'Manual'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   469
    0xA404: Tag('DigitalZoomRatio'),
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   470
    0xA405: ('FocalLengthIn35mmFilm', None),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   471
    0xA406: TagDict('SceneCaptureType',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   472
             {0: 'Standard',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   473
              1: 'Landscape',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   474
              2: 'Portrait',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   475
              3: 'Night)'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   476
    0xA407: TagDict('GainControl',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   477
             {0: 'None',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   478
              1: 'Low gain up',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   479
              2: 'High gain up',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   480
              3: 'Low gain down',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   481
              4: 'High gain down'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   482
    0xA408: TagDict('Contrast',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   483
             {0: 'Normal',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   484
              1: 'Soft',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   485
              2: 'Hard'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   486
    0xA409: TagDict('Saturation',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   487
             {0: 'Normal',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   488
              1: 'Soft',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   489
              2: 'Hard'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   490
    0xA40A: TagDict('Sharpness',
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   491
             {0: 'Normal',
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   492
              1: 'Soft',
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   493
              2: 'Hard'}),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   494
    0xA40B: Tag('DeviceSettingDescription'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   495
    0xA40C: Tag('SubjectDistanceRange'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   496
    0xA500: Tag('Gamma'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   497
    0xC4A5: Tag('PrintIM'),
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   498
    0xEA1C:	('Padding', None),
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   499
    }
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   500
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   501
# http://tomtia.plala.jp/DigitalCamera/MakerNote/index.asp
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   502
def nikon_ev_bias (seq) :
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   503
    """
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   504
        # First digit seems to be in steps of 1/6 EV.
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   505
        # Does the third value mean the step size?  It is usually 6,
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   506
        # but it is 12 for the ExposureDifference.
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   507
    """
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   508
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   509
    # check for an error condition that could cause a crash.
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   510
    # this only happens if something has gone really wrong in
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   511
    # reading the Nikon MakerNote.
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   512
    if len(seq) < 4 : 
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   513
        return ""
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   514
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   515
    if seq == [252, 1, 6, 0]:
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   516
        return "-2/3 EV"
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   517
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   518
    if seq == [253, 1, 6, 0]:
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   519
        return "-1/2 EV"
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   520
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   521
    if seq == [254, 1, 6, 0]:
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   522
        return "-1/3 EV"
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   523
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   524
    if seq == [0, 1, 6, 0]:
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   525
        return "0 EV"
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   526
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   527
    if seq == [2, 1, 6, 0]:
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   528
        return "+1/3 EV"
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   529
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   530
    if seq == [3, 1, 6, 0]:
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   531
        return "+1/2 EV"
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   532
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   533
    if seq == [4, 1, 6, 0]:
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   534
        return "+2/3 EV"
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   535
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   536
    # handle combinations not in the table.
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   537
    a = seq[0]
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   538
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   539
    # causes headaches for the +/- logic, so special case it.
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   540
    if a == 0:
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   541
        return "0 EV"
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   542
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   543
    if a > 127:
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   544
        a = 256 - a
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   545
        ret_str = "-"
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   546
    else:
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   547
        ret_str = "+"
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   548
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   549
    b = seq[2]	# assume third value means the step size
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   550
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   551
    whole = a / b
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   552
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   553
    a = a % b
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   554
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   555
    if whole != 0 :
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   556
        ret_str = ret_str + str(whole) + " "
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   557
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   558
    if a == 0 :
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   559
        ret_str = ret_str + "EV"
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   560
    else :
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   561
        r = Ratio(a, b)
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   562
        ret_str = ret_str + r.__repr__() + " EV"
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   563
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   564
    return ret_str
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   565
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   566
# Nikon E99x MakerNote Tags
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   567
MAKERNOTE_NIKON_NEWER_TAGS={
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   568
    0x0001: Tag('MakernoteVersion'),	# Sometimes binary
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   569
    0x0002: Tag('ISOSetting'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   570
    0x0003: Tag('ColorMode'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   571
    0x0004: Tag('Quality'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   572
    0x0005: Tag('Whitebalance'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   573
    0x0006: Tag('ImageSharpening'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   574
    0x0007: Tag('FocusMode'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   575
    0x0008: Tag('FlashSetting'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   576
    0x0009: Tag('AutoFlashMode'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   577
    0x000B: Tag('WhiteBalanceBias'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   578
    0x000C: Tag('WhiteBalanceRBCoeff'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   579
    0x000D: TagFunc('ProgramShift', nikon_ev_bias),
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   580
    # Nearly the same as the other EV vals, but step size is 1/12 EV (?)
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   581
    0x000E: TagFunc('ExposureDifference', nikon_ev_bias),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   582
    0x000F: Tag('ISOSelection'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   583
    0x0011: Tag('NikonPreview'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   584
    0x0012: TagFunc('FlashCompensation', nikon_ev_bias),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   585
    0x0013: Tag('ISOSpeedRequested'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   586
    0x0016: Tag('PhotoCornerCoordinates'),
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   587
    # 0x0017: Unknown, but most likely an EV value
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   588
    0x0018: TagFunc('FlashBracketCompensationApplied', nikon_ev_bias),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   589
    0x0019: Tag('AEBracketCompensationApplied'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   590
    0x001A: Tag('ImageProcessing'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   591
    0x001B: Tag('CropHiSpeed'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   592
    0x001D: Tag('SerialNumber'),	# Conflict with 0x00A0 ?
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   593
    0x001E: Tag('ColorSpace'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   594
    0x001F: Tag('VRInfo'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   595
    0x0020: Tag('ImageAuthentication'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   596
    0x0022: Tag('ActiveDLighting'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   597
    0x0023: Tag('PictureControl'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   598
    0x0024: Tag('WorldTime'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   599
    0x0025: Tag('ISOInfo'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   600
    0x0080: Tag('ImageAdjustment'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   601
    0x0081: Tag('ToneCompensation'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   602
    0x0082: Tag('AuxiliaryLens'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   603
    0x0083: Tag('LensType'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   604
    0x0084: Tag('LensMinMaxFocalMaxAperture'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   605
    0x0085: Tag('ManualFocusDistance'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   606
    0x0086: Tag('DigitalZoomFactor'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   607
    0x0087: TagDict('FlashMode',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   608
             {0x00: 'Did Not Fire',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   609
              0x01: 'Fired, Manual',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   610
              0x07: 'Fired, External',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   611
              0x08: 'Fired, Commander Mode ',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   612
              0x09: 'Fired, TTL Mode'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   613
    0x0088: TagDict('AFFocusPosition',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   614
             {0x0000: 'Center',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   615
              0x0100: 'Top',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   616
              0x0200: 'Bottom',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   617
              0x0300: 'Left',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   618
              0x0400: 'Right'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   619
    0x0089: TagDict('BracketingMode',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   620
             {0x00: 'Single frame, no bracketing',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   621
              0x01: 'Continuous, no bracketing',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   622
              0x02: 'Timer, no bracketing',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   623
              0x10: 'Single frame, exposure bracketing',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   624
              0x11: 'Continuous, exposure bracketing',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   625
              0x12: 'Timer, exposure bracketing',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   626
              0x40: 'Single frame, white balance bracketing',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   627
              0x41: 'Continuous, white balance bracketing',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   628
              0x42: 'Timer, white balance bracketing'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   629
    0x008A: Tag('AutoBracketRelease'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   630
    0x008B: Tag('LensFStops'),
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   631
    0x008C: ('NEFCurve1', None),	# ExifTool calls this 'ContrastCurve'
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   632
    0x008D: Tag('ColorMode'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   633
    0x008F: Tag('SceneMode'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   634
    0x0090: Tag('LightingType'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   635
    0x0091: Tag('ShotInfo'),	# First 4 bytes are a version number in ASCII
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   636
    0x0092: Tag('HueAdjustment'),
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   637
    # ExifTool calls this 'NEFCompression', should be 1-4
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   638
    0x0093: Tag('Compression'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   639
    0x0094: TagDict('Saturation',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   640
             {-3: 'B&W',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   641
              -2: '-2',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   642
              -1: '-1',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   643
              0: '0',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   644
              1: '1',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   645
              2: '2'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   646
    0x0095: Tag('NoiseReduction'),
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   647
    0x0096: ('NEFCurve2', None),	# ExifTool calls this 'LinearizationTable'
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   648
    0x0097: Tag('ColorBalance'),	# First 4 bytes are a version number in ASCII
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   649
    0x0098: Tag('LensData'),	# First 4 bytes are a version number in ASCII
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   650
    0x0099: Tag('RawImageCenter'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   651
    0x009A: Tag('SensorPixelSize'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   652
    0x009C: Tag('Scene Assist'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   653
    0x009E: Tag('RetouchHistory'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   654
    0x00A0: Tag('SerialNumber'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   655
    0x00A2: Tag('ImageDataSize'),
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   656
    # 00A3: unknown - a single byte 0
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   657
    # 00A4: In NEF, looks like a 4 byte ASCII version number ('0200')
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   658
    0x00A5: Tag('ImageCount'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   659
    0x00A6: Tag('DeletedImageCount'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   660
    0x00A7: Tag('TotalShutterReleases'),
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   661
    # First 4 bytes are a version number in ASCII, with version specific
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   662
    # info to follow.  Its hard to treat it as a string due to embedded nulls.
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   663
    0x00A8: Tag('FlashInfo'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   664
    0x00A9: Tag('ImageOptimization'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   665
    0x00AA: Tag('Saturation'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   666
    0x00AB: Tag('DigitalVariProgram'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   667
    0x00AC: Tag('ImageStabilization'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   668
    0x00AD: Tag('Responsive AF'),	# 'AFResponse'
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   669
    0x00B0: Tag('MultiExposure'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   670
    0x00B1: Tag('HighISONoiseReduction'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   671
    0x00B7: Tag('AFInfo'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   672
    0x00B8: Tag('FileInfo'),
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   673
    # 00B9: unknown
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   674
    0x0100: Tag('DigitalICE'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   675
    0x0103: TagDict('PreviewCompression',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   676
             {1: 'Uncompressed',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   677
              2: 'CCITT 1D',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   678
              3: 'T4/Group 3 Fax',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   679
              4: 'T6/Group 4 Fax',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   680
              5: 'LZW',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   681
              6: 'JPEG (old-style)',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   682
              7: 'JPEG',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   683
              8: 'Adobe Deflate',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   684
              9: 'JBIG B&W',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   685
              10: 'JBIG Color',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   686
              32766: 'Next',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   687
              32769: 'Epson ERF Compressed',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   688
              32771: 'CCIRLEW',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   689
              32773: 'PackBits',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   690
              32809: 'Thunderscan',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   691
              32895: 'IT8CTPAD',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   692
              32896: 'IT8LW',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   693
              32897: 'IT8MP',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   694
              32898: 'IT8BL',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   695
              32908: 'PixarFilm',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   696
              32909: 'PixarLog',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   697
              32946: 'Deflate',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   698
              32947: 'DCS',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   699
              34661: 'JBIG',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   700
              34676: 'SGILog',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   701
              34677: 'SGILog24',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   702
              34712: 'JPEG 2000',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   703
              34713: 'Nikon NEF Compressed',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   704
              65000: 'Kodak DCR Compressed',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   705
              65535: 'Pentax PEF Compressed',}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   706
    0x0201: Tag('PreviewImageStart'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   707
    0x0202: Tag('PreviewImageLength'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   708
    0x0213: TagDict('PreviewYCbCrPositioning',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   709
             {1: 'Centered',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   710
              2: 'Co-sited'}), 
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   711
    0x0010: Tag('DataDump'),
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   712
    }
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   713
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   714
MAKERNOTE_NIKON_OLDER_TAGS = {
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   715
    0x0003: TagDict('Quality',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   716
             {1: 'VGA Basic',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   717
              2: 'VGA Normal',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   718
              3: 'VGA Fine',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   719
              4: 'SXGA Basic',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   720
              5: 'SXGA Normal',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   721
              6: 'SXGA Fine'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   722
    0x0004: TagDict('ColorMode',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   723
             {1: 'Color',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   724
              2: 'Monochrome'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   725
    0x0005: TagDict('ImageAdjustment',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   726
             {0: 'Normal',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   727
              1: 'Bright+',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   728
              2: 'Bright-',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   729
              3: 'Contrast+',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   730
              4: 'Contrast-'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   731
    0x0006: TagDict('CCDSpeed',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   732
             {0: 'ISO 80',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   733
              2: 'ISO 160',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   734
              4: 'ISO 320',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   735
              5: 'ISO 100'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   736
    0x0007: TagDict('WhiteBalance',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   737
             {0: 'Auto',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   738
              1: 'Preset',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   739
              2: 'Daylight',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   740
              3: 'Incandescent',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   741
              4: 'Fluorescent',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   742
              5: 'Cloudy',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   743
              6: 'Speed Light'}),
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   744
    }
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   745
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   746
def olympus_special_mode (values) :
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   747
    """
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   748
        Decode Olympus SpecialMode tag in MakerNote
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   749
    """
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   750
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   751
    a = {
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   752
        0: 'Normal',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   753
        1: 'Unknown',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   754
        2: 'Fast',
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   755
        3: 'Panorama'
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   756
    }
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   757
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   758
    b = {
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   759
        0: 'Non-panoramic',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   760
        1: 'Left to right',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   761
        2: 'Right to left',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   762
        3: 'Bottom to top',
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   763
        4: 'Top to bottom'
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   764
    }
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   765
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   766
    if v[0] not in a or v[2] not in b:
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   767
        return values
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
   768
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   769
    return '%s - sequence %d - %s' % (a[v[0]], v[1], b[v[2]])
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   770
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   771
MAKERNOTE_OLYMPUS_TAGS={
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   772
    # ah HAH! those sneeeeeaky bastids! this is how they get past the fact
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   773
    # that a JPEG thumbnail is not allowed in an uncompressed TIFF file
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   774
    0x0100: Tag('JPEGThumbnail'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   775
    0x0200: TagFunc('SpecialMode', olympus_special_mode),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   776
    0x0201: TagDict('JPEGQual',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   777
             {1: 'SQ',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   778
              2: 'HQ',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   779
              3: 'SHQ'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   780
    0x0202: TagDict('Macro',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   781
             {0: 'Normal',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   782
             1: 'Macro',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   783
             2: 'SuperMacro'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   784
    0x0203: TagDict('BWMode',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   785
             {0: 'Off',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   786
             1: 'On'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   787
    0x0204: Tag('DigitalZoom'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   788
    0x0205: Tag('FocalPlaneDiagonal'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   789
    0x0206: Tag('LensDistortionParams'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   790
    0x0207: Tag('SoftwareRelease'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   791
    0x0208: Tag('PictureInfo'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   792
    0x0209: Tag('CameraID'), # print as string
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   793
    0x0F00: Tag('DataDump'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   794
    0x0300: Tag('PreCaptureFrames'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   795
    0x0404: Tag('SerialNumber'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   796
    0x1000: Tag('ShutterSpeedValue'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   797
    0x1001: Tag('ISOValue'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   798
    0x1002: Tag('ApertureValue'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   799
    0x1003: Tag('BrightnessValue'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   800
    0x1004: Tag('FlashMode'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   801
    0x1004: TagDict('FlashMode',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   802
       {2: 'On',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   803
        3: 'Off'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   804
    0x1005: TagDict('FlashDevice',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   805
       {0: 'None',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   806
        1: 'Internal',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   807
        4: 'External',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   808
        5: 'Internal + External'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   809
    0x1006: Tag('ExposureCompensation'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   810
    0x1007: Tag('SensorTemperature'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   811
    0x1008: Tag('LensTemperature'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   812
    0x100b: TagDict('FocusMode',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   813
       {0: 'Auto',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   814
        1: 'Manual'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   815
    0x1017: Tag('RedBalance'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   816
    0x1018: Tag('BlueBalance'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   817
    0x101a: Tag('SerialNumber'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   818
    0x1023: Tag('FlashExposureComp'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   819
    0x1026: TagDict('ExternalFlashBounce',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   820
       {0: 'No',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   821
        1: 'Yes'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   822
    0x1027: Tag('ExternalFlashZoom'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   823
    0x1028: Tag('ExternalFlashMode'),
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   824
    0x1029: ('Contrast 	int16u',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   825
       {0: 'High',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   826
        1: 'Normal',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   827
        2: 'Low'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   828
    0x102a: Tag('SharpnessFactor'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   829
    0x102b: Tag('ColorControl'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   830
    0x102c: Tag('ValidBits'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   831
    0x102d: Tag('CoringFilter'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   832
    0x102e: Tag('OlympusImageWidth'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   833
    0x102f: Tag('OlympusImageHeight'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   834
    0x1034: Tag('CompressionRatio'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   835
    0x1035: TagDict('PreviewImageValid',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   836
       {0: 'No',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   837
        1: 'Yes'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   838
    0x1036: Tag('PreviewImageStart'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   839
    0x1037: Tag('PreviewImageLength'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   840
    0x1039: TagDict('CCDScanMode',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   841
       {0: 'Interlaced',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   842
        1: 'Progressive'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   843
    0x103a: TagDict('NoiseReduction',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   844
       {0: 'Off',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   845
        1: 'On'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   846
    0x103b: Tag('InfinityLensStep'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   847
    0x103c: Tag('NearLensStep'),
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   848
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   849
    # TODO - these need extra definitions
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   850
    # http://search.cpan.org/src/EXIFTOOL/Image-ExifTool-6.90/html/TagNames/Olympus.html
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   851
    0x2010: Tag('Equipment'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   852
    0x2020: Tag('CameraSettings'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   853
    0x2030: Tag('RawDevelopment'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   854
    0x2040: Tag('ImageProcessing'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   855
    0x2050: Tag('FocusInfo'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   856
    0x3000: Tag('RawInfo '),
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   857
    }
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   858
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   859
# 0x2020 CameraSettings
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   860
MAKERNOTE_OLYMPUS_TAG_0x2020={
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   861
    0x0100: TagDict('PreviewImageValid',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   862
             {0: 'No',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   863
              1: 'Yes'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   864
    0x0101: Tag('PreviewImageStart'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   865
    0x0102: Tag('PreviewImageLength'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   866
    0x0200: TagDict('ExposureMode',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   867
             {1: 'Manual',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   868
              2: 'Program',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   869
              3: 'Aperture-priority AE',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   870
              4: 'Shutter speed priority AE',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   871
              5: 'Program-shift'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   872
    0x0201: TagDict('AELock',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   873
             {0: 'Off',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   874
              1: 'On'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   875
    0x0202: TagDict('MeteringMode',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   876
             {2: 'Center Weighted',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   877
              3: 'Spot',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   878
              5: 'ESP',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   879
              261: 'Pattern+AF',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   880
              515: 'Spot+Highlight control',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   881
              1027: 'Spot+Shadow control'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   882
    0x0300: TagDict('MacroMode',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   883
             {0: 'Off',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   884
              1: 'On'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   885
    0x0301: TagDict('FocusMode',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   886
             {0: 'Single AF',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   887
              1: 'Sequential shooting AF',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   888
              2: 'Continuous AF',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   889
              3: 'Multi AF',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   890
              10: 'MF'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   891
    0x0302: TagDict('FocusProcess',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   892
             {0: 'AF Not Used',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   893
              1: 'AF Used'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   894
    0x0303: TagDict('AFSearch',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   895
             {0: 'Not Ready',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   896
              1: 'Ready'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   897
    0x0304: Tag('AFAreas'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   898
    0x0401: Tag('FlashExposureCompensation'),
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   899
    0x0500: ('WhiteBalance2',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   900
             {0: 'Auto',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   901
             16: '7500K (Fine Weather with Shade)',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   902
             17: '6000K (Cloudy)',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   903
             18: '5300K (Fine Weather)',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   904
             20: '3000K (Tungsten light)',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   905
             21: '3600K (Tungsten light-like)',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   906
             33: '6600K (Daylight fluorescent)',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   907
             34: '4500K (Neutral white fluorescent)',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   908
             35: '4000K (Cool white fluorescent)',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   909
             48: '3600K (Tungsten light-like)',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   910
             256: 'Custom WB 1',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   911
             257: 'Custom WB 2',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   912
             258: 'Custom WB 3',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   913
             259: 'Custom WB 4',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   914
             512: 'Custom WB 5400K',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   915
             513: 'Custom WB 2900K',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   916
             514: 'Custom WB 8000K', }),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   917
    0x0501: Tag('WhiteBalanceTemperature'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   918
    0x0502: Tag('WhiteBalanceBracket'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   919
    0x0503: Tag('CustomSaturation'), # (3 numbers: 1. CS Value, 2. Min, 3. Max)
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   920
    0x0504: TagDict('ModifiedSaturation',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   921
             {0: 'Off',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   922
              1: 'CM1 (Red Enhance)',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   923
              2: 'CM2 (Green Enhance)',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   924
              3: 'CM3 (Blue Enhance)',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   925
              4: 'CM4 (Skin Tones)'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   926
    0x0505: Tag('ContrastSetting'), # (3 numbers: 1. Contrast, 2. Min, 3. Max)
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   927
    0x0506: Tag('SharpnessSetting'), # (3 numbers: 1. Sharpness, 2. Min, 3. Max)
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   928
    0x0507: TagDict('ColorSpace',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   929
             {0: 'sRGB',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   930
              1: 'Adobe RGB',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   931
              2: 'Pro Photo RGB'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   932
    0x0509: TagDict('SceneMode',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   933
             {0: 'Standard',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   934
              6: 'Auto',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   935
              7: 'Sport',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   936
              8: 'Portrait',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   937
              9: 'Landscape+Portrait',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   938
             10: 'Landscape',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   939
             11: 'Night scene',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   940
             13: 'Panorama',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   941
             16: 'Landscape+Portrait',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   942
             17: 'Night+Portrait',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   943
             19: 'Fireworks',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   944
             20: 'Sunset',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   945
             22: 'Macro',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   946
             25: 'Documents',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   947
             26: 'Museum',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   948
             28: 'Beach&Snow',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   949
             30: 'Candle',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   950
             35: 'Underwater Wide1',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   951
             36: 'Underwater Macro',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   952
             39: 'High Key',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   953
             40: 'Digital Image Stabilization',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   954
             44: 'Underwater Wide2',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   955
             45: 'Low Key',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   956
             46: 'Children',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   957
             48: 'Nature Macro'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   958
    0x050a: TagDict('NoiseReduction',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   959
             {0: 'Off',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   960
              1: 'Noise Reduction',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   961
              2: 'Noise Filter',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   962
              3: 'Noise Reduction + Noise Filter',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   963
              4: 'Noise Filter (ISO Boost)',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   964
              5: 'Noise Reduction + Noise Filter (ISO Boost)'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   965
    0x050b: TagDict('DistortionCorrection',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   966
             {0: 'Off',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   967
              1: 'On'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   968
    0x050c: TagDict('ShadingCompensation',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   969
             {0: 'Off',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   970
              1: 'On'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   971
    0x050d: Tag('CompressionFactor'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   972
    0x050f: TagDict('Gradation',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   973
             {'-1 -1 1': 'Low Key',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   974
              '0 -1 1': 'Normal',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   975
              '1 -1 1': 'High Key'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   976
    0x0520: TagDict('PictureMode',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   977
             {1: 'Vivid',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   978
              2: 'Natural',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   979
              3: 'Muted',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   980
              256: 'Monotone',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   981
              512: 'Sepia'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   982
    0x0521: Tag('PictureModeSaturation'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   983
    0x0522: Tag('PictureModeHue?'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   984
    0x0523: Tag('PictureModeContrast'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   985
    0x0524: Tag('PictureModeSharpness'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   986
    0x0525: TagDict('PictureModeBWFilter',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   987
             {0: 'n/a',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   988
              1: 'Neutral',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   989
              2: 'Yellow',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   990
              3: 'Orange',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   991
              4: 'Red',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   992
              5: 'Green'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
   993
    0x0526: TagDict('PictureModeTone',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   994
             {0: 'n/a',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   995
              1: 'Neutral',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   996
              2: 'Sepia',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   997
              3: 'Blue',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   998
              4: 'Purple',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   999
              5: 'Green'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1000
    0x0600: Tag('Sequence'), # 2 or 3 numbers: 1. Mode, 2. Shot number, 3. Mode bits
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1001
    0x0601: Tag('PanoramaMode'), # (2 numbers: 1. Mode, 2. Shot number)
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1002
    0x0603: ('ImageQuality2',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1003
             {1: 'SQ',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1004
              2: 'HQ',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1005
              3: 'SHQ',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1006
              4: 'RAW'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1007
    0x0901: Tag('ManometerReading'),
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1008
    }
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1009
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1010
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1011
MAKERNOTE_CASIO_TAGS={
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1012
    0x0001: TagDict('RecordingMode',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1013
             {1: 'Single Shutter',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1014
              2: 'Panorama',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1015
              3: 'Night Scene',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1016
              4: 'Portrait',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1017
              5: 'Landscape'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1018
    0x0002: TagDict('Quality',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1019
             {1: 'Economy',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1020
              2: 'Normal',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1021
              3: 'Fine'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1022
    0x0003: TagDict('FocusingMode',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1023
             {2: 'Macro',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1024
              3: 'Auto Focus',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1025
              4: 'Manual Focus',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1026
              5: 'Infinity'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1027
    0x0004: TagDict('FlashMode',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1028
             {1: 'Auto',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1029
              2: 'On',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1030
              3: 'Off',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1031
              4: 'Red Eye Reduction'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1032
    0x0005: TagDict('FlashIntensity',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1033
             {11: 'Weak',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1034
              13: 'Normal',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1035
              15: 'Strong'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1036
    0x0006: Tag('Object Distance'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1037
    0x0007: TagDict('WhiteBalance',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1038
             {1: 'Auto',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1039
              2: 'Tungsten',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1040
              3: 'Daylight',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1041
              4: 'Fluorescent',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1042
              5: 'Shade',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1043
              129: 'Manual'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1044
    0x000B: TagDict('Sharpness',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1045
             {0: 'Normal',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1046
              1: 'Soft',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1047
              2: 'Hard'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1048
    0x000C: TagDict('Contrast',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1049
             {0: 'Normal',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1050
              1: 'Low',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1051
              2: 'High'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1052
    0x000D: TagDict('Saturation',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1053
             {0: 'Normal',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1054
              1: 'Low',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1055
              2: 'High'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1056
    0x0014: TagDict('CCDSpeed',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1057
             {64: 'Normal',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1058
              80: 'Normal',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1059
              100: 'High',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1060
              125: '+1.0',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1061
              244: '+3.0',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1062
              250: '+2.0'}),
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1063
    }
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1064
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1065
MAKERNOTE_FUJIFILM_TAGS={
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1066
    0x0000: Tag('NoteVersion'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1067
    0x1000: Tag('Quality'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1068
    0x1001: TagDict('Sharpness',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1069
             {1: 'Soft',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1070
              2: 'Soft',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1071
              3: 'Normal',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1072
              4: 'Hard',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1073
              5: 'Hard'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1074
    0x1002: TagDict('WhiteBalance',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1075
             {0: 'Auto',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1076
              256: 'Daylight',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1077
              512: 'Cloudy',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1078
              768: 'DaylightColor-Fluorescent',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1079
              769: 'DaywhiteColor-Fluorescent',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1080
              770: 'White-Fluorescent',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1081
              1024: 'Incandescent',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1082
              3840: 'Custom'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1083
    0x1003: TagDict('Color',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1084
             {0: 'Normal',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1085
              256: 'High',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1086
              512: 'Low'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1087
    0x1004: TagDict('Tone',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1088
             {0: 'Normal',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1089
              256: 'High',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1090
              512: 'Low'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1091
    0x1010: TagDict('FlashMode',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1092
             {0: 'Auto',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1093
              1: 'On',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1094
              2: 'Off',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1095
              3: 'Red Eye Reduction'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1096
    0x1011: Tag('FlashStrength'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1097
    0x1020: TagDict('Macro',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1098
             {0: 'Off',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1099
              1: 'On'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1100
    0x1021: TagDict('FocusMode',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1101
             {0: 'Auto',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1102
              1: 'Manual'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1103
    0x1030: TagDict('SlowSync',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1104
             {0: 'Off',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1105
              1: 'On'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1106
    0x1031: TagDict('PictureMode',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1107
             {0: 'Auto',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1108
              1: 'Portrait',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1109
              2: 'Landscape',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1110
              4: 'Sports',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1111
              5: 'Night',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1112
              6: 'Program AE',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1113
              256: 'Aperture Priority AE',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1114
              512: 'Shutter Priority AE',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1115
              768: 'Manual Exposure'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1116
    0x1100: TagDict('MotorOrBracket',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1117
             {0: 'Off',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1118
              1: 'On'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1119
    0x1300: TagDict('BlurWarning',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1120
             {0: 'Off',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1121
              1: 'On'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1122
    0x1301: TagDict('FocusWarning',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1123
             {0: 'Off',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1124
              1: 'On'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1125
    0x1302: TagDict('AEWarning',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1126
             {0: 'Off',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1127
              1: 'On'}),
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1128
    }
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1129
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1130
MAKERNOTE_CANON_TAGS = {
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1131
    0x0006: Tag('ImageType'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1132
    0x0007: Tag('FirmwareVersion'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1133
    0x0008: Tag('ImageNumber'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1134
    0x0009: Tag('OwnerName'),
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1135
    }
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1136
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1137
# this is in element offset, name, optional value dictionary format
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1138
MAKERNOTE_CANON_TAG_0x001 = {
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1139
    1: TagDict('Macromode',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1140
        {1: 'Macro',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1141
         2: 'Normal'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1142
    2: Tag('SelfTimer'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1143
    3: TagDict('Quality',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1144
        {2: 'Normal',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1145
         3: 'Fine',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1146
         5: 'Superfine'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1147
    4: TagDict('FlashMode',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1148
        {0: 'Flash Not Fired',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1149
         1: 'Auto',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1150
         2: 'On',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1151
         3: 'Red-Eye Reduction',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1152
         4: 'Slow Synchro',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1153
         5: 'Auto + Red-Eye Reduction',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1154
         6: 'On + Red-Eye Reduction',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1155
         16: 'external flash'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1156
    5: TagDict('ContinuousDriveMode',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1157
        {0: 'Single Or Timer',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1158
         1: 'Continuous'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1159
    7: TagDict('FocusMode',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1160
        {0: 'One-Shot',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1161
         1: 'AI Servo',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1162
         2: 'AI Focus',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1163
         3: 'MF',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1164
         4: 'Single',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1165
         5: 'Continuous',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1166
         6: 'MF'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1167
    10: TagDict('ImageSize',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1168
         {0: 'Large',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1169
          1: 'Medium',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1170
          2: 'Small'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1171
    11: TagDict('EasyShootingMode',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1172
         {0: 'Full Auto',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1173
          1: 'Manual',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1174
          2: 'Landscape',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1175
          3: 'Fast Shutter',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1176
          4: 'Slow Shutter',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1177
          5: 'Night',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1178
          6: 'B&W',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1179
          7: 'Sepia',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1180
          8: 'Portrait',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1181
          9: 'Sports',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1182
          10: 'Macro/Close-Up',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1183
          11: 'Pan Focus'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1184
    12: TagDict('DigitalZoom',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1185
         {0: 'None',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1186
          1: '2x',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1187
          2: '4x'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1188
    13: TagDict('Contrast',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1189
         {0xFFFF: 'Low',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1190
          0: 'Normal',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1191
          1: 'High'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1192
    14: TagDict('Saturation',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1193
         {0xFFFF: 'Low',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1194
          0: 'Normal',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1195
          1: 'High'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1196
    15: TagDict('Sharpness',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1197
         {0xFFFF: 'Low',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1198
          0: 'Normal',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1199
          1: 'High'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1200
    16: TagDict('ISO',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1201
         {0: 'See ISOSpeedRatings Tag',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1202
          15: 'Auto',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1203
          16: '50',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1204
          17: '100',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1205
          18: '200',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1206
          19: '400'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1207
    17: TagDict('MeteringMode',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1208
         {3: 'Evaluative',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1209
          4: 'Partial',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1210
          5: 'Center-weighted'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1211
    18: TagDict('FocusType',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1212
         {0: 'Manual',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1213
          1: 'Auto',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1214
          3: 'Close-Up (Macro)',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1215
          8: 'Locked (Pan Mode)'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1216
    19: TagDict('AFPointSelected',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1217
         {0x3000: 'None (MF)',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1218
          0x3001: 'Auto-Selected',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1219
          0x3002: 'Right',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1220
          0x3003: 'Center',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1221
          0x3004: 'Left'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1222
    20: TagDict('ExposureMode',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1223
         {0: 'Easy Shooting',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1224
          1: 'Program',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1225
          2: 'Tv-priority',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1226
          3: 'Av-priority',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1227
          4: 'Manual',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1228
          5: 'A-DEP'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1229
    23: Tag('LongFocalLengthOfLensInFocalUnits'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1230
    24: Tag('ShortFocalLengthOfLensInFocalUnits'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1231
    25: Tag('FocalUnitsPerMM'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1232
    28: TagDict('FlashActivity',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1233
         {0: 'Did Not Fire',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1234
          1: 'Fired'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1235
    29: TagDict('FlashDetails',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1236
         {14: 'External E-TTL',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1237
          13: 'Internal Flash',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1238
          11: 'FP Sync Used',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1239
          7: '2nd("Rear")-Curtain Sync Used',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1240
          4: 'FP Sync Enabled'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1241
    32: TagDict('FocusMode',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1242
         {0: 'Single',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1243
          1: 'Continuous'}),
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1244
    }
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1245
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1246
MAKERNOTE_CANON_TAG_0x004 = {
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1247
    7: TagDict('WhiteBalance',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1248
        {0: 'Auto',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1249
         1: 'Sunny',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1250
         2: 'Cloudy',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1251
         3: 'Tungsten',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1252
         4: 'Fluorescent',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1253
         5: 'Flash',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1254
         6: 'Custom'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1255
    9: Tag('SequenceNumber'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1256
    14: Tag('AFPointUsed'),
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1257
    15: TagDict('FlashBias',
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1258
         {0xFFC0: '-2 EV',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1259
          0xFFCC: '-1.67 EV',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1260
          0xFFD0: '-1.50 EV',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1261
          0xFFD4: '-1.33 EV',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1262
          0xFFE0: '-1 EV',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1263
          0xFFEC: '-0.67 EV',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1264
          0xFFF0: '-0.50 EV',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1265
          0xFFF4: '-0.33 EV',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1266
          0x0000: '0 EV',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1267
          0x000C: '0.33 EV',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1268
          0x0010: '0.50 EV',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1269
          0x0014: '0.67 EV',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1270
          0x0020: '1 EV',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1271
          0x002C: '1.33 EV',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1272
          0x0030: '1.50 EV',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1273
          0x0034: '1.67 EV',
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1274
          0x0040: '2 EV'}),
105
effae6f38749 refactor exif_data to use a Tag class for each tag, instead of a magic tuple
Tero Marttila <terom@fixme.fi>
parents: 104
diff changeset
  1275
    19: Tag('SubjectDistance'),
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1276
    }
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1277
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1278
# ratio object that eventually will be able to reduce itself to lowest
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1279
# common denominator for printing
104
6afe59e5ffae tidy up exif_data a bit
Tero Marttila <terom@fixme.fi>
parents: 103
diff changeset
  1280
# XXX: unused
102
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1281
def gcd(a, b):
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1282
    if b == 0:
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1283
        return a
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1284
    else:
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1285
        return gcd(b, a % b)
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1286
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1287
class Ratio:
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1288
    def __init__(self, num, den):
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1289
        self.num = num
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1290
        self.den = den
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1291
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1292
    def __repr__(self):
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1293
        self.reduce()
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1294
        if self.den == 1:
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1295
            return str(self.num)
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1296
        return '%d/%d' % (self.num, self.den)
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1297
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1298
    def reduce(self):
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1299
        div = gcd(self.num, self.den)
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1300
        if div > 1:
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1301
            self.num = self.num / div
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1302
            self.den = self.den / div
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1303
ef2c1ffdca8f initial exif.py code
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
  1304