0,0 → 1,544 |
/* |
* This is public domain software - that is, you can do whatever you want |
* with it, and include it software that is licensed under the GNU or the |
* BSD license, or whatever other licence you choose, including proprietary |
* closed source licenses. I do ask that you leave this header in tact. |
* |
* If you make modifications to this code that you think would benefit the |
* wider community, please send me a copy and I'll post it on my site. |
* |
* If you make use of this code, I'd appreciate hearing about it. |
* drew@drewnoakes.com |
* Latest version of this software kept at |
* http://drewnoakes.com/ |
* |
* Created by dnoakes on 3-Oct-2002 10:10:47 using IntelliJ IDEA. |
*/ |
package com.drew.metadata.exif; |
|
import com.drew.lang.Rational; |
import com.drew.metadata.Directory; |
import com.drew.metadata.MetadataException; |
|
import java.util.HashMap; |
|
/** |
* Contains values specific to Nikon cameras. Type-2 applies to the E990 and D-series cameras such as the E990, D1, |
* D70 and D100. |
* |
* Thanks to Fabrizio Giudici for publishing his reverse-engineering of the D100 makernote data. |
* http://www.timelesswanderings.net/equipment/D100/NEF.html |
* |
* Note that the camera implements image protection (locking images) via the file's 'readonly' attribute. Similarly |
* image hiding uses the 'hidden' attribute (observed on the D70). Consequently, these values are not available here. |
* |
* Additional sample images have been observed, and their tag values recorded in javadoc comments for each tag's field. |
* New tags have subsequently been added since Fabrizio's observations. |
* |
* In earlier models (such as the E990 and D1), this directory begins at the first byte of the makernote IFD. In |
* later models, the IFD was given the standard prefix to indicate the camera models (most other manufacturers also |
* provide this prefix to aid in software decoding). |
*/ |
public class NikonType2MakernoteDirectory extends Directory |
{ |
/** |
* Values observed |
* - 0200 (D70) |
* - 0200 (D1X) |
*/ |
public static final int TAG_NIKON_TYPE2_FIRMWARE_VERSION = 0x0001; |
|
/** |
* Values observed |
* - 0 250 |
* - 0 400 |
*/ |
public static final int TAG_NIKON_TYPE2_ISO_1 = 0x0002; |
|
/** |
* Values observed |
* - COLOR (seen in the D1X) |
*/ |
public static final int TAG_NIKON_TYPE2_COLOR_MODE = 0x0003; |
|
/** |
* Values observed |
* - FILE |
* - RAW |
* - NORMAL |
* - FINE |
*/ |
public static final int TAG_NIKON_TYPE2_QUALITY_AND_FILE_FORMAT = 0x0004; |
|
/** |
* The white balance as set in the camera. |
* |
* Values observed |
* - AUTO |
* - SUNNY (D70) |
* - FLASH (D1X) |
* (presumably also SHADOW / INCANDESCENT / FLUORESCENT / CLOUDY) |
*/ |
public static final int TAG_NIKON_TYPE2_CAMERA_WHITE_BALANCE = 0x0005; |
|
/** |
* The sharpening as set in the camera. |
* |
* Values observed |
* - AUTO |
* - NORMAL (D70) |
* - NONE (D1X) |
*/ |
public static final int TAG_NIKON_TYPE2_CAMERA_SHARPENING = 0x0006; |
|
/** |
* The auto-focus type used by the camera. |
* |
* Values observed |
* - AF-S |
* - AF-C |
* - MANUAL |
*/ |
public static final int TAG_NIKON_TYPE2_AF_TYPE = 0x0007; |
|
/** |
* Values observed |
* - NORMAL |
* - RED-EYE |
* |
* Note: when TAG_NIKON_TYPE2_AUTO_FLASH_MODE is blank, Nikon Browser displays "Flash Sync Mode: Not Attached" |
*/ |
public static final int TAG_NIKON_TYPE2_FLASH_SYNC_MODE = 0x0008; |
|
/** |
* Values observed |
* - Built-in,TTL |
* - Optional,TTL (with speedlight SB800, flash sync mode as NORMAL. NikonBrowser reports Auto Flash Comp: 0 EV -- which tag is that?) (D70) |
* - NEW_TTL (Nikon Browser interprets as "D-TTL") |
* - (blank -- accompanied FlashSyncMode of NORMAL) (D70) |
*/ |
public static final int TAG_NIKON_TYPE2_AUTO_FLASH_MODE = 0x0009; |
|
/** |
* Added during merge of Type2 & Type3. May apply to earlier models, such as E990 and D1. |
*/ |
public static final int TAG_NIKON_TYPE2_UNKNOWN_34 = 0x000A; |
|
/** |
* Values observed |
* - 0 |
*/ |
public static final int TAG_NIKON_TYPE2_CAMERA_WHITE_BALANCE_FINE = 0x000B; |
|
/** |
* The first two numbers are coefficients to multiply red and blue channels according to white balance as set in the |
* camera. The meaning of the third and the fourth numbers is unknown. |
* |
* Values observed |
* - 2.25882352 1.76078431 0.0 0.0 |
* - 10242/1 34305/1 0/1 0/1 |
* - 234765625/100000000 1140625/1000000 1/1 1/1 |
*/ |
public static final int TAG_NIKON_TYPE2_CAMERA_WHITE_BALANCE_RB_COEFF = 0x000C; |
|
/** |
* Values observed |
* - 0,1,6,0 (hex) |
*/ |
public static final int TAG_NIKON_TYPE2_UNKNOWN_1 = 0x000D; |
|
/** |
* Values observed |
* - î |
* - 0,1,c,0 (hex) |
*/ |
public static final int TAG_NIKON_TYPE2_UNKNOWN_2 = 0x000E; |
|
/** |
* Added during merge of Type2 & Type3. May apply to earlier models, such as E990 and D1. |
*/ |
public static final int TAG_NIKON_TYPE2_ISO_SELECTION = 0x000F; |
|
/** |
* Added during merge of Type2 & Type3. May apply to earlier models, such as E990 and D1. |
*/ |
public static final int TAG_NIKON_TYPE2_DATA_DUMP = 0x0010; |
|
/** |
* Values observed |
* - 914 |
* - 1379 (D70) |
* - 2781 (D1X) |
* - 6942 (D100) |
*/ |
public static final int TAG_NIKON_TYPE2_UNKNOWN_3 = 0x0011; |
|
/** |
* Values observed |
* - (no value -- blank) |
*/ |
public static final int TAG_NIKON_TYPE2_AUTO_FLASH_COMPENSATION = 0x0012; |
|
/** |
* Values observed |
* - 0 250 |
* - 0 400 |
*/ |
public static final int TAG_NIKON_TYPE2_ISO_2 = 0x0013; |
|
/** |
* Values observed |
* - 0 0 49163 53255 |
* - 0 0 3008 2000 (the image dimensions were 3008x2000) (D70) |
*/ |
public static final int TAG_NIKON_TYPE2_UNKNOWN_21 = 0x0016; |
|
/** |
* Values observed |
* - (blank) |
*/ |
public static final int TAG_NIKON_TYPE2_UNKNOWN_22 = 0x0017; |
|
/** |
* Values observed |
* - (blank) |
*/ |
public static final int TAG_NIKON_TYPE2_UNKNOWN_23 = 0x0018; |
|
/** |
* Values observed |
* - 0 |
*/ |
public static final int TAG_NIKON_TYPE2_UNKNOWN_24 = 0x0019; |
|
/** |
* Added during merge of Type2 & Type3. May apply to earlier models, such as E990 and D1. |
*/ |
public static final int TAG_NIKON_TYPE2_IMAGE_ADJUSTMENT = 0x0080; |
|
/** |
* The tone compensation as set in the camera. |
* |
* Values observed |
* - AUTO |
* - NORMAL (D1X, D100) |
*/ |
public static final int TAG_NIKON_TYPE2_CAMERA_TONE_COMPENSATION = 0x0081; |
|
/** |
* Added during merge of Type2 & Type3. May apply to earlier models, such as E990 and D1. |
*/ |
public static final int TAG_NIKON_TYPE2_ADAPTER = 0x0082; |
|
/** |
* Values observed |
* - 6 |
* - 6 (D70) |
* - 2 (D1X) |
*/ |
public static final int TAG_NIKON_TYPE2_UNKNOWN_4 = 0x0083; |
|
/** |
* A pair of focal/max-fstop values that describe the lens used. |
* |
* Values observed |
* - 180.0,180.0,2.8,2.8 (D100) |
* - 240/10 850/10 35/10 45/10 |
* - 18-70mm f/3.5-4.5 (D70) |
* - 17-35mm f/2.8-2.8 (D1X) |
* - 70-200mm f/2.8-2.8 (D70) |
* |
* Nikon Browser identifies the lens as "18-70mm F/3.5-4.5 G" which |
* is identical to metadata extractor, except for the "G". This must |
* be coming from another tag... |
*/ |
public static final int TAG_NIKON_TYPE2_LENS = 0x0084; |
|
/** |
* Added during merge of Type2 & Type3. May apply to earlier models, such as E990 and D1. |
*/ |
public static final int TAG_NIKON_TYPE2_MANUAL_FOCUS_DISTANCE = 0x0085; |
|
/** |
* Added during merge of Type2 & Type3. May apply to earlier models, such as E990 and D1. |
*/ |
public static final int TAG_NIKON_TYPE2_DIGITAL_ZOOM = 0x0086; |
|
/** |
* Values observed |
* - 0 |
* - 9 |
* - 3 (D1X) |
*/ |
public static final int TAG_NIKON_TYPE2_UNKNOWN_5 = 0x0087; |
|
/** |
* Values observed |
* - |
*/ |
public static final int TAG_NIKON_TYPE2_AF_FOCUS_POSITION = 0x0088; |
|
/** |
* Values observed |
* - 0 |
* - 1 |
*/ |
public static final int TAG_NIKON_TYPE2_UNKNOWN_7 = 0x0089; |
|
/** |
* Values observed |
* - 0 |
* - 0 |
*/ |
public static final int TAG_NIKON_TYPE2_UNKNOWN_20 = 0x008A; |
|
/** |
* Values observed |
* - 48,1,c,0 (hex) (D100) |
* - @ |
*/ |
public static final int TAG_NIKON_TYPE2_UNKNOWN_8 = 0x008B; |
|
/** |
* Unknown. Fabrizio believes this may be a lookup table for the user-defined curve. |
* |
* Values observed |
* - (blank) (D1X) |
*/ |
public static final int TAG_NIKON_TYPE2_UNKNOWN_9 = 0x008C; |
|
/** |
* The color space as set in the camera. |
* |
* Values observed |
* - MODE1 |
* - Mode I (sRGB) (D70) |
* - MODE2 (D1X, D100) |
*/ |
public static final int TAG_NIKON_TYPE2_CAMERA_COLOR_MODE = 0x008D; |
|
/** |
* Values observed |
* - NATURAL |
* - SPEEDLIGHT (D70, D1X) |
*/ |
public static final int TAG_NIKON_TYPE2_LIGHT_SOURCE = 0x0090; |
|
/** |
* Values observed |
* - 0100) |
* - 0103 (D70) |
* - 0100 (D1X) |
*/ |
public static final int TAG_NIKON_TYPE2_UNKNOWN_11 = 0x0091; |
|
/** |
* The hue adjustment as set in the camera. |
* |
* Values observed |
* - 0 |
*/ |
public static final int TAG_NIKON_TYPE2_CAMERA_HUE_ADJUSTMENT = 0x0092; |
|
/** |
* Values observed |
* - OFF |
*/ |
public static final int TAG_NIKON_TYPE2_NOISE_REDUCTION = 0x0095; |
|
/** |
* Values observed |
* - 0100'~e3 |
* - 0103 |
*/ |
public static final int TAG_NIKON_TYPE2_UNKNOWN_12 = 0x0097; |
|
/** |
* Values observed |
* - 0100fht@7b,4x,D"Y |
* - 01015 |
* - 0100w\cH+D$$h$î5Q (D1X) |
* - 30,31,30,30,0,0,b,48,7c,7c,24,24,5,15,24,0,0,0,0,0 (hex) (D100) |
*/ |
public static final int TAG_NIKON_TYPE2_UNKNOWN_13 = 0x0098; |
|
/** |
* Values observed |
* - 2014 662 (D1X) |
* - 1517,1012 (D100) |
*/ |
public static final int TAG_NIKON_TYPE2_UNKNOWN_14 = 0x0099; |
|
/** |
* Values observed |
* - 78/10 78/10 |
* - 78/10 78/10 (D70) |
* - 59/10 59/5 (D1X) |
* - 7.8,7.8 (D100) |
*/ |
public static final int TAG_NIKON_TYPE2_UNKNOWN_15 = 0x009A; |
|
/** |
* Values observed |
* - NO= 00002539 |
*/ |
public static final int TAG_NIKON_TYPE2_UNKNOWN_25 = 0x00A0; |
|
/** |
* Values observed |
* - 1564851 |
*/ |
public static final int TAG_NIKON_TYPE2_UNKNOWN_26 = 0x00A2; |
|
/** |
* Values observed |
* - 0 |
*/ |
public static final int TAG_NIKON_TYPE2_UNKNOWN_27 = 0x00A3; |
|
/** |
* This appears to be a sequence number to indentify the exposure. This value seems to increment |
* for consecutive exposures (observed on D70). |
* |
* Values observed |
* - 5062 |
*/ |
public static final int TAG_NIKON_TYPE2_EXPOSURE_SEQUENCE_NUMBER = 0x00A7; |
|
/** |
* Values observed |
* - 0100 (D70) |
*/ |
public static final int TAG_NIKON_TYPE2_UNKNOWN_32 = 0x00A8; |
|
/** |
* Values observed |
* - NORMAL (D70) |
*/ |
public static final int TAG_NIKON_TYPE2_UNKNOWN_33 = 0x00A9; |
|
/** |
* Nikon Browser suggests this value represents Saturation... |
* Values observed |
* - NORMAL (D70) |
*/ |
public static final int TAG_NIKON_TYPE2_UNKNOWN_29 = 0x00AA; |
|
/** |
* Values observed |
* - AUTO (D70) |
* - (blank) (D70) |
*/ |
public static final int TAG_NIKON_TYPE2_UNKNOWN_30 = 0x00AB; |
|
/** |
* Data about changes set by Nikon Capture Editor. |
* |
* Values observed |
*/ |
public static final int TAG_NIKON_TYPE2_CAPTURE_EDITOR_DATA = 0x0E01; |
|
/** |
* Values observed |
* - 1473 |
* - 7036 (D100) |
*/ |
public static final int TAG_NIKON_TYPE2_UNKNOWN_16 = 0x0E10; |
|
protected static final HashMap _tagNameMap = new HashMap(); |
|
static |
{ |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_FIRMWARE_VERSION), "Firmware Version"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_ISO_1), "ISO"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_QUALITY_AND_FILE_FORMAT), "Quality & File Format"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_CAMERA_WHITE_BALANCE), "White Balance"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_CAMERA_SHARPENING), "Sharpening"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_AF_TYPE), "AF Type"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_CAMERA_WHITE_BALANCE_FINE), "White Balance Fine"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_CAMERA_WHITE_BALANCE_RB_COEFF), "White Balance RB Coefficients"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_ISO_2), "ISO"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_ISO_SELECTION), "ISO Selection"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_DATA_DUMP), "Data Dump"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_IMAGE_ADJUSTMENT), "Image Adjustment"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_CAMERA_TONE_COMPENSATION), "Tone Compensation"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_ADAPTER), "Adapter"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_LENS), "Lens"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_MANUAL_FOCUS_DISTANCE), "Manual Focus Distance"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_DIGITAL_ZOOM), "Digital Zoom"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_CAMERA_COLOR_MODE), "Colour Mode"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_CAMERA_HUE_ADJUSTMENT), "Camera Hue Adjustment"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_NOISE_REDUCTION), "Noise Reduction"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_CAPTURE_EDITOR_DATA), "Capture Editor Data"); |
|
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_UNKNOWN_1), "Unknown 01"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_UNKNOWN_2), "Unknown 02"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_UNKNOWN_3), "Unknown 03"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_UNKNOWN_4), "Unknown 04"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_UNKNOWN_5), "Unknown 05"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_AF_FOCUS_POSITION), "AF Focus Position"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_UNKNOWN_7), "Unknown 07"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_UNKNOWN_8), "Unknown 08"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_UNKNOWN_9), "Unknown 09"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_LIGHT_SOURCE), "Light source"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_UNKNOWN_11), "Unknown 11"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_UNKNOWN_12), "Unknown 12"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_UNKNOWN_13), "Unknown 13"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_UNKNOWN_14), "Unknown 14"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_UNKNOWN_15), "Unknown 15"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_UNKNOWN_16), "Unknown 16"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_FLASH_SYNC_MODE), "Flash Sync Mode"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_AUTO_FLASH_MODE), "Auto Flash Mode"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_AUTO_FLASH_COMPENSATION), "Auto Flash Compensation"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_EXPOSURE_SEQUENCE_NUMBER), "Exposure Sequence Number"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_COLOR_MODE), "Color Mode"); |
|
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_UNKNOWN_20), "Unknown 20"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_UNKNOWN_21), "Unknown 21"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_UNKNOWN_22), "Unknown 22"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_UNKNOWN_23), "Unknown 23"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_UNKNOWN_24), "Unknown 24"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_UNKNOWN_25), "Unknown 25"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_UNKNOWN_26), "Unknown 26"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_UNKNOWN_27), "Unknown 27"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_UNKNOWN_29), "Unknown 29"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_UNKNOWN_30), "Unknown 30"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_UNKNOWN_32), "Unknown 32"); |
_tagNameMap.put(new Integer(TAG_NIKON_TYPE2_UNKNOWN_33), "Unknown 33"); |
} |
|
public NikonType2MakernoteDirectory() |
{ |
this.setDescriptor(new NikonType2MakernoteDescriptor(this)); |
} |
|
public Rational getAutoFlashCompensation() throws MetadataException |
{ |
if (!containsTag(NikonType2MakernoteDirectory.TAG_NIKON_TYPE2_AUTO_FLASH_COMPENSATION)) |
return null; |
|
byte[] bytes = getByteArray(NikonType2MakernoteDirectory.TAG_NIKON_TYPE2_AUTO_FLASH_COMPENSATION); |
return CalculateFlashCompensationFromBytes(bytes); |
} |
|
public static Rational CalculateFlashCompensationFromBytes(byte[] bytes) |
{ |
if (bytes.length==3) |
{ |
byte denominator = bytes[2]; |
int numerator = (int)bytes[0] * bytes[1]; |
return new Rational(numerator, denominator); |
} |
return null; |
} |
|
public String getName() |
{ |
return "Nikon Makernote"; |
} |
|
protected HashMap getTagNameMap() |
{ |
return _tagNameMap; |
} |
} |