Gibt es eine Möglichkeit, ein „fremdes“ Bild zu schreiben, damit eine Fujifilm X-Kamera es anzeigt?


7

Ich habe eine Paranoia über das versehentliche Formatieren von SD-Karten, die Fotos enthalten, die ich noch nicht hochgeladen habe. Ich versuche vorsichtig zu sein, aber da ich manchmal zwei oder drei Karten jongliere, werde ich immer noch nervös.

Ich habe ein Importskript, das Fotos ansaugt und die korrekte Übertragung überprüft, aber ich habe keine gute Möglichkeit, die SD-Karte als "sicher zu löschen" zu markieren. Natürlich gibt es ein paar Dinge, die ich in der physischen Welt tun könnte (Sperren und Entsperren der Karte oder Ablegen an einem bestimmten Ort usw.), aber manchmal bin ich geistesabwesend oder abgelenkt und ich würde lieber den Computer passe darauf auf.

Natürlich könnte ich die Karte auch selbst als Teil des Skripts formatieren, aber ... es scheint, als würde dies in erster Linie eine weitere mögliche Katastrophe einleiten, wenn meine Fehlerbehandlung beispielsweise Fehler aufweist. Außerdem warte ich gerne bis später, um die Karte zu formatieren, da mein Upload-Vorgang nur lokal gespeichert wird, während ein Tag später die Nachtsicherung sie außerhalb des Standorts kopiert hat.

Eine Idee, die ich hatte, war, ein JPEG (oder ein anderes Bild) auf die Karte mit einem schönen grünen Hintergrund und dem Text "sicher zu formatieren!" Zu schreiben. - Wenn ich das mit der Karte in der Kamera sehe, muss ich die Formatoptionen in der Kamera auslösen.

Aber ich kann nicht scheinen, dass die Kamera tatsächlich ein Bild anzeigt, das ich konstruiere. Gibt es bestimmte Metadaten, Speicherorte oder andere Tricks, mit denen die Kamera diese Datei erkennt?


2
Was ist der Unterschied zwischen dem Löschen der Dateien durch Ihr Skript und dem Einfügen eines Bilds auf die Karte, damit Sie die Karte vor der Kamera formatieren können? Wie verhindert Letzteres die möglichen Katastrophen, die Sie davon abhalten, Ersteres zu tun?
null

1
@null Bei letzterem gibt es kein inhärent destruktives automatisiertes Verhalten. Angenommen, ich mache einen Fehler beim Ändern des früheren Teils des Skripts und die Dateien werden sofort / dev / nulled anstatt gespeichert, und das Skript fährt fröhlich mit dem Format fort, bevor ich eingreifen kann. Hoppla.
Bitte lesen Sie mein Profil

1
Natürlich werde ich, aber ... per Definition sind Fehler, die es schaffen, normalerweise diejenigen, auf die Sie nicht getestet haben. Während "die Karte nicht formatieren, es sei denn, sie hat den" sicheren "Marker" scheint eine ziemlich einfache Angewohnheit zu sein.
Bitte lesen Sie mein Profil

1
Um welche Kamera handelt es sich? Die meisten Fuji zeigen Bilder von einer anderen Kamera mit einem kleinen Geschenksymbol. Laden Sie ein Nicht-Fuji-Bild auf die Karte herunter, um festzustellen, ob es funktioniert.
Itai

1
@mattdm Vor ungefähr 5 Jahren konnte ich computergenerierte Bilder auf eine SD-Karte injizieren und von der Kamera anzeigen lassen. Mein Trick bestand darin, 4: 2: 2-Huffman-JPEG-Grundlinienbilder zu erstellen, bei denen Breite und Höhe ein Vielfaches von 8 sind. (Vermeiden Sie progressive, 4: 4: 4- und arithmetische Codierung.) Lassen Sie mich wissen, ob dies für Sie funktioniert oder Sie es benötigen zusätzliche Information. Ich hoffe, dass daraus eine vollständige Antwort werden kann.
Nayuki

Antworten:


4

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/ umountpart 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 pmountstattdessen 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 --keepMö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 nnumerisch Aist, ein beliebiges Zeichen¹ sein und extist JPGoder davon abhängt , THMob 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_.


Ah - ja, mein erstelltes Bild hatte keine Miniaturansicht und ich habe es nicht gemäß den DCIM-Spezifikationen benannt. Ich werde beide Dinge versuchen.
Bitte lesen Sie mein Profil

Das hat funktioniert. Ich musste das Miniaturbild mit erstellen exiftran -g, da das von GIMP erstellte aus irgendeinem Grund einen Lesefehler verursacht (möglicherweise falsche Größe). Wenn Sie eine Datei ohne Miniaturansicht haben, wird auch ein Lesefehler verursacht. (Wenn die Datei gemäß der DCIM-Spezifikation benannt ist, wird sie ansonsten einfach nicht verarbeitet.)
Bitte lesen Sie mein Profil

@matt, danke für die zusätzlichen Informationen; Ich habe aktualisiert. Ich denke, Sie haben herausgefunden, warum die exiftranLeitung 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! :-)
Toby Speight

1
Eine weitere lustige Tatsache: DCIM/999_AAAA/AAAA9999.JPGWenn Sie verwenden, zeigt die Kamera einen Fehler an (ich vergesse die genaue Formulierung, aber etwas über das Erreichen einer numerischen Grenze) und reagiert auf nichts - Sie können die Karte nicht einmal formatieren.
Bitte lesen Sie mein Profil

Leider scheitert dieser Ansatz bei meinem X-T2 völlig. Nicht sicher warum.
Bitte lesen Sie mein Profil

16

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 und dem entsprechenden Hintergrund und machen Sie ein Bild davon, wenn Sie es anzeigen der Heimcomputerbildschirm. Dann ist es schon in der Kamera.


1
LOL! Sehr elegant! :-)
TFuto

1
Wenn er die Karte in die Kamera einlegen und dann ein Bild davon machen möchte, um zu zeigen, dass das Löschen der Bilder sicher ist, warum nicht einfach die Bilder zu diesem Zeitpunkt löschen, anstatt das Bild aufzunehmen? Das Fotografieren scheint kein zusätzliches Maß an Sicherheit zu bieten.
Johnny

1
Der
springende

1
WayneF und osullic Mittelwert seiner Herstellung Importskript schreiben , das „richtige“ Bild auf die Karte , wenn der Upload aller Bilder abgeschlossen ist.
Jerome Jaglale

3
Anstatt jedes Mal ein neues "Safe zum Löschen" -Bild aufzunehmen, nehmen Sie einfach ein "Safe zum Löschen" -Bild, übertragen Sie es auf den Computer / speichern Sie es auf dem Computer, und Sie haben jetzt ein Bild, das Sie am Ende auf die Kamera kopieren können des Skripts.
Florent Bayle
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.