# Nikon メーカーノート # # ID: 35 D70 # 36 E700/E800/E900/E900S/E910/E950 # sub Inquire_NIKON_MakerNote{ my ( $IO, $makernote, $endian, $TIFF_HEAD, $makerID, $makerABBR, $MAKER_TOP ) = @_; my ( %SHT, %LNG, %CTYPE ); my ( $buf, $IFDnum, $pos, $i, $buflen ); my ( $TAG, $TYPE, $COUNT, $OFFSET, $OutData ); my ( $lang, $ExifTAG, $endian_m, $offset, $mnum, $model ); my ( @buf, %BLANC ); $lang = $lang[0]; $ExifTAG = 'ExifTAG' . $lang; %BLANC = ( 9 => '_BLANC', 171 => '_BLANC' ); %CTYPE = ( 1 => 'BYTE ', 2 => 'ASCII ', 3 => 'SHORT ', 4 => 'LONG ', 5 => 'RATIONAL ', 6 => 'N/A ', 7 => 'UNDEFINED', 8 => 'SSHORT ', 9 => 'SLONG ', 10 => 'SRATIONAL' ); %SHT = ( 'II' => 'v', 'MM' => 'n' ); %LNG = ( 'II' => 'V', 'MM' => 'N' ); $buflen = length( $makernote ); $endian_m = substr( $makernote, 10, 2 ); if( $endian_m =~ /(II|MM)/ ){ $TIFF_HEAD = $MAKER_TOP + 10; $buf = substr( $makernote, 18, 2 ); $offset = 20; }else{ $endian_m = $endian; $buf = substr( $makernote, 8, 2 ); $mnum = @ExifMaker; for( $i = 0 ; $i < $mnum ; $i++ ){ $model = $ExifModel[$i]; if( $model =~ /$ExifInfo{'272'}/ ){ $makerID = $ExifMakerID[$i]; } } $offset = 10; } $IFDnum = unpack( $SHT{$endian_m}, $buf ); return if( $offset + $IFDnum * 12 > $buflen ); for( $i = 0; $i < $IFDnum ; $i++ ){ $pos = $offset + $i * 12; $TAG = substr( $makernote, $pos, 2 ); $TYPE = substr( $makernote, $pos+2, 2 ); $COUNT = substr( $makernote, $pos+4, 4 ); $OFFSET = substr( $makernote, $pos+8, 4 ); $TAG = unpack( $SHT{$endian_m}, $TAG ); $TYPE = unpack( $SHT{$endian_m}, $TYPE ); $COUNT = unpack( $LNG{$endian_m}, $COUNT ); $OutData = &IFDRead( $IO, $TYPE, $COUNT, $OFFSET, $TIFF_HEAD, $endian_m ); if( $BLANC{$TAG} && $OutData !~ /\S/ ){ $OutData = $BLANC{$TAG}; } if( $TAG == 136 ){ # @buf = unpack( "C$COUNT", $OutData ); $OutData = join( ' ', unpack( "C$COUNT", $OutData ) ); } if( $debug_write && $CTYPE{$TYPE} eq 'UNDEFINED' ){ if( $TAG != 136 ){ $OutData = ''; } } $TAG = $makerID * 100000 + $TAG; unless( ( $$ExifTAG{$TAG} =~ /unknown/ || $$ExifTAG{$TAG} eq '' ) ){ $ExifInfo{$TAG} = $OutData; } if( $debug_write ){ # if( $CTYPE{$TYPE} eq 'UNDEFINED' ){ $OutData = ''; } print "$i\t$TAG\t$CTYPE{$TYPE}\t$COUNT\t$OutData\n"; } } if( $debug_write ){ print "\n"; } } 1;