Dividir arquivo tiff concatenado

0

Eu tenho um arquivo que é múltiplo arquivos tiff concatenados juntos. (note que esta não é uma tiff multipage). Eu estou procurando uma maneira de dividir o arquivo novamente em arquivos separados. De preferência, a partir da linha de comando, para que o processo possa ser automatizado.

Eu poderia simplificar demais, mas parece que cada imagem começa com os valores hexadecimais 49 49 2A . Fiz algumas pesquisas e tentei várias sugestões para dividir arquivos binários usando o AWK e o SPLIT, mas não consegui fazer com que a minha situação funcionasse.

Existe algum outro método que eu possa usar para que isso funcione?

    
por matthew 27.03.2012 / 21:27

2 respostas

2

Se você tem certeza de que os TIFFs concatenados são todos arquivos little-endian (49 49 2A 00 magic number), então este script Perl deve funcionar. Invoque como perl foo.pl < file.tif

#!/usr/bin/env perl                                                         

my $big_endian = "MM
#!/usr/bin/env perl                                                         

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

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;
*"; my $big_endian_regex = "MM%pre%\*"; my $little_endian = "II*%pre%"; my $little_endian_regex = "II\*%pre%"; 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;
    
por 27.03.2012 / 22:57
0

Eu sei que para arquivos TIFF, os primeiros 2 bytes são char e avaliados para ascii "II" ou "MM" para ordem de byte (intel ou motorola) e então 2 bytes (word) para a versão que deve ser decimal 42 ( não entre em pânico).

veja, por exemplo: link

No seu exemplo, você está vendo a ordem de bytes da II + 42 intel e a versão 42.

    
por 27.03.2012 / 22:14

Tags