Có cách nào để viết một hình ảnh nước ngoài của người Viking không, vì vậy một chiếc máy ảnh Fujifilm X sẽ hiển thị nó?


7

Tôi mắc chứng hoang tưởng về việc vô tình định dạng thẻ SD có chứa ảnh tôi chưa tải lên. Tôi cố gắng cẩn thận về điều đó, nhưng vì đôi khi tôi tung hứng hai hoặc ba thẻ, tôi vẫn cảm thấy lo lắng.

Tôi có một tập lệnh nhập vào hình ảnh và xác minh chuyển chính xác, nhưng tôi không có cách nào tốt để đánh dấu thẻ SD là "an toàn để xóa". Rõ ràng, có một vài điều tôi có thể làm trong thế giới thực (khóa và mở khóa thẻ, hoặc đặt nó ở một vị trí đặc biệt, v.v.), nhưng đôi khi tôi đãng trí hoặc mất tập trung và tôi thích máy tính hơn chăm sóc nó.

Tất nhiên, tôi cũng có thể định dạng thẻ như một phần của tập lệnh, nhưng ... có vẻ như điều đó thực sự chủ yếu gây ra một thảm họa có thể xảy ra, ví dụ, nếu việc xử lý lỗi của tôi có lỗi. Ngoài ra, tôi muốn đợi cho đến sau để định dạng thẻ, vì quá trình tải lên của tôi chỉ lưu cục bộ, trong khi một ngày sau đó, bản sao lưu qua đêm sẽ sao chép chúng ngoài trang web.

Một ý tưởng tôi có là viết một JPEG (hoặc hình ảnh khác) vào thẻ với nền màu xanh lá cây đẹp và dòng chữ "an toàn để định dạng!" - sau đó, khi tôi thấy điều đó với thẻ trong máy ảnh, tôi biết sẽ kích hoạt các tùy chọn định dạng trong máy ảnh.

Nhưng, tôi dường như không thể khiến máy ảnh thực sự hiển thị bất kỳ hình ảnh nào tôi tạo. Có siêu dữ liệu cụ thể, vị trí hoặc thủ thuật nào khác sẽ khiến máy ảnh nhận ra tệp này không?


2
Có gì khác biệt giữa việc tập lệnh của bạn xóa các tập tin so với việc để nó đặt một hình ảnh trên thẻ để bạn định dạng thẻ trên máy ảnh? Làm thế nào để cái sau ngăn chặn những thảm họa có thể ngăn bạn làm cái trước?
null

1
@null Với cái sau, không có hành vi tự động phá hủy vốn có. Giả sử tôi mắc lỗi khi thay đổi phần trước của tập lệnh và các tệp ngay lập tức / dev / null thay vì được lưu và tập lệnh tiếp tục chuyển sang định dạng trước khi tôi có cơ hội can thiệp. Giáo sư.
Vui lòng đọc hồ sơ của tôi

1
Tất nhiên tôi sẽ, nhưng ... theo định nghĩa, các lỗi phát sinh thường là những lỗi bạn không kiểm tra. Trong khi đó "không định dạng thẻ trừ khi thẻ có dấu 'an toàn'" có vẻ như là một thói quen khá dễ dàng để thiết lập.
Vui lòng đọc hồ sơ của tôi

1
Đó là máy ảnh nào? Hầu hết Fuji hiển thị hình ảnh được chụp từ một máy ảnh khác có biểu tượng 'quà tặng' nhỏ. Hãy thử tải xuống một hình ảnh không phải Fuji vào thẻ để xem nó có hoạt động không.
Itai

1
@mattdm Khoảng ~ 5 năm trước, tôi đã có thể đưa hình ảnh do máy tính tạo ra vào thẻ SD và làm cho máy ảnh hiển thị nó. Bí quyết của tôi là tạo ra các hình ảnh JPEG Huffman 4: 2: 2 trong đó chiều rộng và chiều cao là bội số của 8. (Tránh tiến bộ, 4: 4: 4 và mã hóa số học.) Hãy cho tôi biết nếu điều này hiệu quả với bạn hoặc bạn cần thông tin bổ sung. Tôi hy vọng điều này có thể được biến thành một câu trả lời đầy đủ.
Nayuki

Câu trả lời:


4

Có nguy cơ chỉ cần bỏ mã không liên quan, đây là chương trình Perl mà tôi đã sử dụng cho mục đích tương tự - chuyển hình ảnh sang máy in bằng đầu đọc thẻ (trước khi tôi có thể định vị máy in gần đủ để sử dụng kết nối USB của nó). Nó có một số giả định tích hợp (hệ thống tập tin thẻ có thể gắn kết với người dùng /media/card/<card-type>) nhưng bạn sẽ có thể loại bỏ mount/ umountphần nếu nó không liên quan đến bạn. (Nếu tôi đã viết lại từ đầu, có lẽ tôi sẽ sử dụng pmountthay thế.)

Ngoài ra còn có một nỗ lực để cung cấp cho các hình ảnh không phải là JPEG một tệp hình thu nhỏ phù hợp theo quy định của DCIM; Tôi có thể xác nhận rằng tính năng này hoạt động trên máy ảnh DSLR Canon của tôi, nhưng tôi không thể nhớ liệu mình đã thử nó trên máy Fuji chưa. Nếu tôi đã làm, nó sẽ là trên một F30 hoặc F60 nhỏ gọn.

