Ich habe eine Paranoia wegen versehentlicher Formatierung von SD-Karten, die Fotos enthalten, die ich noch nicht hochgeladen habe. Ich versuche, vorsichtig zu sein, aber da ich manchmal mit zwei oder drei Karten jongliere, werde ich trotzdem nervös.
Ich habe ein Importskript, das Fotos einsaugt und die korrekte Übertragung überprüft, aber ich habe keine gute Möglichkeit, die SD-Karte dann als "sicher zum Löschen" zu markieren. Natürlich gibt es ein paar Dinge, die ich in der physischen Welt tun könnte (die Karte sperren und entsperren oder an einem bestimmten Ort aufbewahren usw.), aber ich bin manchmal geistesabwesend oder abgelenkt und bevorzuge den Computer passe darauf auf.
Natürlich könnte ich auch die Karte selbst als Teil des Skripts formatieren, aber ... es scheint, als würde dies tatsächlich in erster Linie eine andere mögliche Katastrophe einführen, wenn beispielsweise meine Fehlerbehandlung Fehler aufweist. Außerdem warte ich gerne bis später, um die Karte zu formatieren, weil mein Upload-Prozess nur lokal speichert, während ein Tag später das Nacht-Backup sie extern kopiert hat.
Eine Idee, die ich hatte, war, ein JPEG (oder ein anderes Bild) mit einem schönen grünen Hintergrund und dem Text "Format sicher!" auf die Karte zu schreiben. – Wenn ich das dann mit der Karte in der Kamera sehe, wüsste ich, dass ich die Formatoptionen in der Kamera auslösen muss.
Aber ich kann die Kamera anscheinend nicht dazu bringen, ein von mir erstelltes Bild tatsächlich anzuzeigen. Gibt es bestimmte Metadaten, Speicherorte oder andere Tricks, die die Kamera dazu bringen, diese Datei zu erkennen?
Auf die Gefahr hin, nur irrelevanten Code auszugeben, hier ist ein Perl-Programm, das ich für einen ähnlichen Zweck verwendet habe - Bilder mit einem Kartenleser auf einen Drucker übertragen (bevor ich den Drucker nahe genug lokalisieren konnte, um seine USB-Verbindung zu verwenden). Es hat einige eingebaute Annahmen (dass Kartendateisysteme unter benutzermontierbar sind /media/card/<card-type>
), aber Sie sollten in der Lage sein, den Teil mount
/ zu verwerfen, umount
wenn er für Sie nicht relevant ist. (Wenn ich es noch einmal von Grund auf neu schreiben würde, würde ich wahrscheinlich pmount
stattdessen verwenden.)
Es gibt auch einen Versuch, Nicht-JPEG-Bildern eine geeignete Thumbnail-Datei zu geben, wie von DCIM vorgeschrieben; Ich kann bestätigen, dass dies auf meiner Canon DSLR funktioniert, aber ich kann mich nicht erinnern, ob ich es auf einer Fuji getestet habe. Wenn ich es täte, wäre es auf einem F30 oder F60 compact.
FWIW, mein Kartenleseskript (nicht gezeigt) löscht jedes Bild aus dem Kartendateisystem, wenn es korrekt in mein Archivverzeichnis geschrieben (und als schreibgeschützt markiert) wurde. Ich habe eine --keep
Option, dies zu überschreiben, was beim Testen von Änderungen am Skript nützlich ist. Ich formatiere die Karten nie neu.
#!/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;
}
Ich entschuldige mich nochmals für die Länge. Nun sollte aber klar sein, wohin das Bild im Dateisystem der Karte zu schreiben ist: Insbesondere muss es nach dem DCIM- Standard in sein, DCIM/nnnAAAAA/AAAAnnnn.ext
wobei es sich um eine Ziffer n
, A
ein beliebiges Zeichen¹ und ext
ein JPG
oder handelt, THM
je nachdem, ob es sich um das Objekt selbst oder um ein handelt separates Vorschaubild. Wenn der Name nicht in dieses Muster passt, wird die Kamera ihn wahrscheinlich ignorieren.
Beachten Sie auch die Verwendung von exiftran -g
zum Hinzufügen eines EXIF-Thumbnails (in der richtigen Größe) zu einem Bild, das keins hat. Das ist wahrscheinlich wichtig für Ihre Verwendung, da sich Kameras in der Regel auf die Miniaturansicht für die Bildvorschau verlassen. Das von GIMP erstellte hat wahrscheinlich die falsche Größe und kann dazu führen, dass Ihre Kamera das Bild ignoriert, einen Platzhalter anzeigt oder sogar einen Lesefehler meldet.
¹ Das heißt, jedes Zeichen innerhalb des recht eingeschränkten Satzes, der von DCIM zugelassen wird: 123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_
.
exiftran -g
, da das von GIMP erstellte aus irgendeinem Grund einen Lesefehler verursacht (falsche Größe vielleicht). Eine Datei ohne Thumbnail verursacht ebenfalls einen Lesefehler. (Das heißt, wenn die Datei gemäß der DCIM-Spezifikation benannt ist; andernfalls wird sie einfach nicht verarbeitet.)exiftran
Zeile dort drin ist (ich bin auch ein GIMPer). Es ist schön zu wissen, dass es sich gelohnt hat, an meinem alten, nicht mehr verwendeten Skript festzuhalten! :-)DCIM/999_AAAA/AAAA9999.JPG
führt dazu, dass die Kamera einen Fehler anzeigt (ich habe die genaue Formulierung vergessen, aber etwas über das Erreichen einer numerischen Grenze) und auf nichts reagiert – Sie können die Karte nicht einmal formatieren.Ich weiß nicht, was erforderlich ist, um das "fremde" Bild zu erkennen, wahrscheinlich etwas im Exif ... aber für Ihr Ziel erstellen Sie einfach das Bild mit Ihrer Nachricht, mit entsprechendem Hintergrund, und machen Sie ein Foto davon, wenn Sie es anzeigen dem heimischen Computerbildschirm. Dann ist es auch schon in der Kamera.
Null
mattdm
Null
mattdm
Itai
mattdm
osulisch
mattdm
Nayuki
Chris