便利なのでメールの一部を携帯に転送している。当然,サイズが大きいものは転送しないようにしている。他にもブラックリストがあって,そのリストにあるメールアドレスからのメールも転送しない。で,その携帯に転送しているメールの中に,警察の交通取り締まりをチェックするサイトからのメールがある。交通取り締まりをしてるのを見かけると,みんなで投稿する,ってやつ。ところが,そのサイトからのメールに広告がついてくる。最後についてくるのならいいのだが,最初に入っている。そのため,携帯の通知メールには広告しか入れず,肝心の情報を得るにはサーバーからメールのメインパートをダウンロードしてこないといけない。それって余計にお金がかかるってことやん。そこで,メールの先頭の広告を削ってから携帯に転送をかけようと考えた。今回はその顛末を書こう。
2010年10月26日火曜日
2010年10月23日土曜日
なんで今さらIE6やIE7に合わせたサイトを作る??
この間,とあるサイトを見た。JavaScriptを多用しているサイトなのだが,表示させると表示がずれたり,全部を表示しなかったりしてうまく見れなかった。よく使っているのが Firefox なのだが,広告をブロックするアドオンをいれてるので,そのせいかもしれない,と思ってそのサイトで広告ブロックを無効にしてみた。するとほんの少しだけ表示がましになった。しかし,まだ全然ちゃんと表示されてるというには程遠い感じだった。そこで,ブラウザをかえてみた。試したのは Opera と Safari と IE8 (Internet Explorer) 。しかし,どれも同じようにしか表示されない。なんで??Firefox だけちょっと表示がおかしいところがあるが,他のも基本的に同じように表示が崩れている。どうも JavaScript の部分でおかしなことが起こっているみたいだった。個人的には,JavaScript を使ってサイトを作る時には,まず Firefox で動作を確認している。それはいろいろツールがあるからなのだが,それでちゃんと表示されない,ってどういうこと?というのが最初の印象だった。そこで,サイトの管理者にメールをしてみた。メールは別の理由でしたのだが,ついでにそのメールにサイトの動作について書いた,ってのが正しいのだが…。するとサイト管理者がサイトの動作についてなんと言ってきたか?
なんと
なんと
ブラウザによって当HPの振る舞いが変わる件につきましては、今後も対応する予定はありません。 IE6.0以上にて最適化してありますので、IEで閲覧して頂きたく思います。 よろしくお願いします。と言ってきた。ちなみにそのサイトが最初に作られたのは2009年頃だったと思うし,現在のバージョンは2010年の初夏に新しくした,と書いてあった。ということはつい最近じゃないか??ところが,IE6以上に最適化した,と堂々と書いている。おかしくないか???IE6やIE7はJavaScriptの標準化が全然できてなくて,web site 製作者にとっては手間がかかる最悪のブラウザやのに…。おまけに管理者はどうやらIT技術者らしい。プロがそんなんでいいのか?いや,逆に田舎でwebを頼むような人間はまだ古いブラウザを使っていて,自分たちが時代遅れなのを棚にあげて自分がちゃんと見れないから,って文句を言うのか?そもそも古いブラウザはセキュリティホールだらけやからやめるべきやのに…。だいたい IE も IE9 からは標準化に従うとネットのニュースに出てたじゃないか!!(この記事は2010/10/23に書いてる)世の中標準化に向かってるのに,未だにIE6やIE7のユーザーに媚びてどないすんねん!!どうして世の中こうもアホが多いのかなぁ??ちゃんとしたものが作れないなら JavaScript を使う資格なんてないよなぁ。皆さんはどう思いますか?
2010年10月16日土曜日
GPS付きのデジカメを買って緯度経度情報から住所をゲットしてみた
以前からバイクでツーリングに行く時にPanasonicのLUMIXシリーズのTZ7 (DMC-TZ7)というデジカメを使っていた。それまでNikonの古いやつを使ったいたのだが,ディスプレイが小さいためとても使いにくかったので,そろそろ機も熟したと思って買ったのがTZ7だった。ポイントはなんといっても12倍の光学ズーム。かなり遠くまで撮れるのでかなり重宝している。実際には,写真の解像度を下げているため,実質の倍率は光学20倍程度になっているらしい。以前の光学3倍と比べると写真のバリエーションが増えて楽しい。光学ズームの倍率が高い分デジカメ自体のサイズは大きいが,軽くて小さなやつはきゃしゃですぐ壊れたりするので,ツーリングの時に持って行くには多少大きくても丈夫な方がいい。なので大きさは全然気にならなかった。色は赤が良かったが,店に残っていたのが茶色だけだったので茶色だった。慣れるとそれなりにいい感じの色と思えてきた。TZ7に欠点がないかといえば,ないことはない。一番はバッテリーのもち。結構大きいバッテリ-だが,意外と早くなくなってしまう。なので予備のバッテリーは必需品らしい。
そのTZ7をちょっと他の人に貸したらシャッター部分が壊れてしまった。壊した(壊れた時に持っていただけ?)本人は何もしてない,と主張していたが,なんでそれで壊れるんやぁ!!!とりあえず壊れたデジカメは電気屋に持って行って直してもらっている。で,問題は私のカメラ。バイクに乗りたいのにデジカメがない…困った。そこでいろいろな交渉の結果,新しいデジカメを買うことにした。できればすぐに手に入るのがいいと思っていたところ,ネットでTZ7の後継のTZ10 (DMC-TZ10)が2万円ほどで買える,というのを見つけてしまった。幾つかの販売サイトがあったが,以前他のものを購入した実績のあるサイトから購入することにした。そこなら夕方6時までに購入手続きをしたら当日発送ということだったし,色もそのサイトなら黒,銀,金,赤の中から選べたしね。色は今回は念願の赤色にしてみた。支払いは手数料かかるけど代引きにした。振込だと振込の確認に時間がかかったりするので時間がもったいないと思ったから。TZ10とTZ7の違いはあまりないのだが,一点だけ大きく違うのが,TZ10にはGPSがついている。GPSはバイクのツーリングの記録をする時には便利そう。さてどの程度使えるものやら…
そのTZ7をちょっと他の人に貸したらシャッター部分が壊れてしまった。壊した(壊れた時に持っていただけ?)本人は何もしてない,と主張していたが,なんでそれで壊れるんやぁ!!!とりあえず壊れたデジカメは電気屋に持って行って直してもらっている。で,問題は私のカメラ。バイクに乗りたいのにデジカメがない…困った。そこでいろいろな交渉の結果,新しいデジカメを買うことにした。できればすぐに手に入るのがいいと思っていたところ,ネットでTZ7の後継のTZ10 (DMC-TZ10)が2万円ほどで買える,というのを見つけてしまった。幾つかの販売サイトがあったが,以前他のものを購入した実績のあるサイトから購入することにした。そこなら夕方6時までに購入手続きをしたら当日発送ということだったし,色もそのサイトなら黒,銀,金,赤の中から選べたしね。色は今回は念願の赤色にしてみた。支払いは手数料かかるけど代引きにした。振込だと振込の確認に時間がかかったりするので時間がもったいないと思ったから。TZ10とTZ7の違いはあまりないのだが,一点だけ大きく違うのが,TZ10にはGPSがついている。GPSはバイクのツーリングの記録をする時には便利そう。さてどの程度使えるものやら…
ラベル:
GPS・GNSS,
highlight.js,
pre,
コンピュータ,
バイク
2010年9月8日水曜日
「PHP 5.3.x で推奨されない機能」にひっかかって Uber_Uploader が動かなくなった
(追記)2017/6に,FreeBSD で fine-uploader を使ってみた(その1)というのを書いた。
そこでは fine-uploader という JavaScript のライブラリを使ったファイルのアップローダーについて書いている。
Uber Uploader はすでに古く更新されていないので,fine-uploader など新しいアップロードライブラリを使うことをお薦めする。
(追記)2011/8時点での Uber-Uploader の最新版についてはUber-Uploader 6.8.2 の使い方(その1)で述べているので,参考にしてみて欲しい。
個人で細々と web site を運用している。そこで結構重宝してるのが,Uber_Uploader というソフト。以前,web へのファイルのアップロードの進捗状況がわかるようなアップローダーが欲しくていろいろ調べて,uber_uploaderを使った,という感じのことをこのブログに書いた(cgiとutf8とphpとjs)。その時は,Uber Uploaderのバージョン 6.5 を使っていた。その後バージョンアップがなされ,今はバージョン 6.8.2 になっている。バージョン 6.5 から 6.8.2 になるまでに,途中で結構大きな構造の変更がなされ,見た感じはちょっと違ったものになっている。どちらも使えるようになっているが,今日の話題はバージョンの違いではなくて,uber_uploader がうまく働かなくなってしまった話題(以下の現象はバージョンが 6.5 か 6.8.2 かに関係なく発生した)
web site は,古いノートマシンを使って運用している。われながらかなり危険なことをしてるなぁ,と思っているが,なにせ先立つモノがないと…。OSはFreeBSDを使っている。サーバーに入れてるバージョンは FreeBSD 8.0 にしている。FreeBSD の場合,いろいろなアプリケーションソフトは ports というシステムで管理されている。アプリケーションのアップデートをする場合は portupgrade というアプリケーションを使ってやると,勝手にアップデートしてくれる。めんどくさいので,よく portupgrade -a (全てアップデート対象ならアップデートするという設定)を実行している。多くの場合は特に問題はないのだが,これをやると時々サーバーの動作がおかしくなる時がある。
この間も portupgrade -a をすると,emacs を使った時の感触が違っていた。どうもカーソルの動きがおかしい。どうやら,emacs のバージョンが22から23に上がり,内部の文字コードが utf8 になったために起こる現象みたいだった。これは,PuTTY の設定で UTF-8 を使う,とするとなんとかそれっぽく動くようになった。
他にも apache や perl がバージョンアップするといろいろとトラブルに見舞われたりする。Perl の場合は影響が大きく,いろいろなものが動かなくなってしまったりする。それなら portupgrade -a を使わずに一個一個 upgrade すればよさそうなものだが,これが結構数が多くて,めんどくさいからついつい portupgrade -a をしてしまう…
で,やっと今回の本題に入ろう。今回は portupgrade -a をしたら,急に uber_uploader が働かなくなってしまった。どうなったかというと,
(1) サイトの上の方に「 date 関数は危険だから気をつけろ」みたいなメッセージがいっぱい出てきた。
(2) (1) のメッセージを無視すると,アップロードできそうになるのだが,アップロードボタンを押しても,うんともすんとも言わず,ブラウザのステータス欄に「完了」と出て終わる。かと言って,ファイルはアップロードされていない。普通なら,アップロードボタンを押すと,ファイルをアップロードする様子(進捗状況)が棒グラフで出るはずなのに,何も出ず,ただただ止まってしまう。
と,こんな感じになってしまった。エラー表示が出ても,ファイルがアップロードさえできればいいのだが,ファイルがアップロードされない,というので困ってしまった。この二つを解決するのに数日かかってしまった。その顛末を書こう。
(追記)2011/8時点での Uber-Uploader の最新版についてはUber-Uploader 6.8.2 の使い方(その1)で述べているので,参考にしてみて欲しい。
個人で細々と web site を運用している。そこで結構重宝してるのが,Uber_Uploader というソフト。以前,web へのファイルのアップロードの進捗状況がわかるようなアップローダーが欲しくていろいろ調べて,uber_uploaderを使った,という感じのことをこのブログに書いた(cgiとutf8とphpとjs)。その時は,Uber Uploaderのバージョン 6.5 を使っていた。その後バージョンアップがなされ,今はバージョン 6.8.2 になっている。バージョン 6.5 から 6.8.2 になるまでに,途中で結構大きな構造の変更がなされ,見た感じはちょっと違ったものになっている。どちらも使えるようになっているが,今日の話題はバージョンの違いではなくて,uber_uploader がうまく働かなくなってしまった話題(以下の現象はバージョンが 6.5 か 6.8.2 かに関係なく発生した)
web site は,古いノートマシンを使って運用している。われながらかなり危険なことをしてるなぁ,と思っているが,なにせ先立つモノがないと…。OSはFreeBSDを使っている。サーバーに入れてるバージョンは FreeBSD 8.0 にしている。FreeBSD の場合,いろいろなアプリケーションソフトは ports というシステムで管理されている。アプリケーションのアップデートをする場合は portupgrade というアプリケーションを使ってやると,勝手にアップデートしてくれる。めんどくさいので,よく portupgrade -a (全てアップデート対象ならアップデートするという設定)を実行している。多くの場合は特に問題はないのだが,これをやると時々サーバーの動作がおかしくなる時がある。
この間も portupgrade -a をすると,emacs を使った時の感触が違っていた。どうもカーソルの動きがおかしい。どうやら,emacs のバージョンが22から23に上がり,内部の文字コードが utf8 になったために起こる現象みたいだった。これは,PuTTY の設定で UTF-8 を使う,とするとなんとかそれっぽく動くようになった。
他にも apache や perl がバージョンアップするといろいろとトラブルに見舞われたりする。Perl の場合は影響が大きく,いろいろなものが動かなくなってしまったりする。それなら portupgrade -a を使わずに一個一個 upgrade すればよさそうなものだが,これが結構数が多くて,めんどくさいからついつい portupgrade -a をしてしまう…
で,やっと今回の本題に入ろう。今回は portupgrade -a をしたら,急に uber_uploader が働かなくなってしまった。どうなったかというと,
(1) サイトの上の方に「 date 関数は危険だから気をつけろ」みたいなメッセージがいっぱい出てきた。
(2) (1) のメッセージを無視すると,アップロードできそうになるのだが,アップロードボタンを押しても,うんともすんとも言わず,ブラウザのステータス欄に「完了」と出て終わる。かと言って,ファイルはアップロードされていない。普通なら,アップロードボタンを押すと,ファイルをアップロードする様子(進捗状況)が棒グラフで出るはずなのに,何も出ず,ただただ止まってしまう。
と,こんな感じになってしまった。エラー表示が出ても,ファイルがアップロードさえできればいいのだが,ファイルがアップロードされない,というので困ってしまった。この二つを解決するのに数日かかってしまった。その顛末を書こう。
2010年7月23日金曜日
Perl+ExifTool で写真の日付をいじる
この間,多数の写真をもらったのだが,困ったことに写真の日付がかなり実際からずれていた。1枚や2枚ならいいのだが,100枚程度あり,どうしたものかと困っていた。そこで,PerlのExifToolを使って写真の日付を一括して変更するルーチンを書いてみた。と言っても,インターネットで検索して,他の方のルーチンをコピーした,というのが正しいが…
ExifToolについては,ExifTool by Phil Harveyに英語の文章があり,Perl用のモジュールについてはThe Image::ExifTool Perl Library Moduleに英語の説明がある。また,ExifToolの処理で使われる「Shift」についてはImage::ExifTool::Shift.pl に英語の説明があるので,見てみて欲しい。
また,以前このblogでthumbnailを作るというのを書いたが,そこでもExifToolについて少し書いている。こちらも見て欲しい。
やり方としては,(1) 処理するファイルのマスク(*.JPGなど)を引数とする,(2) 日付はShiftを用いてずらす。ずらす量は,2つの日付・時刻を引数として入力させて,その差を取る,(3) バックアップファイルを残す,残さない,を引数で指定する,(4) ファイルの日付を写真のCreateDate タグと一致させるかどうかも引数で指定する,としてみた。
ExifToolについては,ExifTool by Phil Harveyに英語の文章があり,Perl用のモジュールについてはThe Image::ExifTool Perl Library Moduleに英語の説明がある。また,ExifToolの処理で使われる「Shift」についてはImage::ExifTool::Shift.pl に英語の説明があるので,見てみて欲しい。
また,以前このblogでthumbnailを作るというのを書いたが,そこでもExifToolについて少し書いている。こちらも見て欲しい。
やり方としては,(1) 処理するファイルのマスク(*.JPGなど)を引数とする,(2) 日付はShiftを用いてずらす。ずらす量は,2つの日付・時刻を引数として入力させて,その差を取る,(3) バックアップファイルを残す,残さない,を引数で指定する,(4) ファイルの日付を写真のCreateDate タグと一致させるかどうかも引数で指定する,としてみた。
2010年7月1日木曜日
FreeBSD,Perl スクリプトで,GmailのSMTPからメールを送る
Net::SMTP::TLS は2006年1月以来更新が止まっていて,2016年時点ではすでに非推奨になっている。
そこで,2016年11月に FreeBSD で,Perl で gmail からメールを送る:Net::SMTP::TLS をやめて,Net::SMTP,IO::Socket::SSL,Authen::SASL を使うことにした というのを書いたので,そちらも参照してみて欲しい。
後日 FreeBSD, Perl の Net::SMTP::TLS ではまるというのを書いた。 そちらも参考にしてみて欲しい。
2009年3月に FreeBSD上でPerlのスクリプトを使ってプロバイダの認証あり587番ポートからメールを送信する,という話を書いた。
今回,似たようなことをしたので,それを記録に残しておこうと思う。やった作戦は何かというと,Gmail(Googleのmail)のSMTPとPerlのスクリプトを組み合わせて,googleのアカウントからメールを送る,という作戦。なんでこんな作戦をしたくなったかというと,同窓会関係のメールの一斉送信のため。個人的に高校の同期の同窓会のサイトを作っているのだが,そのメンバーに一斉にメールをしたいことがあるのだが,メールする先はPCだったり携帯だったりする。それまでは,GmailでBcc: フィールドにアドレスを100以上並べて送信したのだが,この間その方法で送信すると,携帯で受け取った人から「文字化けで全然あかん」というお叱りを多数受け取った。そのうちPCで受け取った友人からも文字化けを指摘された。いろいろ見てみると,携帯によってはBcc:フィールドを他の目的で使うことがあるみたい。また,Bcc:フィールドを長くするとトラブルを生じるみたい。また,文字コードをデフォルトに設定していると,変な文字があるといつものISO-2022-JPではない文字コードにされてしまうみたい。そのため,ひどい文字化けが起こったようである。
後日 FreeBSD, Perl の Net::SMTP::TLS ではまるというのを書いた。 そちらも参考にしてみて欲しい。
2009年3月に FreeBSD上でPerlのスクリプトを使ってプロバイダの認証あり587番ポートからメールを送信する,という話を書いた。
今回,似たようなことをしたので,それを記録に残しておこうと思う。やった作戦は何かというと,Gmail(Googleのmail)のSMTPとPerlのスクリプトを組み合わせて,googleのアカウントからメールを送る,という作戦。なんでこんな作戦をしたくなったかというと,同窓会関係のメールの一斉送信のため。個人的に高校の同期の同窓会のサイトを作っているのだが,そのメンバーに一斉にメールをしたいことがあるのだが,メールする先はPCだったり携帯だったりする。それまでは,GmailでBcc: フィールドにアドレスを100以上並べて送信したのだが,この間その方法で送信すると,携帯で受け取った人から「文字化けで全然あかん」というお叱りを多数受け取った。そのうちPCで受け取った友人からも文字化けを指摘された。いろいろ見てみると,携帯によってはBcc:フィールドを他の目的で使うことがあるみたい。また,Bcc:フィールドを長くするとトラブルを生じるみたい。また,文字コードをデフォルトに設定していると,変な文字があるといつものISO-2022-JPではない文字コードにされてしまうみたい。そのため,ひどい文字化けが起こったようである。
ラベル:
FreeBSD,
highlight.js,
Mail,
pre,
コンピュータ
2010年6月16日水曜日
見にくい背景は嫌い
よく個人で作っておられる道やバイクのサイトにお邪魔することがあるが,多くのサイトで見ていて気になる事がある。それはサイトの背景。個人的にはサイトの背景は白であるべき,だと思っている。理由は,見やすいから,である。例えば,大手新聞社のサイトを見てもらうとわかるように,基本的に背景は白である。他の薄い色や白っぽい壁紙のようなものでも悪くはないが,濃い色やいろんな画像が背景にあると,書いてある文字が読めなかったりする。写真が載せてあっても背景で目がチラチラして困ってしまう。なので,背景は白い方がいい,と思っている。
もう一点気になるのが,サイト内のリンクがわかりにくい,あるいは,サイトの構造がわかりにくい,もの。この点は自分のサイトでもいいかどうか不安なので,あまり偉そうなことは言えないが,どこにリンク用のボタンがあるのかわかりにくいサイトが多い気がする。これは素人には難しい点かもしれないが,サイトとしてはとても重要な点だと思う。わかりやすい良いサイトにするには,自分のサイトを客観的に見直す能力が必要だろう。そう思って自分で作っているサイトを見ると,やっぱりわかりにくいかも…。これだけは人の振り見て我が振り直せ,ってことか?この点は,素人だけじゃなくて,大手新聞社のサイトや行政機関のサイトでもよく見受けられる。例えば,やたらめったらバナーが貼ってあって,私が見たい項目がどこにあるかがとてもわかりにくいことが多い。バナーに関連するイラストがあるとわかりやすいと思うのかもしれないが,幾つもある項目の中からこれぞ,と思うのを探そうと思っても,項目ごとにイラストの雰囲気が違うと,目がチラチラしてどこに何があるのかがわかりにくい。それなら,階層化した単純なリストの方がよっぽどいい,と思う。わかりにくい場合の対策として,サイトマップを用意するのがよい,となっているが,最初からわかりやすいサイトにするのがまず大事ではないだろうか?まぁ,あまり偉そうなことを言っても,自分であまりちゃんとできてないと思うから,これ以上はやめておこう。
さらにもう一点気になるのが,更新がされてない放置サイトやページが消えてしまったサイトが多い点。これは道関係のサイトの話だが,とあるサイトのリンクのページで他の人のサイトに行こうと思ったのだが,1/3以上,下手すると半分ぐらいがリンク切れを起こしてしまっていることがある。リンク切れに関しては,リンクのページを作っている管理人がリンクのページをちゃんと管理していないのが問題なのだが,そもそも個人のサイトで最近更新がされてない,あるいは無くなってしまったサイトが多いように思う。この理由は,いくつかあると思うが,一つにはサイトで扱っている情報にサイト作成者が興味を失った場合があるだろう。他には,世の中のはやりで個人のサイトを作ってみたが,更新する時間がない,あるいは,更新するのがめんどくさくなってしまった,というのもあるかもしれない。はたまた,契約していたプロバイダと違うプロバイダに移ったので,もとのサイトが消えた,などもあろうかと思う。人によっては興味がなくなったから,このサイトは閉じます,と書いている人もいれば,何年も何もされずに放置されているものもある。webサイトは,見やすいデザイン,興味ある内容,などは当然重要だが,それ以上に,更新され続ける,というのが一番大事なので,その点を考慮してサイトを作らないといけない,と思う。ブログサイトも一時すごくたくさんブログサイトができたが,更新されなくなったブログほど寂しいものはない,と思っている。私のサイトはどうかって?何も書くことがない時には,書くことがないなぁ,と書くことにしている。でも数カ月放置は当り前だったりする…。ここは技術的なことを書く所と思っているので,ネタが無い期間が長いのよねぇ(言い訳〜〜)
もう一点気になるのが,サイト内のリンクがわかりにくい,あるいは,サイトの構造がわかりにくい,もの。この点は自分のサイトでもいいかどうか不安なので,あまり偉そうなことは言えないが,どこにリンク用のボタンがあるのかわかりにくいサイトが多い気がする。これは素人には難しい点かもしれないが,サイトとしてはとても重要な点だと思う。わかりやすい良いサイトにするには,自分のサイトを客観的に見直す能力が必要だろう。そう思って自分で作っているサイトを見ると,やっぱりわかりにくいかも…。これだけは人の振り見て我が振り直せ,ってことか?この点は,素人だけじゃなくて,大手新聞社のサイトや行政機関のサイトでもよく見受けられる。例えば,やたらめったらバナーが貼ってあって,私が見たい項目がどこにあるかがとてもわかりにくいことが多い。バナーに関連するイラストがあるとわかりやすいと思うのかもしれないが,幾つもある項目の中からこれぞ,と思うのを探そうと思っても,項目ごとにイラストの雰囲気が違うと,目がチラチラしてどこに何があるのかがわかりにくい。それなら,階層化した単純なリストの方がよっぽどいい,と思う。わかりにくい場合の対策として,サイトマップを用意するのがよい,となっているが,最初からわかりやすいサイトにするのがまず大事ではないだろうか?まぁ,あまり偉そうなことを言っても,自分であまりちゃんとできてないと思うから,これ以上はやめておこう。
さらにもう一点気になるのが,更新がされてない放置サイトやページが消えてしまったサイトが多い点。これは道関係のサイトの話だが,とあるサイトのリンクのページで他の人のサイトに行こうと思ったのだが,1/3以上,下手すると半分ぐらいがリンク切れを起こしてしまっていることがある。リンク切れに関しては,リンクのページを作っている管理人がリンクのページをちゃんと管理していないのが問題なのだが,そもそも個人のサイトで最近更新がされてない,あるいは無くなってしまったサイトが多いように思う。この理由は,いくつかあると思うが,一つにはサイトで扱っている情報にサイト作成者が興味を失った場合があるだろう。他には,世の中のはやりで個人のサイトを作ってみたが,更新する時間がない,あるいは,更新するのがめんどくさくなってしまった,というのもあるかもしれない。はたまた,契約していたプロバイダと違うプロバイダに移ったので,もとのサイトが消えた,などもあろうかと思う。人によっては興味がなくなったから,このサイトは閉じます,と書いている人もいれば,何年も何もされずに放置されているものもある。webサイトは,見やすいデザイン,興味ある内容,などは当然重要だが,それ以上に,更新され続ける,というのが一番大事なので,その点を考慮してサイトを作らないといけない,と思う。ブログサイトも一時すごくたくさんブログサイトができたが,更新されなくなったブログほど寂しいものはない,と思っている。私のサイトはどうかって?何も書くことがない時には,書くことがないなぁ,と書くことにしている。でも数カ月放置は当り前だったりする…。ここは技術的なことを書く所と思っているので,ネタが無い期間が長いのよねぇ(言い訳〜〜)
2010年3月15日月曜日
Optimate 4 を使ってみた
ZZ-R1400のバッテリーが調子悪かったので,Optimate 4という充電器を買ってみた。で,さっそくZZ-R1400のバッテリーを充電してみた。バッテリーはある程度へたっていたので,念のためにバイクからおろして充電した。ZZ-R1400のバッテリーは,FTZ14-BS。容量が大きすぎて,Yuasaでは設定がなく,かなり高価らしい。換えようと思うとバッテリーのみで3万円程度かかるらしい。そこで,今回は Optimate 4 の登場となった。Optimate 4 はベルギー産のバッテリーチャージャー。今回は,10:45 に充電開始した(0.8 Aで通常充電開始)そして,13:45 に充電ほぼ完了(0.2 Aで確認をし始めた)しかしそこから満充電まで結構時間がかかって,やっと 16:05 に充電完了した(チェックモードに入った)充電の結果,11.3V → 12.3V になった。問題は一週間ほどしてどの程度の電圧になっているかなので,最終的な結果はまだ出ていない。
Optimate 4 には,バッテリーをバイクから下ろさずに充電できるコネクター付きケーブルが付属している。 ZZ-R1400 のバッテリーは外しにくいので,念のためにこのケーブルを付けておくことにした。そのケーブルには+側にヒューズが入っている。今回は使わなかったが,これもテストしてみないといけない。場合によっては,バイクに積んである回路のためにうまく充電できない時もあるとかないとか。ま,普段はバイクを走らせながら充電できてるはずなので,通常充電ならいけるでしょう。
今回の作業の写真をhttp://picasaweb.google.co.jp/matsup/ZZR1400#に置いておいたので,参考にしてもらえればうれしいですねぇ。
(追記) よく考えてみたら,Optimate 4 用のケーブルを中の方に入れておいたら,バッテリーを下ろさずに作業するというメリットがないやん!! 至急改善しなければ…
Optimate 4 には,バッテリーをバイクから下ろさずに充電できるコネクター付きケーブルが付属している。 ZZ-R1400 のバッテリーは外しにくいので,念のためにこのケーブルを付けておくことにした。そのケーブルには+側にヒューズが入っている。今回は使わなかったが,これもテストしてみないといけない。場合によっては,バイクに積んである回路のためにうまく充電できない時もあるとかないとか。ま,普段はバイクを走らせながら充電できてるはずなので,通常充電ならいけるでしょう。
今回の作業の写真をhttp://picasaweb.google.co.jp/matsup/ZZR1400#に置いておいたので,参考にしてもらえればうれしいですねぇ。
(追記) よく考えてみたら,Optimate 4 用のケーブルを中の方に入れておいたら,バッテリーを下ろさずに作業するというメリットがないやん!! 至急改善しなければ…
2009年12月16日水曜日
FreeBSDでPerlMagick(その5)さらに進んだコマンド
この投稿はFreeBSDでPerlMagick(その4)図形の描画と画像の加工からの続きです。
また,FreeBSDでPerlMagick(その1)はじめにに目次があります。
Fx はRGB の三原色を表すr,g,b の3つのチャネルと,透明度を制御するalpha チャネルの4つのチャネルの強度を別々に演算することができるもので,Image Magick の中でも特別なコマンドとなっている。そのため,Image Magick サイトのThe Fx Special Effects Image Operatorに専用のページがある。
このブログではFx の使い方として,すでに前回の記事で
[a] 白黒画像への変換((23) Fx:三原色の色チャネルの演算)
[b] 画像の半透明化((20) 図の一部を透明にする:TransparentとFx)
の二つの使い方を紹介した。ここではさらに進んだ使い方について書こう。
● ビットごとの演算(いずれも白いキャンバスを用意してから演算した。キャンバスの種類にはよらないはずだが)
・ 例1は横方向へのグラデーション画像である。ここでw はピクセル単位の画像の横幅であり,i はcolumn offsetと呼ばれているが,図の中の各点を表すピクセル単位の横座標である。例1では,点i にi/w という値を入れろ,と書いてある。対象となるチャネルはRGB の全てのチャネルである。つまり,左端の点(i=0 ) にはゼロを,右端の点(i=w) には1を入れる。その間は点の座標に比例した値を入れる。すると結果として,左側が黒,右端が白となるグラデーション模様になる。ここでは強度は0~1で表される。
・ 例2ではi/w の代わりに(w-i)/w を入れている。そのため右端が黒,左端が白のグラデーションになっている。
・ 例3では縦方向のグラデーションを描いている。h がピクセル単位で表した画像の縦幅であり,j が縦軸の座標を表している。
j の原点は上端なので,グラデーションは上端が黒,下端が白となっている。
・ 例4は例1と同じように横方向のグラデーションなのだが,red チャネルに対してのみ演算を行っている。
そのため赤の補色である水色が白に変わるグラデーションとなっている。
さらに以下のようなことも可能となる。
以下の例では2次元の処理を行っている。
● 複数の画像を読込んでビットごとの演算Image Magick ではひとつの変数に複数枚の画像を読み込むことができる。それをFx で扱うこと考えよう。ひとつの変数に複数枚を読み込むには単に同じ変数に複数回画像を読み込めばいいみたい。注意点は,最初の読込みは参照する際に0番となる点。
(追記)gamma 値の補正についての補足。上記のAutoGamma(gamma 値の自動補正)を行うとどうも赤っぽい感じ見えてしまう。オリジナルと比べるとその違いは顕著である。そこで,gamma 値の補正に挑戦してみた。
また,FreeBSDでPerlMagick(その1)はじめにに目次があります。
(21) Fx (その2)
Fx について少し前の項目で書いたが,もう少し書いておこう。Fx はRGB の三原色を表すr,g,b の3つのチャネルと,透明度を制御するalpha チャネルの4つのチャネルの強度を別々に演算することができるもので,Image Magick の中でも特別なコマンドとなっている。そのため,Image Magick サイトのThe Fx Special Effects Image Operatorに専用のページがある。
このブログではFx の使い方として,すでに前回の記事で
[a] 白黒画像への変換((23) Fx:三原色の色チャネルの演算)
[b] 画像の半透明化((20) 図の一部を透明にする:TransparentとFx)
の二つの使い方を紹介した。ここではさらに進んだ使い方について書こう。
● ビットごとの演算(いずれも白いキャンバスを用意してから演算した。キャンバスの種類にはよらないはずだが)
例1:$img = $img->Fx(expression=>'i/w'); 例2:$img = $img->Fx(expression=>'(w-i)/w'); 例3:$img = $img->Fx(expression=>'j/h'); 例4:$img = $img->Fx(expression=>'i/w',channel=>'red');これらの例はビットごとの演算の一つである。下記に上記のコマンドの結果を示す。
・ 例1は横方向へのグラデーション画像である。ここでw はピクセル単位の画像の横幅であり,i はcolumn offsetと呼ばれているが,図の中の各点を表すピクセル単位の横座標である。例1では,点i にi/w という値を入れろ,と書いてある。対象となるチャネルはRGB の全てのチャネルである。つまり,左端の点(i=0 ) にはゼロを,右端の点(i=w) には1を入れる。その間は点の座標に比例した値を入れる。すると結果として,左側が黒,右端が白となるグラデーション模様になる。ここでは強度は0~1で表される。
・ 例2ではi/w の代わりに(w-i)/w を入れている。そのため右端が黒,左端が白のグラデーションになっている。
・ 例3では縦方向のグラデーションを描いている。h がピクセル単位で表した画像の縦幅であり,j が縦軸の座標を表している。
j の原点は上端なので,グラデーションは上端が黒,下端が白となっている。
・ 例4は例1と同じように横方向のグラデーションなのだが,red チャネルに対してのみ演算を行っている。
そのため赤の補色である水色が白に変わるグラデーションとなっている。
![]() | ![]() | ![]() | ![]() |
| 例1:点 i に i/w を代入 | 例2:(w-i)/w を代入 | 例3:縦グラデーション | 例4:赤チャネルへの グラデーション処理 |
例1:$img = $img->Fx(expression=>'(i/w)^4'); 例2:$img = $img->Fx(expression=>'sin(pi/2*i/w)'); 例3:$img = $img->Fx(expression=>'(exp(i/w)-1)/(e-1)'); 例4:$img = $img->Fx(expression=>'abs(cos(2*pi*i/w))');ここではべき乗やsin,exp などの関数を用いている。どんな関数が使えるかはThe Fx Special Effects Image Operatorを見て欲しい。
![]() | ![]() | ![]() | ![]() |
| 例1:(i/w)の4乗 | 例2:sinを用いた | 例3:expを用いた | 例4:absとcos |
以下の例では2次元の処理を行っている。
例1:$img = $img->Fx(expression=>'xx=i/w-.5; yy=j/h-.5; rr=xx*xx+yy*yy; 1-rr*4'); 例2:$img = $img->Fx(expression=>'rr=hypot(i/w-.5, j/h-.5); 1-rr*1.42'); 例3:$img = $img->Fx(expression=>'(1-(2*i/w-1)^4)*(1-(2*j/h-1)^4)'); 例4:$img = $img->Fx(expression=>'.5 - atan2(j-h/2,w/2-i)/pi/2');ここでrr は中心からの距離である。hypot 関数は2乗の和の平均を取る関数らしい。例3では四角っぽいグラデーションが作れる。
![]() | ![]() | ![]() | ![]() |
| 例1 | 例2 | 例3 | 例4 |
● 複数の画像を読込んでビットごとの演算Image Magick ではひとつの変数に複数枚の画像を読み込むことができる。それをFx で扱うこと考えよう。ひとつの変数に複数枚を読み込むには単に同じ変数に複数回画像を読み込めばいいみたい。注意点は,最初の読込みは参照する際に0番となる点。
$img->Set(size=>'160x120');
$img->ReadImage('xc:none'); # Fxでは,u[0] と参照される
$img->ReadImage('xc:red'); # Fxでは,u[1] と参照される
$img->ReadImage('xc:yellow'); # Fxでは,u[2] と参照される
$img->ReadImage('xc:lime'); # Fxでは,u[3] と参照される
$img->ReadImage('xc:blue'); # Fxでは,u[4] と参照される
これらを使って以下のような演算をさせると,いろんな色を含んだ画像ができる(全部Image Magick のUsage のページに書いてあるんだけどね)例1:$img = $img->Fx(expression=>'ar=hypot( i/w-.8, j/h-.3 )*4; br=hypot( i/w-.3, j/h-.7 )*4; u[1]*br/(ar+br) + u[2]*ar/(ar+br)'); 例2:$img = $img->Fx(expression=>'ar=1/max(1, (i-50)*(i-50)+(j-10)*(j-10) ); br=1/max(1, (i-10)*(i-10)+(j-70)*(j-70) ); cr=1/max(1, (i-90)*(i-90)+(j-90)*(j-90) ); ( u[1]*ar + u[2]*br + u[3]*cr )/( ar+br+cr )'); 例3:$img = $img->Fx(expression=>'ar=1/max(1, (i-50)*(i-50)+(j-10)*(j-10) ); br=1/max(1, (i-10)*(i-10)+(j-70)*(j-70) ); cr=1/max(1, (i-90)*(i-90)+(j-90)*(j-90) ); dr=1/max(1, (i-90)*(i-90)+(j-10)*(j-10) ); ( u[1]*ar + u[2]*br + u[3]*cr + u[4]*dr)/( ar+br+cr+dr )');ここでu[1] が1枚目の画像の要素,u[2] が2枚目の画像の要素,…,を表している。例ではわかりやすいように(ほんとに?)u[0] を使っていない。そのため0番として透明な画像を読み込ませている。5枚読み込んだ時に,u[5] とすると最初に戻りu[0] が参照されるらしい。u[-1] は最後の読込みを表すらしい。つまり引数は循環して適用されるってことやね。他にu[t] とするとcurrentイメージを参照するらしい。currentイメージってどうやって指定するんやろ?
![]() | ![]() | ![]() |
| 例1: | 例2: | 例3: |
(22) LevelやGamma値の調整
ここでは画像の強度LevelやGamma値の補正について書く。と言っても,そんなに理解できてないので,自動調整と,Threshold を使ったものだけを書こう。例1:$img->AutoLevel(channel=>'All'); 例2:$img->AutoGamma(channel=>'All'); 例3:$img->BlackThreshold(threshold=>'50%',channel=>'All'); 例4:$img->WhiteThreshold(threshold=>'50%');ここでは,例1から順に,AutoLevel,AutoGamma,BlackThreshold 50%,WhiteThreshold 50% の例を示している。AutoGammaを施すとなんとなく画像が赤っぽくなっているような感じがする。BlackThreshold は指定された強度(ここでは50%) 以下の強度の点を黒にする。WhiteThreshold は指定された強度(ここでは50%) 以上の強度の点を白にする。
![]() | ![]() | ![]() | ![]() |
| 例1:AutoLevel | 例2:AutoGamma:ちょっと赤っぽい | 例3:BlackThreshold 50% | 例4:WhiteThreshold 50% |
例:$img->Gamma(gamma=>0.8, channel=>'Cyan');ここでは,上記の例2のAutoGammaを施したものに,さらに Cyan を 0.8 に減らす,という gamma 補正(言葉あってる?)を施している。結果はオリジナルにある程度近くなったと思う。しかし,いつもこの補正値でよいかは不明なので,いろいろと試しみてほしい。詳しいことはImage Magick サイトのColor Modificationsを読んでみてほしい。
![]() |
| AutoGamma 後に Gamma(0.8, 'Cyan') を施したもの |
(23) Negate:ネガを作る
ネガを作るにはNegate というコマンドを使う。$img->Negate(channel=>'All');PerlMagick の説明を読むといろいろオプションがあるようだが,とりあえずネガを作るには上記のようにすればよい。
![]() | ![]() |
| オリジナル (160x120) | Negate |
(24) Posterize:色の種類を減らす
Posterize というコマンドを使うと,色レベルの種類(数)を減らして,ポスター調の画像を作る。コマンドは以下の通り。例1:$img->Posterize(levels=>4, dither=>'True'); 例2:$img->Posterize(levels=>4, dither=>'False');オプションのlevels についてはよくわからないが,10より大きな数字にすると,何をしてるのかわからなくなる。解像度にもよるかもしれないが,小さい整数がいいみたい。
![]() | ![]() | ![]() |
| オリジナル (160x120) | 例1:Posterize levels=>4 dither=>False | 例2:Posterize levels=>4 dither=>True |
(25) OrderedDither:ザラザラにするコマンド?
OrderedDither というコマンドを使うと,画像をザラザラにすることができる。ちゃんと意味を理解してないので,具体例を見てください。例1:$img->OrderedDither(threshold=>'h4x4a', channel=>'All'); 例2:$img->OrderedDither(threshold=>'h4x4o', channel=>'All'); 例3:$img->OrderedDither(threshold=>'h4x4a', channel=>'Green');オプションのthreshold の意味はよくわからない。誰か教えて~。きっとImage Magick のUsage のページを見れば書いてあると思うけど…最後の例は,対象をGreen チャネルだけにしてみた。
![]() | ![]() | ![]() | ![]() |
| オリジナル (160x120) | 例1:Threshold=>'h4x4a' channel=>'All' | 例2:Threshold=>'h4x4o' channel=>'All' | 例3:Threshold=>'h4x4a' channel=>'Green' |
(26) 明るさの調整 : SigmoidalContrast
明るさの調整には,SigmoidalContrastというコマンドを用いる。$img->SigmoidalContrast(contrast=>'5', mid-point=>'0%');ここでもやっぱり細かいパラメータの値のことをまだ理解していないが,contrastはどの程度画像を明るくするかを表し,0だと何もせず,数値が大きくなると画像がより明るくなる。3が普通で,20だとやりすぎらしい。mid-pointの値はよくわからない。0%でも100%でもいまいち差が分からない。他にもsharpenというパラメーターもあり,コントラストを減らすには,このsharpenをFalseにするといいらしい。
![]() | ![]() |
| オリジナル (120x160) | SigmoidalContrast contrast=>5 |
2009年12月13日日曜日
FreeBSDでPerlMagick(その4)図形の描画と画像の加工
この投稿はFreeBSDでPerlMagick(その3)画像の加工からの続きです。
また,FreeBSDでPerlMagick(その1)はじめにに目次があります。
次にarc, ellipse, circle について書く。それぞれの書式は以下のようになる。
(註):この例は合成を示したいがためにこんなことをしているが,普通は画像(写真)に直接Anotate で文字を描く方が早い。
(註2):gravity で合成する際の座標原点を指定できるが,左下を指定した場合(SouthWest)にオフセットの値をプラスで記述するとうまくいかなかった。そんな時はマイナスの数値にしてみてほしい。
まずImage Magick での色についてだが,色を指定するのに幾つかの手法があって,よく知られているのがRGB による指定である。他にもCMYK やHSB,HSLなど幾つもあるらしい。筆者はRGB しか理解できてないので,RGB で話をしよう。RGB では,赤(r, red),青(b, blue),緑(g, green)の3色の和として色を表している。Image Magick では,色を指定するのに#ccddff のように16進数を使って表すこともできる。ここで,最初の2桁の#cc(# は以降が16進数であることを示している) はred 成分の濃さを,次の#dd がgreen 成分の濃さを,最後の#ff がblue 成分の濃さを表している。16進数で2桁なので,#00~#ff までの値を取りうる。Fx を用いると,この3つの色のチャネルに対して演算を行うことができる。例えば以下のように書くと,green とblue の色の平均をred チャネルに代入できる。
全体を一様に半透明にするにはFx を用いる。Fx の使い方のところで書いたが,Fx では3原色をred,green,blue の3つのチャネルとして演算していたが,透明度のためにalpha チャネル(a チャネル) に対して演算すると透明度が変化する。
Channels, Masks and Transparencyに詳しく書いてある。
(註):色のついた背景(xc:white などで準備したもの)に対しては上記の処理はうまくいかないことがあった。背景を半透明にするには,canvas の準備で透明なキャンバスを選び,全面に好みの色(白でもsilverでもgrayでもいい)をベタ塗りする。その上で上記のように alpha チャンネルの値を減らすとよい。
FreeBSDでPerlMagick(その5)さらに進んだコマンドに続く
また,FreeBSDでPerlMagick(その1)はじめにに目次があります。
(15) Draw:図形の描画(その2)
PerlMagick での図の描画の例をいつくか示そう。まずはline, rectangle, roundRectangle について書こう。それぞれの書式は以下のようになる。ちなみに,いずれの場合も 100 x 100 ピクセルのキャンバスの上に描画している。描画するための画像ファイルの読込み,あるいは新しいキャンバスを用意については,このブログのFreeBSDでPerlMagick(その1)はじめに やFreeBSDでPerlMagick(その2)図と文字を描く を見て欲しい。$img1->Draw(primitive=>'line', points=>'x0,y0 x1,y1', stroke=>$color, strokewidth=>$width); $img1->Draw(primitive=>'rectangle', points=>'x0,y0 x1,y1', fill=>'green', stroke=>$color, strokewidth=>$width); $img1->Draw(primitive=>'roundRectangle', points=>'x0,y0 x1,y1 wc,hc', fill=>'green', stroke=>$color, strokewidth=>$width);line は始点と終点を,rectangle は対角線上の2点を, roundRectangle は対角線上の2点と角の丸みを指定する。点と点の間はスペースだが,コンマで区切っても大丈夫だった。stroke は線を表し,rectangleなら縁の線を表す。指定しなければ枠なしの図形となる。fill は塗りつぶしの色を表し,line で指定しても無視される。以下に具体例を示す。例4はスリット付きの角の丸い四角である。
例1:$img1->Draw(primitive=>'line', points=>'0,50 100,100', stroke=>'blue', strokewidth=>2); 例2:$img1->Draw(primitive=>'rectangle', points=>'0,50 100,100', fill=>'green'); 例3:$img1->Draw(primitive=>'roundRectangle', points=>'0,50 100,100 10,10', fill=>'green'); 例4:$img1->Draw(primitive=>'roundRectangle', points=>'0,25 100,75 10,10', fill=>'green'); $img1->Draw(primitive=>'rectangle', points=>'45,0 55,100', stroke=>'none', fill=>'white');
![]() | ![]() | ![]() | ![]() |
| 例1:line | 例2:rectangle | 例3:roundRectagle | 例4:roundRectagle with slit |
次にarc, ellipse, circle について書く。それぞれの書式は以下のようになる。
$img1->Draw(primitive=>'arc', points=>'x0,y0 x1,y1 a0,a1', stroke=>$color, strokewidth=>$width, fill=>'green'); $img1->Draw(primitive=>'ellipse', points=>'x0,y0 rx,ry a0,a1', stroke=>$color, strokewidth=>$width, fill=>'green'); $img1->Draw(primitive=>'circle', points=>'x0,y0 x1,y1', fill=>'green', stroke=>$color, strokewidth=>$width);arc では,x0,y0 x1,y1 で四角い描画領域を指定し,その四角の中に辺に接するように角度a0からa1までの円弧を描く。角度は右横が0度で,時計回り(下向き)に角度を測る。下が90度方向,左が180度方向,上が270度方向になっている。gravity オプションが使えれば,角度の指定方法は変わると思われる(gravityが使えるかどうかもわからないので,あくまで推論) ellipse は中心座標と横方向の半径,縦方向の半径と開始角度,終了角度を指定する。circle はx0,y0 で中心座標を指定し,中心座標から点x1,y1 までを半径とする円を描く。stroke 等はlineやrectangleなどと同じである。
例1:$img1->Draw(primitive=>'arc', points=>'0,0 100,50 0,225', stroke=>'blue', strokewidth=>2, fill=>'green'); 例2:$img1->Draw(primitive=>'arc', points=>'0,0 100,50 225,0', stroke=>'blue', strokewidth=>2, fill=>'green'); 例3:$img1->Draw(primitive=>'ellipse', points=>'50,50 50,30 0,225', stroke=>'blue', strokewidth=>2, fill=>'green'); 例4:$img1->Draw(primitive=>'circle', points=>'50,50 50,5', stroke=>'blue', strokewidth=>2, fill=>'green');
![]() | ![]() | ![]() | ![]() |
| 例1:arc | 例2:arc2 | 例3:ellipse | 例4:circle |
(16) Composite:画像の合成
図の合成はComposite コマンドを使う。詳しいことはCompositing Imagesを見て欲しいが,以下に例を示しておこう。# Original画像の読み込み
my $img = Image::Magick->new;
$img->Read($target_pict);
# タイトル用の透明キャンバスの用意
my $img1 = Image::Magick->new;
$img1->Set(size=>'300x50');
$img1->ReadImage('xc:none');
# タイトルの作成
$text='紀伊半島・二木島';
$text = jcode($text)->utf8;
$fontdir='./HGRSMP.TTF';
$color='yellow';
$pointsize=32;
$img1->Annotate(text=>$text,geometry=>'+0+0',font=>$fontdir,fill=>$color,
gravity=>'Center',pointsize=>$pointsize,strokewidth=>1,stroke=>$color);
# 合成
$img->Composite(image=>$img1,compose=>'over',geometry=>'+0+80',gravity=>'Center');
# 出力とメモリの開放
$img->Write($newname);
undef $img1;
undef $img;
ここで,$img という画像に,$img1 というタイトル文字列を合成している。今の場合は,単純に上に重ねればいいのでcompose をover にしている。また,場所の指定は,Center からの相対的な座標で表している。![]() | ![]() | ![]() |
| Original | Title (背景が透明なのでpng で出力) | TitleをCompositeしたもの |
(註):この例は合成を示したいがためにこんなことをしているが,普通は画像(写真)に直接Anotate で文字を描く方が早い。
(註2):gravity で合成する際の座標原点を指定できるが,左下を指定した場合(SouthWest)にオフセットの値をプラスで記述するとうまくいかなかった。そんな時はマイナスの数値にしてみてほしい。
(17) Quantizeを用いた白黒画像への変換
白黒にする方法としてQuantize を使う方法を紹介する。他にもFx を使って演算する方法があるが,それは次の項目にしよう。Quantize とFx で結果は微妙に違うが,大体は同じような白黒画像が得られる。$img->Quantize(colorspace=>'gray');Quantize は本来,色の種類を減らすために用いるみたいだが,筆者はまだちゃんと理解できてない。Quantize に関しては,Image Magick の使い方のサイトのColor Quantization and Ditheringを見て欲しい。
![]() | ![]() |
| オリジナル (160x120) | Quantizeで白黒へ |
(18) Fx:三原色の色チャネルの演算
白黒変換のところでFx を使って演算する方法があると書いたが,ここではそのFx について書いてみよう。まずImage Magick での色についてだが,色を指定するのに幾つかの手法があって,よく知られているのがRGB による指定である。他にもCMYK やHSB,HSLなど幾つもあるらしい。筆者はRGB しか理解できてないので,RGB で話をしよう。RGB では,赤(r, red),青(b, blue),緑(g, green)の3色の和として色を表している。Image Magick では,色を指定するのに#ccddff のように16進数を使って表すこともできる。ここで,最初の2桁の#cc(# は以降が16進数であることを示している) はred 成分の濃さを,次の#dd がgreen 成分の濃さを,最後の#ff がblue 成分の濃さを表している。16進数で2桁なので,#00~#ff までの値を取りうる。Fx を用いると,この3つの色のチャネルに対して演算を行うことができる。例えば以下のように書くと,green とblue の色の平均をred チャネルに代入できる。
$img = $img->Fx(expression=>'(g+b)/2',channel=>'red');ここで数式の中のg,b がそれぞれgreenチャネル,blueチャネルを表している。redチャネルは数式の中ではrと表される。数式はsin やcos などのような一般の関数が使えるらしい。次ように書くと,3色の平均を取り,それを全てのチャネルに代入する。結果として白黒画像が得られる。
$img = $img->Fx(expression=>'(r+g+b)/3');Fx に関しては,Image Magick サイトのThe Fx Special Effects Image Operatorを見て欲しい。
![]() | ![]() | ![]() |
| オリジナル (160x120) | Fx(expression=>'(g+b)/2', channel=>'red') | Fxで'(r+g+b)/3'とした |
(19) Colorize:色をつける
Colorize を使うと,RGB の3色に別々に色をつけることができる。以下ではFx で白黒画像にしたものにColorize で色をつけている。$img = $img->Fx(expression=>'(r+g+b)/3'); $color='#fad759'; $opacity='50%'; $img->Colorize(fill=>$color,opacity=>$opacity);ここでopacity は不透明度を表し,opacity が大きいほど画像は薄くなる(?あれ?逆か?)。
![]() | ![]() | ![]() |
| オリジナル (160x120) | Fxで'(r+g+b)/3'の後 色'#fad759'とopacity 50%で Colorizeしたもの | Fxで'(r+g+b)/3'の後 色'#ccddff'とopacity 50%で Colorizeしたもの |
(20) 図の一部を透明にする:TransparentとFx
Image Magick で図を別の図に重ねる時に,図の一部や背景を透明にしたいことがある。Image Magick では,透明にした図を表すために,RGB の3つのチャネルに,alpha チャネル(あるいはmatte チャネル,ないしはopacity チャネル) と呼ばれるチャネルを1個追加して画像を扱っている。つまり色を表すのに#ccdd88ff のように16進数8桁で表している。6桁の場合はalpha チャネルの部分は#ff(透明ではない) とされる。従って,画像を透明にするには16進数8桁で表される色の最後の2桁を#00 にすると完全に透明になる。しかし,画像を処理する際には特定の色のみ透明にしたいことがある。例えば背景を白にしておいて,白い部分だけを透明にしたい,という場合。その場合はTransparent を使うと特定の色を透明にできる。$img->Transparent(color => 'White');この方法を使えば,以下のように新しい白いキャンバスを用意しておいて,白の部分を透明にすることで透明なキャンバスを用意することもできる。
use Image::Magick;
my $img1 = Image::Magick->new;
$img1->Set(size=>'300x300');
# ----------------------------------
$img1->ReadImage('xc:white'); # white canvas
$img1->Transparent(color=>'White');
# ----------------------------------
$img1->Write($newname);
undef $img1;
また,図を描いた上に背景色で図を上書きして,背景色を透明にすると図を切り取ることもできる。全体を一様に半透明にするにはFx を用いる。Fx の使い方のところで書いたが,Fx では3原色をred,green,blue の3つのチャネルとして演算していたが,透明度のためにalpha チャネル(a チャネル) に対して演算すると透明度が変化する。
$img1 = $img1->Fx(expression=>'a/2',channel=>'alpha');このようにすると,透明度が50%に下がる。下記の例では(15) Draw:図形の描画(その2)の例4の画像の背景を透明にしたものと,さらに全体を半透明にしたものを写真に合成している。念のために,今回用いた合成のコマンドを書いておく。
$img->Composite(image=>$img1,compose=>'over',geometry=>'+0+0',gravity=>'Center');透明化に関しては,Image Magick の使い方のサイトのMasking and Background Removalに (2011/4 訂正)
![]() | ![]() | ![]() |
| オリジナル (160x120) | 白を透明にして合成 | 全体を半透明にして合成 |
(註):色のついた背景(xc:white などで準備したもの)に対しては上記の処理はうまくいかないことがあった。背景を半透明にするには,canvas の準備で透明なキャンバスを選び,全面に好みの色(白でもsilverでもgrayでもいい)をベタ塗りする。その上で上記のように alpha チャンネルの値を減らすとよい。
FreeBSDでPerlMagick(その5)さらに進んだコマンドに続く
登録:
投稿 (Atom)














