FWIW, tập lệnh đọc thẻ của tôi (không hiển thị) sẽ xóa từng hình ảnh khỏi hệ thống tập tin thẻ khi nó được ghi chính xác vào thư mục lưu trữ của tôi (và được đánh dấu chỉ đọc). Tôi có một --keeptùy chọn để ghi đè lên, điều này rất hữu ích khi kiểm tra các thay đổi đối với tập lệnh. Tôi không bao giờ định dạng lại các thẻ.

Mật mã

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

Một lần nữa, tôi xin lỗi vì chiều dài. Nhưng bây giờ phải rõ ràng nơi để viết hình ảnh trong hệ thống tập tin của thẻ: đặc biệt, theo DCIM tiêu chuẩn, nó phải nằm trong DCIM/nnnAAAAA/AAAAnnnn.ext, nơi nlà số, Alà bất kỳ character¹, và extJPGhoặc THMtùy thuộc vào việc đó là đối tượng chính nó hoặc một hình thu nhỏ riêng biệt. Nếu tên không phù hợp với mẫu này, máy ảnh có thể sẽ bỏ qua nó.

Cũng lưu ý việc sử dụng exiftran -gđể thêm hình thu nhỏ EXIF ​​(có kích thước chính xác) vào hình ảnh không có. Điều đó có thể quan trọng đối với việc sử dụng của bạn, vì máy ảnh có xu hướng dựa vào hình thu nhỏ để xem trước hình ảnh. Cái được tạo bởi GIMP có thể là kích thước sai và có thể khiến máy ảnh của bạn bỏ qua hình ảnh, hiển thị một trình giữ chỗ hoặc thậm chí báo cáo lỗi đọc.


Nghĩa là, bất kỳ ký tự nào trong tập hợp khá hạn chế được DCIM cho phép : 123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_.


À - vâng, hình ảnh được tạo của tôi không có hình thu nhỏ và tôi đã không đặt tên cho nó theo thông số kỹ thuật DCIM. Tôi sẽ thử cả hai thứ.
Vui lòng đọc hồ sơ của tôi

Điều này đã làm việc. Tôi đã phải tạo hình thu nhỏ với exiftran -g, vì một số lý do, cái được tạo bởi GIMP gây ra lỗi đọc (kích thước sai, có lẽ). Có một tập tin không có hình thu nhỏ cũng gây ra lỗi đọc. (Nếu tệp được đặt tên theo thông số DCIM, nghĩa là, nếu không, nó chỉ không được xử lý.)
Vui lòng đọc Hồ sơ của tôi

@matt, cảm ơn vì thông tin thêm; Tôi đã cập nhật. Tôi nghĩ rằng bạn đã xác định lý do tại sao exiftrandòng này ở đó (Tôi cũng là một GIMPer). Thật tuyệt khi biết rằng kịch bản cũ, không còn sử dụng của tôi đáng để treo lên! :-)
Toby Speight

1
Một sự thật thú vị khác: sử dụng DCIM/999_AAAA/AAAA9999.JPGkhiến máy ảnh hiển thị lỗi (tôi quên cụm từ chính xác, nhưng có điều gì đó về việc đạt giới hạn số) và không phản hồi bất cứ điều gì - thậm chí bạn không thể định dạng thẻ.
Vui lòng đọc hồ sơ của tôi

Đáng buồn thay, cách tiếp cận này hoàn toàn thất bại với X-T2 của tôi. Không chắc chắn lý do tại sao.
Vui lòng đọc hồ sơ của tôi

16

Tôi không biết những gì được yêu cầu để nhận ra hình ảnh "nước ngoài", có thể là một cái gì đó trong Exif ... nhưng với mục tiêu của bạn, chỉ cần tạo hình ảnh với thông điệp của bạn, với nền phù hợp và chụp ảnh khi hiển thị trên màn hình máy tính gia đình. Sau đó, nó đã có trong máy ảnh.


1
CƯỜI LỚN! Rất thanh lịch! :-)
TFuto

1
Nếu anh ta định đặt thẻ vào máy ảnh và sau đó chụp ảnh để cho thấy rằng việc xóa hình ảnh là an toàn, tại sao không xóa hình ảnh tại thời điểm đó thay vì chụp ảnh? Chụp ảnh dường như không thêm bất kỳ biện pháp an toàn bổ sung nào.
Johnny

1
Toàn bộ vấn đề là kịch bản hoạt động để có thể thực hiện mà không cần suy nghĩ
Nayuki

1
WayneF và osullic có nghĩa là làm cho tập lệnh nhập của anh ta ghi hình ảnh "phù hợp" đó vào thẻ khi quá trình tải lên tất cả các hình ảnh hoàn tất.
Jerome Jaglale

3
Thay vì chụp ảnh "an toàn để xóa" mỗi lần, chỉ cần chụp một ảnh "an toàn để xóa", chuyển nó vào / lưu nó vào máy tính và bây giờ bạn có một hình ảnh mà bạn có thể sao chép vào máy ảnh ở cuối của kịch bản.
Florent Bayle
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.