Есть ли способ написать «чужое» изображение, чтобы камера Fujifilm X отображала его? - Фотопедия
7 голосов
/ 01 сентября 2016

У меня паранойя из-за случайного форматирования SD-карт с фотографиями, которые я еще не загрузил. Я стараюсь быть осторожным с этим, но так как я иногда жонглирую двумя или тремя картами, я все равно нервничаю.

У меня есть скрипт импорта, который засасывает фотографии и проверяет правильность передачи, но у меня нет хорошего способа пометить SD-карту как «безопасную для удаления». Очевидно, есть несколько вещей, которые я мог бы сделать в физическом мире (заблокировать и разблокировать карту, или поместить ее в специальное место и т. Д.), Но я иногда рассеян или отвлекаюсь, и я бы предпочел компьютер позаботься об этом.

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

Одна из моих идей заключалась в том, чтобы записать JPEG (или другое изображение) на карту с красивым зеленым фоном и текстом «безопасно форматировать!» - затем, когда я увижу это с картой в камере, я буду знать, чтобы активировать опции формата в камере.

Но я не могу заставить камеру отображать любое изображение, которое я создаю. Существуют ли какие-то метаданные, местоположение или другой трюк, который заставит камеру распознавать этот файл?

Ответы [ 2 ]

16 голосов
/ 01 сентября 2016

Я не знаю, что требуется для распознавания "чужого" изображения, возможно, чего-то в Exif ... но для вашей цели просто создайте изображение с вашим сообщением, с соответствующим фоном, и сфотографируйте его при отображении на экране домашнего компьютера. Тогда это уже в камере.

4 голосов
/ 02 сентября 2016

С риском просто выбросить ненужный код, вот программа на 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_.

Добро пожаловать на сайт Фотопедия, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...