¿Hay alguna manera de escribir una imagen "extranjera" para que una cámara Fujifilm X la muestre?

Tengo una paranoia sobre el formateo accidental de tarjetas SD que contienen fotos que aún no he subido. Trato de tener cuidado con eso, pero como a veces hago malabarismos con dos o tres cartas, todavía me pongo nervioso.

Tengo un script de importación que absorbe fotos y verifica la transferencia correcta, pero no tengo una buena manera de marcar la tarjeta SD como "segura para eliminar". Obviamente, hay algunas cosas que podría hacer en el mundo físico (bloquear y desbloquear la tarjeta, o ponerla en un lugar especial, etc.), pero a veces estoy despistado o distraído y prefiero la computadora. cuídalo.

Por supuesto, también podría formatear la tarjeta como parte de la secuencia de comandos, pero... parece que eso está introduciendo principalmente otro posible desastre, si mi manejo de errores tiene errores, por ejemplo. Además, me gusta esperar hasta más tarde para formatear la tarjeta, porque mi proceso de carga solo se guarda localmente, mientras que un día después la copia de seguridad nocturna los habrá copiado fuera del sitio.

Una idea que tuve fue escribir un archivo JPEG (u otra imagen) en la tarjeta con un bonito fondo verde y el texto "seguro para formatear". — luego, cuando veo eso con la tarjeta en la cámara, sabría activar las opciones de formato en la cámara.

Pero, parece que no puedo hacer que la cámara muestre realmente ninguna imagen que construyo. ¿Hay metadatos, ubicación u otro truco en particular que haga que la cámara reconozca este archivo?

¿Cuál es la diferencia entre hacer que su secuencia de comandos elimine los archivos y dejar que coloque una imagen en la tarjeta para que usted la formatee en la cámara? ¿Cómo previene esto último los posibles desastres que le impiden hacer lo primero?
@null Con este último, no hay un comportamiento automatizado inherentemente destructivo. Digamos que cometo un error al cambiar la parte anterior del script y los archivos se anulan instantáneamente /dev/en lugar de guardarse, y el script continúa felizmente con el formato antes de que yo tenga la oportunidad de intervenir. Ups.
¿Supongo que podría probar el script durante su desarrollo para tales errores? ¿Qué sucede si elimina los archivos en la cámara mientras está distraído o distraído sin verificar los resultados del guión? ¡¿Ups?! Tal vez comprar algunas tarjetas SD más y nunca borrar ningún archivo durante una sesión/viaje sea la solución más simple.
Por supuesto que lo haré, pero... por definición, los errores que sobreviven suelen ser los que no probaste. Mientras que "no formatee la tarjeta a menos que tenga el marcador 'seguro'" parece un hábito bastante fácil de establecer.
¿Qué cámara es? La mayoría de las Fuji muestran imágenes tomadas desde otra cámara con un pequeño icono de 'regalo'. Intente descargar una imagen que no sea de Fuji en la tarjeta para ver si funciona.
Es la X-T10. Creé una imagen en GIMP y no se mostró.
A veces me pregunto sobre la definición de una pregunta de fotografía aquí. A menudo descartamos las preguntas de Photoshop. Supongo que se trata más del flujo de trabajo de la fotografía, pero aún parece bastante orientado al procesamiento de imágenes en lugar de una pregunta de fotografía "real". (¡Aunque creo que es una buena pregunta!)
@osullic, Sí; Casi lo etiqueté como "flujo de trabajo" y traté de ponerlo en el contexto de hacer fotografía. Si hubiera hecho la misma pregunta sobre hacer esto para usar mi cámara como una herramienta de presentación improvisada, votaría por cerrarlo como fuera de tema. :) También trato de aplicar la misma lógica a las preguntas de Photoshop.
@mattdm Hace aproximadamente ~ 5 años, pude inyectar imágenes generadas por computadora en una tarjeta SD y hacer que la cámara las mostrara. Mi truco fue crear imágenes JPEG de Huffman 4:2:2 de referencia donde el ancho y la altura son múltiplos de 8. (Evite la codificación progresiva, 4:4:4 y aritmética). Avíseme si esto funciona para usted o si necesita información adicional. Espero que esto se pueda convertir en una respuesta completa.
Si bien la aplicación del OP puede ser OT, la idea de que las imágenes que se originan en otro lugar se muestren en la cámara es, en mi opinión, perfectamente válida (por ejemplo, para mostrar presentaciones de diapositivas (cartera) en un televisor / proyector sin la necesidad de otro dispositivo, cartera siempre con el fotógrafo o tener una tarjeta de visita a la vista en caso de pérdida de la cámara). Además, es una pregunta sobre el flujo de trabajo y la tecnología de la cámara, y no existe un intercambio de pila especializado para ninguno de los dos. Por favor, no lo cierre.

Respuestas (2)

