У меня паранойя по поводу случайного форматирования SD-карт, которые содержат фотографии, которые я еще не загрузил. Я стараюсь быть осторожным с этим, но поскольку я иногда жонглирую двумя или тремя картами, я все равно нервничаю.
У меня есть скрипт импорта, который всасывает фотографии и проверяет правильность передачи, но у меня нет хорошего способа пометить SD-карту как «безопасную для удаления». Очевидно, есть несколько вещей, которые я мог бы сделать в физическом мире (заблокировать и разблокировать карту, положить ее в специальное место и т. д.), но иногда я бываю рассеян или отвлекаюсь, и я предпочитаю компьютер. заботиться о ней.
Конечно, я мог бы также отформатировать саму карту как часть скрипта, но... похоже, что на самом деле это в первую очередь представляет собой еще одну возможную катастрофу, если, например, в моей обработке ошибок есть ошибки. Кроме того, я предпочитаю откладывать форматирование карты на более поздний срок, потому что мой процесс загрузки просто сохраняется локально, а через день ночная резервная копия скопирует их за пределы сайта.
Одна из идей, которые у меня были, заключалась в том, чтобы записать на карту изображение в формате JPEG (или другое изображение) с красивым зеленым фоном и текстом «безопасно для форматирования!» — тогда, когда я увижу это с картой в камере, я буду знать, как активировать параметры формата в камере.
Но я не могу заставить камеру отображать любое изображение, которое я создаю. Есть ли определенные метаданные, местоположение или другой трюк, который заставит камеру распознать этот файл?
Рискуя просто сбросить нерелевантный код, вот программа 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_
.
exiftran -g
, потому что по какой-то причине миниатюра, созданная GIMP, вызывает ошибку чтения (возможно, неправильный размер). Наличие файла без эскиза также вызывает ошибку чтения. (Если файл назван в соответствии со спецификацией DCIM, иначе он просто не обрабатывается.)exiftran
есть строка (я тоже гимпер). Приятно осознавать, что мой старый, больше не используемый скрипт стоил того, чтобы его сохранить! :-)DCIM/999_AAAA/AAAA9999.JPG
камера выдает ошибку (точную формулировку забыл, но что-то про превышение числового предела) и ни на что не реагирует — вы даже не можете отформатировать карту.Я не знаю, что нужно, чтобы распознать "чужое" изображение, возможно, что-то в Exif... но для вашей цели просто создайте изображение с вашим сообщением, с соответствующим фоном, и сфотографируйте его при показе на экран домашнего компьютера. Потом уже в камеру.
нулевой
матдм
нулевой
матдм
Итай
матдм
осуллик
матдм
Наюки
Крис