Есть ли способ написать «чужое» изображение, чтобы камера Fujifilm X отображала его?

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

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

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

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

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

В чем разница между тем, чтобы ваш скрипт удалял файлы, и тем, чтобы он мог поместить изображение на карту, чтобы вы отформатировали карту на камере? Как последнее предотвращает возможные катастрофы, которые мешают вам делать первое?
@null В последнем нет деструктивного автоматического поведения. Допустим, я сделал ошибку, изменив предыдущую часть скрипта, и файлы мгновенно /dev/nulled вместо того, чтобы быть сохраненными, и скрипт весело продолжает работать в формате, прежде чем я успеваю вмешаться. Упс.
Я думаю, вы могли бы попробовать скрипт во время его разработки для таких ошибок? Что, если вы удалите файлы с камеры, пока вы рассеяны или отвлекаетесь , не проверив результаты работы сценария? Ой?! Возможно, покупка еще нескольких SD-карт и никогда не удаление файлов во время сеанса / поездки — более простое решение.
Конечно, я буду, но... по определению, ошибки, которые вылезут, обычно это те, которые вы не тестировали. Принимая во внимание, что «не форматируйте карту, если на ней нет «безопасного» маркера», кажется довольно простой привычкой.
Какая камера? На большинстве фотографий Fuji изображения, снятые с другой камеры, отмечены небольшим значком «подарок». Попробуйте загрузить на карту образ, отличный от Fuji, чтобы проверить, работает ли он.
Это X-T10. Я создал изображение в GIMP, и оно не отображалось.
Иногда я задаюсь вопросом об определении вопроса фотографии здесь. Мы часто отклоняем вопросы о Photoshop. Я предполагаю, что это больше касается рабочего процесса фотографии, но все же кажется скорее ориентированным на обработку изображений, чем на «настоящий» вопрос фотографии. (Хотя, я думаю, что это хороший вопрос!)
@osullic, да; Я почти назвал это «рабочим процессом» и попытался поместить его в контекст фотографирования. Если бы я задал тот же вопрос о том, как сделать это, чтобы использовать мою камеру в качестве импровизированного инструмента для презентаций, я бы проголосовал за то, чтобы закрыть его как не по теме. :) Я пытаюсь применить ту же логику и к вопросам Photoshop.
@mattdm Около 5 лет назад я смог вставить сгенерированные компьютером изображения на SD-карту и заставить камеру показать их. Моя хитрость заключалась в том, чтобы создать базовые изображения 4:2:2 Хаффмана JPEG, где ширина и высота кратны 8. (Избегайте прогрессивного, 4:4:4 и арифметического кодирования.) Дайте мне знать, работает ли это для вас или вам нужно Дополнительная информация. Я надеюсь, что это можно превратить в полный ответ.
В то время как применение OP может быть OT, идея отображения изображений, происходящих откуда-то еще, на камере является совершенно справедливой для IMO (например, для отображения слайд-шоу (портфолио) на телевизоре / проекторе без необходимости другого устройства, портфолио всегда с фотограф или наличие визитной карточки на случай утери камеры). Кроме того, речь идет о рабочем процессе и технологии камеры, и для них нет специализированной биржи стека. Пожалуйста, не закрывайте его.

Ответы (2)

Рискуя просто сбросить нерелевантный код, вот программа 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зависимости от того, сам ли это объект или отдельная миниатюра. Если имя не соответствует этому шаблону, камера, скорее всего, проигнорирует его.JPGTHM

Обратите также внимание на использование exiftran -gдля добавления миниатюры EXIF ​​(правильного размера) к изображению, у которого ее нет. Это, вероятно, важно для вашего использования, поскольку камеры, как правило, полагаются на миниатюру для предварительного просмотра изображения. Тот, который создан GIMP, вероятно, имеет неправильный размер и может привести к тому, что ваша камера проигнорирует изображение, отобразит заполнитель или даже сообщит об ошибке чтения.


¹ То есть любой символ из довольно ограниченного набора, разрешенного DCIM: 123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_.

Ах да, у моего созданного изображения не было эскиза, и я не назвал его в соответствии со спецификациями DCIM. Я попробую обе вещи.
Это сработало. Мне пришлось создать миниатюру с помощью exiftran -g, потому что по какой-то причине миниатюра, созданная GIMP, вызывает ошибку чтения (возможно, неправильный размер). Наличие файла без эскиза также вызывает ошибку чтения. (Если файл назван в соответствии со спецификацией DCIM, иначе он просто не обрабатывается.)
@matt, спасибо за дополнительную информацию; Я обновил. Я думаю, вы поняли, почему там exiftranесть строка (я тоже гимпер). Приятно осознавать, что мой старый, больше не используемый скрипт стоил того, чтобы его сохранить! :-)
Еще один забавный факт: при использовании DCIM/999_AAAA/AAAA9999.JPGкамера выдает ошибку (точную формулировку забыл, но что-то про превышение числового предела) и ни на что не реагирует — вы даже не можете отформатировать карту.
К сожалению, этот подход совершенно не работает с моим X-T2. Не уверен, почему.

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

РЖУ НЕ МОГУ! Очень элегантный! :-)
Действительно, просто напишите «Безопасно форматировать!» на листе бумаги маркером и сфотографировать его. Скопируйте это изображение обратно на каждую SD-карту после загрузки фотографий с этой карты.
Если он собирается вставить карту в камеру, а затем сфотографировать ее, чтобы показать, что удалять изображения безопасно, почему бы просто не удалить изображения в это время вместо того, чтобы делать снимок? Фотосъемка, кажется, не добавляет никаких дополнительных мер безопасности.
Весь смысл в том, чтобы заскриптовать операцию так, чтобы ее можно было сделать не задумываясь
WayneF и osullic имеют в виду, что его скрипт импорта записывает это «правильное» изображение на карту, когда загрузка всех изображений завершена.
@Johnny: Он перенесет это изображение на свой компьютер и сделает его частью своего сценария.
@NicolasRaoul Он сказал, что хочет удалить изображения с помощью параметра формата камеры, а не из сценария: когда я увижу это с картой в камере, я буду знать, как активировать параметры формата в камере.
Вместо того, чтобы каждый раз делать новый снимок «безопасно для удаления», просто сделайте один снимок «безопасно для удаления», перенесите/сохраните его на компьютер, и теперь у вас есть изображение, которое вы можете скопировать на камеру в конце. сценария.