연결된 tiff 파일 분할


0

여러 개의 tiff 파일이 함께 연결된 파일이 있습니다. (이것은 다중 페이지 tiff가 아닙니다.) 파일을 별도의 파일로 다시 분할하는 방법을 찾고 있습니다. 프로세스를 자동화 할 수 있도록 명령 줄에서 실행하는 것이 좋습니다.

지나치게 단순화 할 수는 있지만 각 이미지는 16 진수 값으로 시작합니다 49 49 2A. AWK와 SPLIT을 사용하여 이진 파일을 분할하는 다양한 제안을 시도했지만 내 상황에서 아무런 효과도 얻지 못했습니다.

이것을 작동시키는 데 사용할 수있는 다른 방법이 있습니까?


편집 : 답변으로 변경됨
horatio

답변:


2

연결된 TIFF가 모두 리틀 엔디안 파일 (49 49 2A 00 매직 번호) 인 경우이 Perl 스크립트가 작동합니다. 다음으로 호출perl foo.pl < file.tif

#!/usr/bin/env perl                                                         

my $big_endian = "MM\0*";
my $big_endian_regex = "MM\0\\*";
my $little_endian = "II*\0";
my $little_endian_regex = "II\\*\0";

my $tiff_magic = $little_endian;
my $tiff_magic_regex = $little_endian_regex;

my $n = 0;
my $fileprefix = "chunk";
my $buffer;

{ local $/ = undef; $buffer = <stdin>; }

my @images = split /${tiff_magic_regex}/, $buffer;

for my $image (@images) {
    next if $image eq '';
    my $file = sprintf("$fileprefix.%02d.tif", $n++);
    open FILE, ">", $file or die "open $file: ";
    print FILE $tiff_magic, $image or die "print $file: ";
    close FILE or die "close $file: ";
}

exit 0;

0

TIFF 파일의 경우 첫 번째 2 바이트는 char이며 바이트 순서 (intel 또는 motorola)의 경우 ASCII "II"또는 "MM"으로 평가 한 다음 10 진수 42이어야하는 버전의 경우 2 바이트 (워드)로 평가합니다. 공포).

예를 들어 http://www.fileformat.info/format/tiff/corion.htm을 참조하십시오.

귀하의 예에서, II + 42 인텔 바이트 순서 및 버전 42가 표시됩니다.


말이 되겠네요. 이제 파일을 실제로 분할하는 데 어떻게 사용할 수 있습니까?
matthew

그것은 내 경험을 넘어선 것입니다. 이를 수행하는 한 가지 방법은 파일을 스트림 및 버퍼 입력으로 열고 바이트 시퀀스를 확인한 다음 새 파일이있을 때마다 새 파일을 내보내는 것입니다. 이것은 우아하지는 않지만이 작업을 수행하는 경우 한 번에 1 바이트를 읽는 대신 큰 덩어리를 한 번에 읽음으로써 가장 빠른 속도를 얻을 수 있습니다. 유닉스 유틸리티에 대해 아는 것은 AWK가 텍스트를위한
것이고
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.