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
/ umount
phầ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 pmount
thay 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 --keep
tù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 n
là số, A
là bất kỳ character¹, và ext
là JPG
hoặc THM
tù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_
.