雑記帳 2016年 1月第3週

2016/01/10 Sun.

#!/usr/local/bin/perl
use strict;
use utf8;
require "image_getsize.pl";
my $enc_os = 'cp932';
binmode STDOUT, ":encoding($enc_os)";
my @DIRS = (
"hogehoge"
);
foreach my $dir(@DIRS) {
    my @files = ();
    opendir(CURRENT, "$dir");
    while (defined(my $file = readdir(CURRENT))) {
        if ($file =~ /(.*)\.jpg|(.*)\.jpeg|(.*)\.bmp|(.*)\.gif|(.*)\.png|(.*)\.tif/i) {
            push(@files, "$dir/$file");
        }
    }
    foreach my $jpg(@files) {
        my @info = &image_getsize("$jpg");
        print $info[1] . " " . $info[2] . "\n";
    }
}

すんげー久しぶりにPerlを書いた。特定のディレクトリ配下の画像ファイルのイメージサイズを一括標準出力する手抜きPerlです。
そうそう、初めてPerlでUTF-8を使ったんだよね。昔はShift_JIS信者だったんだけど、今は何でもUTF-8で書いてるかも。
Image::Magickを使って、画像の縦や横の不要な部分を一括でトリミングしたいんだよね。今の俺に書けるのかな。

C:\>perl -v

This is perl, v5.8.8 built for MSWin32-x86-multi-thread
(with 25 registered patches, see perl -V for more detail)

Copyright 1987-2006, Larry Wall

Binary build 817 [257965] provided by ActiveState http://www.ActiveState.com
Built Mar 20 2006 17:54:25

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

信じられねーくらい古いPerlだな、これインストールしたのいつだっけ?全くバージョン入れ替えをやってない。
WikipediaのPerl」を見てみたら、最新版は5.22.0らしい。文法とかも全く別物になってそうだ。
Perlの傾向とか流行とか、もはやサッパリだな。もっぱらJavaばっかり。久々に真面目に覚え直してみるかな?

あれ、上のperl -vの結果、「MSWin32-x86」とか書いてある。俺のマシンはWindows 7の64bitなんですけど。
そもそも、環境に合ったPerlが入ってないな。うーん、緊急性は全く無いし、気が向いたら入れ直してみよう。

試しに入れてみた「google-code-prettify」、なかなかイイな。Webでソースを見る際に、かなり見やすくなる。
ただ、言語の判定とかどうやってるか知らんけど、たまに色付けされない時とかある。まあ、細かい話はどうでもいいか。

で、やっぱり気になったのでググってみたら、cssのclassでlang-jsみたいに指定できるんだな、知らなかった。
これ、今まで変換してきたページ全部に対して見直した方がいいのかな。量がキツそうだから、気が向いたらやろう。

2016/01/11 Mon.

指定ディレクトリ配下の画像の上下を、一定ピクセル切り落とすPerlが動いた。正しい実装かは知らない。

#!/usr/local/bin/perl
use strict;
use utf8;
use Image::Magick;
require "image_getsize.pl";
my $enc_os = 'cp932';
binmode STDOUT, ":encoding($enc_os)";
my @DIRS = (
"hogehoge"
);
# 画像の上下を指定ピクセルだけ切り落とす
my $v_cut_top = 200;
my $v_cut_bottom = 200;
foreach my $dir(@DIRS) {
    my @files = ();
    opendir(CURRENT, "$dir");
    while (defined(my $file = readdir(CURRENT))) {
        if ($file =~ /(.*)\.jpg|(.*)\.jpeg|(.*)\.bmp|(.*)\.gif|(.*)\.png|(.*)\.tif/i) {
            push(@files, "$dir/$file");
        }
    }
    foreach my $jpg(@files) {
        my @info = &image_getsize("$jpg");
        #  縦x横
        print $info[1] . "_" . $info[2] . "\n";
        my $image = Image::Magick->new;
        $image->Read($jpg);
        my $mod_height = $info[1] - ($v_cut_top + $v_cut_bottom);
        $image->Crop(width=>$info[2], height=>$mod_height, x=>0, y=>$v_cut_top);
        my @file_path = split(/\//, $jpg);
        my $length = @file_path;
        my @file_name = split(/\./, $file_path[$length - 1]);
        binmode(STDOUT);
        $image->Write("$dir/new_$file_name[0].jpg");
        undef $image;
    }
}

常識的に考えれば、上下左右の切り落としピクセル数を全部指定できるべきなんだろうけど、必要になったら書こう。
そういえば、何も考えずに拡張子だけをjpgにしてファイル出力してるんだけど、変換元はpngだったんだよね。
拡張子だけ変わってて、バイナリ的にはpngのままでした、なんてことになってないか気になったけど、問題無さそう。
バイナリエディタで変換後の中身を見て、単に先頭2バイトがFFD8だったから、jpgになってるだろう、って判断だけど。
Image::Magickが何か気を利かせてくれてるの?出力形式が未指定の場合は、ファイルの拡張子から判定する、とか。
ってか、出力形式って指定できるのかな。Image::Magick::Tilerだと、output_type=>'jpg'みたいに指定できるけど。

ググってみると、「ImageMagick Perl版を使う。(Image::Magic,s//): Xo式 実験室(labo.xo-ox.net)」というトコが出てきた。

$img->Write(ファイル名);でセーブ、拡張子で自動判断してフォーマット変更してくれる。

Image::Magickの概要的な説明の箇所によると、どうやら勝手にやってくれる模様。ありがたいモノだ。