A riesgo de simplemente arrojar código irrelevante, aquí hay un programa Perl que usé para un propósito similar: transferir imágenes a una impresora con un lector de tarjetas (antes de que pudiera ubicar la impresora lo suficientemente cerca como para usar su conexión USB). Tiene algunas suposiciones integradas (que los sistemas de archivos de tarjeta son montables por el usuario en /media/card/<card-type>), pero debería poder descartar la parte mount/ umountsi no es relevante para usted. (Si estuviera escribiendo de nuevo desde cero, probablemente lo usaría en su pmountlugar).

También hay un intento de dar a las imágenes que no son JPEG un archivo en miniatura adecuado según lo prescrito por DCIM; Puedo confirmar que esto funciona en mi Canon DSLR, pero no recuerdo si lo probé en una Fuji. Si lo hiciera, sería en un compacto F30 o F60.

FWIW, mi secuencia de comandos de lectura de tarjetas (que no se muestra) elimina cada imagen del sistema de archivos de la tarjeta cuando se ha escrito correctamente en mi directorio de archivo (y marcado como de solo lectura). Tengo una --keepopción para anular eso, lo cual es útil cuando se prueban cambios en el script. Nunca vuelvo a formatear las tarjetas.

El código

#!/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;
}

Nuevamente, pido disculpas por la extensión. Pero ahora debería quedar claro dónde escribir la imagen en el sistema de archivos de la tarjeta: en particular, de acuerdo con el estándar DCIM , debe estar en DCIM/nnnAAAAA/AAAAnnnn.ext, donde nes numérico, Aes cualquier carácter¹, y extes JPGo THMdependiendo de si es el objeto en sí o un miniatura separada. Si el nombre no se ajusta a este patrón, es probable que la cámara lo ignore.

Tenga en cuenta también el uso de exiftran -gpara agregar una miniatura EXIF ​​(del tamaño correcto) a una imagen que no tiene una. Es probable que eso sea importante para su uso, ya que las cámaras tienden a depender de la miniatura para la vista previa de la imagen. El creado por GIMP probablemente tenga el tamaño incorrecto y puede hacer que su cámara ignore la imagen, muestre un marcador de posición o incluso informe un error de lectura.


¹ Es decir, cualquier carácter dentro del conjunto bastante restringido permitido por DCIM: 123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_.

Ah, sí, mi imagen creada no tenía miniatura y no la nombré de acuerdo con las especificaciones de DCIM. Probaré las dos cosas.
Esto funcionó. Tuve que crear la miniatura con exiftran -g, porque por alguna razón la creada por GIMP genera un error de lectura (tamaño incorrecto, quizás). Tener un archivo sin miniatura también provoca un error de lectura. (Es decir, si el archivo se nombra de acuerdo con la especificación DCIM; de lo contrario, simplemente no se procesa).
@matt, gracias por la información adicional; he actualizado Creo que has identificado por qué la exiftranlínea está ahí (soy un GIMPer también). ¡Es bueno saber que valió la pena conservar mi antiguo guión que ya no se usa! :-)
Otro hecho divertido: el uso DCIM/999_AAAA/AAAA9999.JPGhace que la cámara muestre un error (olvidé la redacción exacta, pero algo sobre alcanzar un límite numérico) y no responde a nada, ni siquiera puede formatear la tarjeta.
Lamentablemente, este enfoque falla por completo con mi X-T2. No estoy seguro de por qué.

No sé qué se requiere para reconocer la imagen "extranjera", probablemente algo en el Exif ... pero para su objetivo, simplemente cree la imagen con su mensaje, con el fondo apropiado, y tome una foto cuando se muestre en la pantalla del ordenador de casa. Entonces ya está en la cámara.

¡JAJAJA! ¡Muy elegante! :-)
De hecho, simplemente escriba "¡Seguro para formatear!" en una hoja de papel con un marcador y tome una fotografía de eso. Vuelva a copiar esta imagen en cada tarjeta SD después de cargar las fotos desde esa tarjeta.
Si va a poner la tarjeta en la cámara y luego tomar una foto para mostrar que es seguro borrar las imágenes, ¿por qué no simplemente borrar las imágenes en ese momento en lugar de tomar la foto? Tomar la fotografía no parece agregar ninguna medida adicional de seguridad.
El objetivo es escribir la operación para que se pueda hacer sin pensar
WayneF y osullic significan hacer que su secuencia de comandos de importación escriba esa imagen "adecuada" en la tarjeta cuando se complete la carga de todas las imágenes.
@Johnny: transferirá esta imagen a su computadora y la convertirá en parte de su guión.
@NicolasRaoul Dijo que quiere eliminar las imágenes usando la opción de formato de la cámara, no del guión: cuando veo eso con la tarjeta en la cámara, sabría activar las opciones de formato en la cámara.
En lugar de tomar una nueva imagen "segura para eliminar" cada vez, simplemente tome una imagen "segura para eliminar", transfiérala o guárdela en la computadora, y ahora tiene una imagen que puede copiar a la cámara al final. del guion