Thursday, May 10, 2007
Perl 펄] EXIF 정보 읽기, 디카 촬영 정보 출력 소스; Exif Info Dump
디카로 찍은 사진 파일 속의 EXIF 정보를 읽어서 화면에 출력하는 펄 프로그램입니다. 소스는 짧고 간단하지만 극히 자세한 정보까지 다 나옵니다. 심지어 카메라의 시리얼 넘버까지 다 나오더군요.
그런데 일부 정보는 텍스트가 아닌 이진 데이터 (Binary Data) 로 출력되기에, 헥사(Hex) 로 변환 출력해 주었습니다. 이진 데이터를 화면에 곧바로 출력하면 이런저런 문제가 생길 수 있기 때문입니다.
다음의 외부 모듈을 다운받아서 설치해 주어야 아래의 소스를 실행할 수 있습니다: ▶▶ Perl 펄] Image::ExifTool::Exif 모듈 다운로드 설치법
파일명: exifdump.pl
※ 아래 박스 클릭 후, 키보드 화살표 키로 좌우 스크롤 가능함
실행 결과 화면은 여기에 있습니다: ▶▶ NIKON D40X: Full Exif Info Dump; 니콘 DSLR 촬영 정보
그리고
exifdump.pl test.jpg > out.txt
이렇게 실행하면, 화면 출력 결과가 out.txt 라는 파일로 저장됩니다.
메타 정보를 파일명으로 자동 변경 유틸리티: ▶▶ Perl 펄] 디카 메타 정보를, JPG, RAW (NEF) 파일명으로 변경 유틸리티; Exif to Filename
그런데 일부 정보는 텍스트가 아닌 이진 데이터 (Binary Data) 로 출력되기에, 헥사(Hex) 로 변환 출력해 주었습니다. 이진 데이터를 화면에 곧바로 출력하면 이런저런 문제가 생길 수 있기 때문입니다.
다음의 외부 모듈을 다운받아서 설치해 주어야 아래의 소스를 실행할 수 있습니다: ▶▶ Perl 펄] Image::ExifTool::Exif 모듈 다운로드 설치법
Perl로, 디카의 조리개 값, 셔터 속도 등 출력
파일명: exifdump.pl
※ 아래 박스 클릭 후, 키보드 화살표 키로 좌우 스크롤 가능함
#!/usr/bin/perl
use strict; use warnings;
die "Input photo filename...\n" if ($#ARGV == -1);
die "Not a valid file...\n" if not (-f $ARGV[0]);
use Image::ExifTool;
my $exifTool = new Image::ExifTool;
$exifTool->Options(Unknown => 1);
my $info = $exifTool->ImageInfo($ARGV[0]);
my $group = '';
my $tag;
foreach $tag ($exifTool->GetFoundTags('Group0')) {
if ($group ne $exifTool->GetGroup($tag)) {
$group = $exifTool->GetGroup($tag);
print "---- $group ----\n";
}
my $val = $info->{$tag};
if (ref $val eq 'SCALAR') {
if ($$val =~ /^Binary data/) {
$val = "($$val)";
} else {
my $len = length($$val);
$val = "(Binary data $len bytes)";
}
}
$val = stringToHex($val) if (!isPrintableString($val));
printf("%-32s : %s\n", $exifTool->GetDescription($tag), $val);
}
sub isPrintableString {
my @a = unpack "C*", $_[0]; # 문자열을, 1바이트씩 분리하여 배열로 만들기
foreach (@a) {
next if ($_ == 0x0A || $_ == 0x0D || $_ == 0x09);
return 0 if ($_ < 0x20 || $_ > 0x7E); # 키보드로 입력할 수 없는 문자일 경우는 거짓(false) 반환
}
return 1; # 그밖의 경우는 참(true) 반환
}
sub stringToHex {
my @a = unpack "C*", $_[0]; # 문자열을, 1바이트씩 분리하여 배열로 만들기
my $s = "";
foreach (@a) {
$s .= sprintf("%02X ", $_);
}
return $s;
}
use strict; use warnings;
die "Input photo filename...\n" if ($#ARGV == -1);
die "Not a valid file...\n" if not (-f $ARGV[0]);
use Image::ExifTool;
my $exifTool = new Image::ExifTool;
$exifTool->Options(Unknown => 1);
my $info = $exifTool->ImageInfo($ARGV[0]);
my $group = '';
my $tag;
foreach $tag ($exifTool->GetFoundTags('Group0')) {
if ($group ne $exifTool->GetGroup($tag)) {
$group = $exifTool->GetGroup($tag);
print "---- $group ----\n";
}
my $val = $info->{$tag};
if (ref $val eq 'SCALAR') {
if ($$val =~ /^Binary data/) {
$val = "($$val)";
} else {
my $len = length($$val);
$val = "(Binary data $len bytes)";
}
}
$val = stringToHex($val) if (!isPrintableString($val));
printf("%-32s : %s\n", $exifTool->GetDescription($tag), $val);
}
sub isPrintableString {
my @a = unpack "C*", $_[0]; # 문자열을, 1바이트씩 분리하여 배열로 만들기
foreach (@a) {
next if ($_ == 0x0A || $_ == 0x0D || $_ == 0x09);
return 0 if ($_ < 0x20 || $_ > 0x7E); # 키보드로 입력할 수 없는 문자일 경우는 거짓(false) 반환
}
return 1; # 그밖의 경우는 참(true) 반환
}
sub stringToHex {
my @a = unpack "C*", $_[0]; # 문자열을, 1바이트씩 분리하여 배열로 만들기
my $s = "";
foreach (@a) {
$s .= sprintf("%02X ", $_);
}
return $s;
}
실행 결과 화면은 여기에 있습니다: ▶▶ NIKON D40X: Full Exif Info Dump; 니콘 DSLR 촬영 정보
그리고
exifdump.pl test.jpg > out.txt
이렇게 실행하면, 화면 출력 결과가 out.txt 라는 파일로 저장됩니다.
메타 정보를 파일명으로 자동 변경 유틸리티: ▶▶ Perl 펄] 디카 메타 정보를, JPG, RAW (NEF) 파일명으로 변경 유틸리티; Exif to Filename
tag: perl
Perl | 펄
tag: camera
카메라 | 디카 DSLR | 사진용품 사용기
<< Home