再:Linuxの写真家のサービスのコマンドライン

最近、Linux Linuxフォトグラファーが直面するさまざまな典型的な問題の解決について著者が書いている記事「 Linuxカメラマンのサービスにおけるコマンドライン 」を公開しましたが、彼は明らかにすべてを考慮しませんでした。



最初の、またはむしろ、ゼロタスクは、画像をコピーすることです。 最適化と自動化の対象となるものはないようです:mcでF5キーを押すか、マウスでファイルをドラッグアンドドロップするか、digiKamなどのフォトマネージャーを使用できます。 可能ですが、必須ではありません。余分な動きが多すぎます。 linuxoidカメラマン(または、むしろ写真をときどき扱うlinuxoid)は、通常、メモリカードから写真を取り出し、慎重にハードドライブに置き、撮影時などに並べ替え、余分な文字が目を刺激する場合はそれらを削除するだけです。



コメントで言及された別のタスクは、写真とその署名の一括削減です。 方法の1つは、さまざまなインターフェイスを使用できるImageMagickを使用することです。コマンドラインインターフェイス(変換、変更、モンタージュプログラム)とさまざまなプログラミング言語用のAPIの両方です。 真珠の場合、 Image :: Magickモジュール。 ImageMagickを使用すると、写真を縮小して署名することができます。



このようなタスクを次のように自動化しました。





写真を転送する:

#!/usr/bin/perl -wl use strict; use File::Find; use File::Path qw(make_path); use File::Copy; use Image::ExifTool qw(:Public); # You can change these variables my $PATH_SRC = '/media/NIKON/DCIM'; # path to memory card my $PATH_DST = $ENV{'HOME'} . '/photo'; # path to destination. Don't use ~ for your homedir my $PRECISION = 2; # 0 for year .. 5 for second my $MODE = 0644; # for chmod # Don't touch the rest of file find( \&wanted, $PATH_SRC ); sub wanted { return unless /\.jpg/i; my $new_name = lc $_; $new_name =~ s/^\D+//; my $info = ImageInfo( $File::Find::name ); my @date = split /\D+/, $info->{'DateTimeOriginal'}; $#date = $PRECISION; my $new_dir = join '/', $PATH_DST, @date; make_path $new_dir unless -d $new_dir; my $new_path = "$new_dir/$new_name"; -d $new_dir and move $File::Find::name, $new_path and chmod $MODE, $new_path and print "$File::Find::name => $new_path"; } # sub wanted
      
      







削減と署名:

 #!/usr/bin/perl -w use strict; use Image::ExifTool ':Public'; use Image::Magick; use Getopt::Long; # Constants my %preferred_fonts = ( 'date' => [ qw/ DejaVuSans DejaVu-Sans Bitstream-Vera-Sans BitstreamVeraSans Verdana / ], # Normal width 'name' => [ qw/ DejaVuSansC DejaVu-Sans-Condensed Tahoma / ], # Narrow 'site' => [ qw/ DejaVuSansB BitstreamVeraSansB VerdanaB TahomaB / ], # Bold ); my $color = '#fff2'; my $gap = 10; my $name = (getpwuid $>)[6]; $name =~ s/,+$//; my $prefix = 'small.'; my $site = 'your-site.ru'; my $size = '50%'; # Override with options GetOptions( 'color:s' => \$color, 'gap:i' => \$gap, 'name:s' => \$name, 'prefix:s' => \$prefix, 'site:s' => \$site, 'size:s' => \$size, ); # Try to find suitable fonts my $image = new Image::Magick; my @available_fonts = $image->QueryFont(); my ( %seen, %fonts ); map { $seen{$_} = 1 } @available_fonts; while ( my ( $scope, $list ) = each %preferred_fonts ) { foreach ( @$list ) { $fonts{ $scope } = $_ and last if $seen{$_}; } # foreach } # while foreach my $file ( @ARGV ) { my $info = ImageInfo($file, 'CreateDate'); my $date = $$info{'CreateDate'}; my $new_file_name = $file; $new_file_name =~ s{([^/]+)$}{$prefix$1}; $date =~ s/^(\d{4}):(\d{2}):(\d{2}).*/$3.$2.$1/; my $p = new Image::Magick or next; $p->Read( $file ); $p->AutoOrient; $p->Resize( 'geometry' => $size, 'filter' => 'Lanczos', 'blur' => 0.5, ); my ( $width, $height ) = $p->Get('width', 'height'); my ( $x, $y ) = ( $width - $gap, $height - $gap ); $p->Set( 'pointsize' => 12, 'fill' => $color, ); $p->Annotate( 'font' => $fonts{'name'}, 'text' => $name, 'rotate' => -90, 'x' => $x, 'y' => $y, ); $y -= ( $p->QueryFontMetrics( 'font' => $fonts{'name'}, 'text' => $name, ) )[4] + $gap; $p->Annotate( 'font' => $fonts{'site'}, 'text' => $site, 'rotate' => -90, 'x' => $x, 'y' => $y, ); $y -= ( $p->QueryFontMetrics( 'font' => $fonts{'site'}, 'text' => $site, ) )[4] + $gap; $p->Annotate( 'font' => $fonts{'date'}, 'text' => $date, 'rotate' => -90, 'x' => $x, 'y' => $y, ); $p->Sharpen( 'radius' => 1, 'sigma' => 2, ); $p->Write($new_file_name); print "$file - $date\n"; } # foreach
      
      







既製のスクリプトとそれらのドキュメントは、github.comに投稿されています。




All Articles