С риском просто выбросить ненужный код, вот программа на Perl, которую я использовал для аналогичной цели - передачи изображений на принтер с помощью устройства чтения карт (до того, как я смог найти принтер достаточно близко, чтобы использовать его USB-соединение) , Он имеет некоторые встроенные допущения (что файловые системы карты могут быть установлены пользователем под /media/card/<card-type>
), но вы сможете отказаться от части mount
/ umount
, если она вам не подходит. (Если бы я писал это снова с нуля, я бы, вероятно, вместо этого использовал pmount
.)
Существует также попытка предоставить изображениям, отличным от JPEG, подходящий файл миниатюр в соответствии с предписаниями DCIM; Я могу подтвердить, что это работает на моей зеркальной камере Canon, но я не могу вспомнить, проверял ли я это на Fuji. Если бы я это сделал, он был бы на компакте F30 или F60.
FWIW, мой скрипт чтения карт (не показан) удаляет каждое изображение из файловой системы карты, когда оно правильно записано в мой каталог архива (и помечено только для чтения). У меня есть опция --keep
, чтобы переопределить это, что полезно при тестировании изменений в сценарии. Я никогда не переформатирую карты.
код
#!/usr/bin/perl
use strict;
use Getopt::Long;
# Usage: write-image.pl file... dest
# dest is a dcf root directory - i.e. it contains a dcim subdir.
my $verbose = '';
my $rotate = '';
my $clear = '';
GetOptions ("clear!" => \$clear,
"rotate!" => \$rotate,
"verbose!" => \$verbose);
my $basedir = "/media/card";
if (@ARGV < 2) {
die "not enough arguments\n";
}
my $dest = pop;
$dest = "$basedir/$dest" unless $dest =~ /^\//;
my $mounted = -d "$dest/dcim";
unless ($mounted) {
print "mount $dest\n" if $verbose;
system("mount", "$dest") == 0 or die;
}
if ($clear && -d "$dest/dcim") {
clear(<$dest/dcim/*>);
}
# scan image directories
my $dirno = 99;
my $destdir;
foreach (<$dest/dcim/*>) {
$dirno = $1 if /\/([1-9][0-9][0-9])/;;
$destdir = $_ if /\/([1-9][0-9][0-9])linux$/;
}
unless ($destdir) {
die if ++$dirno > 999;
$destdir = "$dest/dcim/${dirno}linux";
print "Adding new directory $destdir\n" if $verbose;
-d "$dest/dcim" or mkdir"$dest/dcim" or die;
mkdir $destdir or die;
}
# scan files
my $fileno = 0;
foreach (<$destdir/????[0-9][0-9][0-9][0-9].*>) {
/\/....([0-9][0-9][0-9][0-9])\..*/;
$fileno = $1 if $1 > $fileno;
}
sub clear(@) {
my $f;
foreach $f (@_) {
if (-d $f) {
&clear(<$f/*>);
#print STDERR "rmdir $f\n";
rmdir $f;
} else {
#print STDERR "unlink $f\n";
unlink $f;
}
}
}
#do it
foreach (@ARGV) {
if (++$fileno > 9999) {
die if ++$dirno > 999;
$fileno = 1;
$destdir = "$dest/dcim/${dirno}linux";
mkdir $destdir or die;
}
my $destfile = sprintf "$destdir/img_%04d", $fileno;
my $suffix = "";
if (/\.[^.]+\Z/) {
$suffix = $&;
}
#print "$_ -> $destfile$suffix\n" if $verbose;
print "$_: " if $verbose; # no newline!
if ("$suffix" eq ".jpg") {
if ($rotate) {
system("( jpegtran -rot 90 -perfect $_ || djpeg $_ | pnmflip -cw | cjpeg -quality 95 -dct float -sample 1x1 ) > $destfile.jpg && exiftran -g -i $destfile.jpg") == 0 || die;
} else {
system("exiftran", "-g", "-o", "$destfile.jpg", "$_") == 0 || die;
print sprintf(" -> img_%04d$suffix\n", $fileno) if $verbose;
}
} else {
system("/bin/cp $_ $destfile$suffix") == 0 || die "$!\n";
system("anytopnm $_ 2>&- | pnmscale -xysize 160 120 | pnmpad -width 160 -height 120 | pnmtojpeg >$destfile.thm") ==0 || die "$!\n";
print "\n" if $verbose;
}
}
unless ($mounted) {
print "umount $dest\n" if $verbose;
system("umount", "$dest") == 0 or die;
}
Опять же, я прошу прощения за длину. Но теперь должно быть ясно, куда записывать изображение в файловой системе карты: в частности, согласно стандарту DCIM , оно должно быть в DCIM/nnnAAAAA/AAAAnnnn.ext
, где n
- это число, A
- это любой символ¹, а ext
равен JPG
или THM
в зависимости от того, является ли это сам объект или отдельный эскиз. Если имя не соответствует этому шаблону, камера, скорее всего, его проигнорирует.
Обратите внимание также на использование exiftran -g
для добавления миниатюры EXIF (правильного размера) к изображению, у которого его нет. Это, вероятно, важно для вашего использования, так как камеры, как правило, полагаются на миниатюру для предварительного просмотра изображения. Созданный GIMP, вероятно, имеет неправильный размер и может заставить вашу камеру игнорировать изображение, отображать заполнитель или даже сообщать об ошибке чтения.
¹ То есть любой символ в пределах вполне ограниченного набора, разрешенного DCIM: 123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_
.