Hier ist ein Perl-Programm, das ich für einen ähnlichen Zweck verwendet habe - das Übertragen von Bildern auf einen Drucker mit einem Kartenleser (bevor ich den Drucker nahe genug finden konnte, um seine USB-Verbindung zu verwenden). Es gibt einige integrierte Annahmen (unter denen Kartendateisysteme vom Benutzer bereitgestellt /media/card/<card-type>
werden können), aber Sie sollten in der Lage sein, das mount
/ umount
part zu verwerfen, wenn es für Sie nicht relevant ist. (Wenn ich es noch einmal von Grund auf neu schreiben würde, würde ich es wahrscheinlich pmount
stattdessen verwenden.)
Es wird auch versucht, Nicht-JPEG-Bildern eine geeignete Miniaturbilddatei zu geben, wie von DCIM vorgeschrieben. Ich kann bestätigen, dass dies auf meiner Canon DSLR funktioniert, kann mich aber nicht erinnern, ob ich es auf einem Fuji getestet habe. Wenn ich das tun würde, 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 schreibgeschützt markiert) wurde. Ich habe die --keep
Möglichkeit, dies zu überschreiben, was beim Testen von Änderungen am Skript hilfreich ist. Ich formatiere die Karten nie neu.
Der Code
#!/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;
}
Wieder entschuldige ich mich für die Länge. Jetzt sollte jedoch klar sein, wo das Bild in das Dateisystem der Karte geschrieben werden soll: Insbesondere muss es gemäß dem DCIM- Standard in DCIM/nnnAAAAA/AAAAnnnn.ext
, wo n
numerisch A
ist, ein beliebiges Zeichen¹ sein und ext
ist JPG
oder davon abhängt , THM
ob es das Objekt selbst oder ein Objekt ist separates Vorschaubild. Wenn der Name nicht zu diesem Muster passt, wird die Kamera ihn wahrscheinlich ignorieren.
Beachten Sie auch die Verwendung von exiftran -g
, um einem Bild, das keine hat, eine EXIF-Miniaturansicht (mit der richtigen Größe) hinzuzufügen. Dies ist wahrscheinlich wichtig für Ihre Verwendung, da Kameras für die Bildvorschau in der Regel auf das Miniaturbild angewiesen sind. Die 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 von DCIM zulässigen Satzes : 123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_
.