У меня есть файл, который объединяет несколько файлов TIFF вместе. (обратите внимание, что это не многостраничный TIFF). Я ищу способ разделить файл обратно на отдельные файлы. Желательно из командной строки, чтобы процесс можно было автоматизировать.

Я мог бы сильно упростить это, но кажется, что каждое изображение начинается с шестнадцатеричных значений 49 49 2A . Я провел некоторый поиск и пробовал различные предложения по разбиению бинарных файлов с использованием AWK и SPLIT, но не смог заставить их работать в моей ситуации.

Есть ли какой-то другой метод, который я мог бы использовать, чтобы заставить это работать?

2 ответа2

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 байта являются символами и оцениваются как ascii "II" или "MM" для порядка байтов (intel или motorola), а затем 2 байта (слово) для версии, которая должна быть десятичной 42 (не паника).

см. например: http://www.fileformat.info/format/tiff/corion.htm

В вашем примере вы видите II+42 порядка байтов Intel и версию 42.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .