- Timestamp:
- 2011-06-01T12:33:42+12:00 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
main/trunk/greenstone2/perllib/cpan/Image/ExifTool/WriteCanonRaw.pl
r16842 r24107 11 11 use vars qw($VERSION $AUTOLOAD %crwTagFormat); 12 12 use Image::ExifTool::Fixup; 13 14 # map for adding directories to CRW 15 my %crwMap = ( 16 XMP => 'CanonVRD', 17 CanonVRD => 'Trailer', 18 ); 13 19 14 20 # mappings to from RAW tagID to MakerNotes tagID … … 77 83 # (and has the same raw tagID as CanonFileDescription) 78 84 return if $tagInfo and $$tagInfo{Name} eq 'UserComment'; 79 my $tagType = ($rawTag >> 8) & 0x38;80 85 my $format = $Image::ExifTool::Exif::formatNumber{$formName}; 81 86 my $fsiz = $Image::ExifTool::Exif::formatSize[$format]; … … 166 171 { 167 172 my ($exifTool, $tagInfo, $valPtr) = @_; 168 Image::ExifTool::GenerateTagIDs($$tagInfo{Table});169 173 my $tagName = $$tagInfo{Name}; 170 174 if ($tagName eq 'JpgFromRaw' or $tagName eq 'ThumbnailImage') { … … 193 197 my ($exifTool, $dirInfo, $tagTablePtr) = @_; 194 198 my $dataPt = $$dirInfo{DataPt} or return 0; 195 my $raf = $$dirInfo{RAF} or return 0;196 199 my $outfile = $$dirInfo{OutFile} or return 0; 200 $$dirInfo{RAF} or return 0; 197 201 198 202 # check CR2 signature 199 return 0 if $$dataPt !~ /^.{8}CR\x02\0/s and 200 $exifTool->Error("Unsupported Canon RAW file. May cause problems if rewritten", 1); 203 if ($$dataPt !~ /^.{8}CR\x02\0/s) { 204 my ($msg, $minor); 205 if ($$dataPt =~ /^.{8}CR/s) { 206 $msg = 'Unsupported Canon RAW file. May cause problems if rewritten'; 207 $minor = 1; 208 } elsif ($$dataPt =~ /^.{8}\xba\xb0\xac\xbb/s) { 209 $msg = 'Can not currently write Canon 1D RAW images'; 210 } else { 211 $msg = 'Unrecognized Canon RAW file'; 212 } 213 return 0 if $exifTool->Error($msg, $minor); 214 } 215 201 216 # CR2 has a 16-byte header 202 217 $$dirInfo{NewDataPos} = 16; … … 231 246 # Inputs: 0) ExifTool object reference, 1) source dirInfo reference, 232 247 # 2) tag table reference 233 # Returns: true on suc ess248 # Returns: true on success 234 249 # Notes: Increments ExifTool CHANGED flag for each tag changed This routine is 235 250 # different from all of the other write routines because Canon RAW files are … … 237 252 # writing it out. Therefore this routine doesn't return the directory data as 238 253 # the rest of the Write routines do. Instead, it writes to the dirInfo 239 # Out file on the fly --> much faster, efficient, and less demanding on memory!254 # OutFile on the fly --> much faster, efficient, and less demanding on memory! 240 255 sub WriteCanonRaw($$$) 241 256 { … … 294 309 my $newVal = $exifTool->GetNewValues($tagInfo); 295 310 if (defined $newVal) { 311 # pad value to an even length (Canon ImageBrowser and ZoomBrowser 312 # version 6.1.1 have problems with odd-sized embedded JPEG images 313 # even if the value is padded to maintain alignment, so do this 314 # before calculating the size for the directory entry) 315 $newVal .= "\0" if length($newVal) & 0x01; 296 316 # add new directory entry 297 317 $newDir .= Set16u($addTag) . Set32u(length($newVal)) . … … 307 327 } 308 328 last unless defined $tag; # all done if no more directory entries 309 return 0 if $tag & 0x8000; # top bit should not be set329 return 0 if $tag & 0x8000; # top bit should not be set 310 330 my $tagID = $tag & 0x3fff; # get tag ID 311 331 my $tagType = ($tag >> 8) & 0x38; # get tag type … … 410 430 $oldVal = $value; 411 431 } 412 my $n ewValueHash = $exifTool->GetNewValueHash($tagInfo);413 if (Image::ExifTool::IsOverwriting($n ewValueHash, $oldVal)) {414 my $newVal = Image::ExifTool::GetNewValues($n ewValueHash);432 my $nvHash = $exifTool->GetNewValueHash($tagInfo); 433 if (Image::ExifTool::IsOverwriting($nvHash, $oldVal)) { 434 my $newVal = Image::ExifTool::GetNewValues($nvHash); 415 435 my $verboseVal; 416 436 $verboseVal = $newVal if $verbose > 1; … … 422 442 $value = $newVal; 423 443 ++$exifTool->{CHANGED}; 424 if ($verbose > 1) { 425 my $oldStr = $exifTool->Printable($oldVal); 426 my $newStr = $exifTool->Printable($verboseVal); 427 print $out " - CanonRaw:$$tagInfo{Name} = '$oldStr'\n"; 428 print $out " + CanonRaw:$$tagInfo{Name} = '$newStr'\n"; 429 } 444 $exifTool->VerboseValue("- CanonRaw:$$tagInfo{Name}", $oldVal); 445 $exifTool->VerboseValue("+ CanonRaw:$$tagInfo{Name}", $verboseVal); 430 446 } 431 447 } … … 505 521 if ($exifTool->{DEL_GROUP}->{MakerNotes}) { 506 522 if ($type eq 'CCDR') { 507 $exifTool->Error("Can't delete Maker notes group in CRW file");523 $exifTool->Error("Can't delete MakerNotes group in CRW file"); 508 524 return 0; 509 525 } else { … … 511 527 return 1; 512 528 } 529 } 530 # make XMP the preferred group for CRW files 531 if ($$exifTool{FILE_TYPE} eq 'CRW') { 532 $exifTool->InitWriteDirs(\%crwMap, 'XMP'); 513 533 } 514 534 … … 552 572 # add CanonVRD trailer if writing as a block 553 573 $trailPt = $exifTool->AddNewTrailers($trailPt,'CanonVRD'); 574 if (not $trailPt and $$exifTool{ADD_DIRS}{CanonVRD}) { 575 # create CanonVRD from scratch if necessary 576 my $outbuff = ''; 577 my $saveOrder = GetByteOrder(); 578 require Image::ExifTool::CanonVRD; 579 if (Image::ExifTool::CanonVRD::ProcessCanonVRD($exifTool, { OutFile => \$outbuff }) > 0) { 580 $trailPt = \$outbuff; 581 } 582 SetByteOrder($saveOrder); 583 } 554 584 # write trailer 555 585 if ($trailPt) { … … 593 623 =head1 AUTHOR 594 624 595 Copyright 2003-20 07, Phil Harvey (phil at owl.phy.queensu.ca)625 Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca) 596 626 597 627 This library is free software; you can redistribute it and/or modify it
Note:
See TracChangeset
for help on using the changeset viewer.