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?
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
/ umount
si no es relevante para usted. (Si estuviera escribiendo de nuevo desde cero, probablemente lo usaría en su pmount
lugar).
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 --keep
opción para anular eso, lo cual es útil cuando se prueban cambios en el script. Nunca vuelvo a formatear las tarjetas.
#!/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 n
es numérico, A
es cualquier carácter¹, y ext
es JPG
o THM
dependiendo 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 -g
para 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_
.
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).exiftran
lí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! :-)DCIM/999_AAAA/AAAA9999.JPG
hace 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.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.
nulo
mattdm
nulo
mattdm
itai
mattdm
osullico
mattdm
Nayuki
cris