ImageMagick: crop時の注意(+repageオプションについて) このエントリーを含むはてなブックマーク

2009 年 7 月 31 日 by itok

ImageMagickで -crop を行う場合、元の画像情報を引き継いでしまうことがあります。そのため、生成された画像をさらに加工しようとすると、思い通りの座標系で加工されなくなってしまいます。

たとえば、ここに240×160のpngがあったとします。

$ identify sample.png
sample.png PNG 240x160 240x160+0+0 8-bit DirectClass 53.6kb

これを適当なサイズで切り抜きます。

$ convert sample.png -crop 64x64+10+10 cropped.png
$ identify cropped.png
cropped.png PNG 64x64 240x160+10+10 8-bit DirectClass 6.63kb

と、ここで、cropped.png に sample.png の情報が引き継がれています。このせいで、たとえば cropped.png をさらに分割しようとしても、原点がずれた状態で分割されてしまうようです。

そこで +repage オプションの登場です。これは画像の持つキャンバス情報をリセットしてくれます。

$ convert sample.png -crop 64x64+10+10 +repage repaged.png
$ identify repaged.png
repaged.png PNG 64x64 64x64+0+0 8-bit DirectClass 6.59kb

これできれいな切り抜き画像ができました。

ImageMagickで画像を分割する このエントリーを含むはてなブックマーク

2009 年 7 月 30 日 by itok

ある巨大な画像をタイル上に分割したいとき、最初は座標を指定して順番に切り抜いていけばよいかと思っていたんですが、そんな手間はかかりませんでした。

答えを先に書きます。256×256のタイル上に分割するには、

$ convert sample.png -crop 256x256 "sample_%d.png"

これだけでOKです。-crop オプションの引数として widthxheight 以外の位置情報を省略した場合は、画像全体を分割するようになります

ただ、この場合は、分割後のファイルが一続きの連番(この場合は、sample_0.png, sample_1.png …)になってしまうので、元画像のどこに位置するのかがわかりにくいです。そこで、最新バージョンでは新しい表記が可能になりました。それを使うと、

$ convert                     \ # 変換
  sample.png                  \ # 入力ファイル
  -crop 256x256               \ # 256x256で切り抜き
  -set "filename:tile" "%[fx:page.x/256]_%[fx:page.y/256]" \ # ファイルの連番指定
  +repage                     \ # 仮想canvasに関するメタデータをリセット
  +adjoin                     \ # 強制的にファイルを別々に保存
  "sample_%[filename:tile].png" # 出力ファイル名

-set で出力ファイル名の形式を指定し、しかも fx と page によって分割された画像をインデックス化しています。これだと、sample_0_0.png, sample_0_1.png … sample_n_n.png という感じになって、分割画像の行と列をファイル名に含めることができました。

参考 (www.imagemagick.org)

ちなみに、MacBook (Core2Duo 2.4GHz + 4Gメモリ) で4096×2048の画像を分割すると128分割に1.8sec程度でした。こんなの手作業じゃ無理ですからね。

ImageMagickで正方形サムネイルを生成する このエントリーを含むはてなブックマーク

2009 年 7 月 29 日 by itok

画像のサムネイルを作るのはよくあることで、最近は画像の中心を正方形で切り出すことが多くなってきました。で、それを簡単に行うサンプルがこれ。

$ convert              \ # 変換
  "sample.jpg[64x64^]" \ # 入力ファイル+リサイズ(最小値指定)
  -gravity Center      \ # 中心原点
  -crop 64x64+0+0      \ # 64x64 で切り抜き(+0+0を指定することで全体を分割しない)
  sample_t.jpg           # 出力ファイル

あらかじめ画像を64×64に外接する形で縮小し、画像中心を原点に64×64で切り抜く。書いてしまうとそういうことですが、これをスクリプトなんかに埋め込めば、複数の画像のサムネイルを一気に作ることも簡単です。

Xcodeの「最近使ったプロジェクト」を増やす このエントリーを含むはてなブックマーク

2009 年 7 月 28 日 by itok

Xcodeの「ファイル」-「最近使ったプロジェクトを開く」の項目数は10ですが、これでは足りないという人のために項目数を増やしてみましょう。

元ネタはこちら。

結論から言えば、UserDefaults を変更すればOKというよくある話で、たとえば、こんなかんじ。

$ defaults write com.apple.Xcode NSRecentDocumentsLimit 20

ちゃんとドキュメントもあるそうですね。

ImageMagickを導入する このエントリーを含むはてなブックマーク

2009 年 7 月 27 日 by itok

コマンドラインの高機能画像変換ツールとしてオープンソースのImageMagickがあります。ちょっとした画像変換や、ループ処理なんかではかなりの威力を発揮するようで。(もちろん、使いこなせば、ものすごく強力なツールですが)

さて、まずは、手元のMacにインストールしてみましょう。

ImageMagick はもとから MacPorts に対応しているので、MacPorts をインストールしていれば、非常に簡単です。

$ sudo port install imagemagick

これだけで、しばらく待っていると(そこそこ時間がかかります)インストールが完了します。執筆時点での最新版は 6.5.4-0 でした。

せっかくなので、簡単な例を一つ。

iPhoneのスクリーンショットをAppStore用に加工したい場合、ステータスバーの領域を取り除きたいときってありますよね。こんな時はこれだけで一発OKなのです。

$ mogrify            \ # 画像変換
  -format jpg        \ # 出力はjpg
  -crop 320x460+0+20 \ # y成分20pxをのぞいて320x460で切り出し
  *.png                # 入力はpng

png画像を320×460で切り出して、jpgに変換し、同名のファイルとして保存。それが一瞬でできました。これは便利ですねえ。

今後も便利なコマンド例を載せていけたらと思います。

WebView内でRoundRectを実現する このエントリーを含むはてなブックマーク

2009 年 3 月 13 日 by oishi

通常のxhtml+cssで角丸矩形を表現する場合、画像等を使ったややこしいtips()を持ち出さねばなりません。…が、アプリ内WebViewで表示する html で角丸矩形を表現するのはビックリする程簡単です。

角丸化したいelementにCSSで

-webkit-border-radius:8px;

等とpixel数付で指定してあげればok。

以下のような角張った矩形が

roundrect指定をしない枠

roundrect指定をしない枠

以下のように角丸になります。

角丸矩形

角丸矩形

-webkit-border-radius属性のpixel数は角の丸み具合を表します。大きくすればする程、より円くなるという感じ。

ちなみに角丸はCSS3できちんと border-radius 属性として規定されているのですが、WebView内では有効に働きませんでした。

…という訳で、iPhone内のWebView上で角丸矩形を表現する場合は、webkit用に特別に用意された -webkit-border-radius 属性を使いましょう。

YouTube検索でカテゴリを指定する このエントリーを含むはてなブックマーク

2009 年 3 月 4 日 by itok

このガイドのクエリ パラメータの定義によると、標準のGoogle Data APIとしては alt, author, max-results, start-index にしか対応していないように読めますが、試してみるとそれ以外の category などの標準クエリも使用できました。

前のエントリの標準フィードに対する検索もこれを利用できます。

“cat”(ネコ)に関する動画を検索する場合、単なるキーワード指定だけだと全然関係ないものも拾ってきてしまいます。

  • 標準フィード : top_rated
  • キーワード : cat
  • 日本限定
  • 最大3件
  • 今週分
  • 結果を RSS で取得
curl "http://gdata.youtube.com/feeds/api/standardfeeds/JP/top_rated?vq=cat&max-results=3&time=this_week&alt=rss"

これに対して「動物カテゴリ(Animals)」を追加指定することで、より確実にネコの動画に行き着きます。

  • 標準フィード : top_rated
  • キーワード : cat
  • カテゴリ : Animals
  • 日本限定
  • 最大3件
  • 今週分
  • 結果を RSS で取得
curl "http://gdata.youtube.com/feeds/api/standardfeeds/JP/top_rated?vq=cat&category=Animals&max-results=3&time=this_week&alt=rss"

YouTubeで人気の動画を取得する このエントリーを含むはてなブックマーク

2009 年 3 月 4 日 by itok

この標準フィード top_rated を使用して、人気の動画を取得できます。たとえば、以下の条件で検索するとこうなります。

  • キーワード : iPhone
  • 日本限定
  • 最大3件
  • 本日分
  • 結果を RSS で取得
curl "http://gdata.youtube.com/feeds/api/standardfeeds/JP/top_rated?vq=iPhone&max-results=3&time=today&alt=rss"

UITableViewCell の selectedBackgroundView 属性について このエントリーを含むはてなブックマーク

2009 年 3 月 4 日 by itok

UITableViewCell の属性に selectedBackgroundView というものがあります。その名前の通り、セルを選択したときの背景 view を指定する属性です。使い方の条件がちょっとややこしかったのでメモ。

  1. テーブルのスタイルが UITableViewStylePlain の場合はデフォルトで nil
  2. 類似の属性 backgroundView(こちらも UITableViewStylePlain の場合はデフォルトで nil )が nil の場合は動作しない
  3. セルの selectionStyle 属性は基本無視されるが、UITableViewCellSelectionStyleNone を指定していると上記条件を満たしていても selectedBackgroundView は表示されない

そんなわけで、UITableViewStylePlain で使用する場合にはこんな感じになるかと。

@implementation MyTableViewCell
 
// 初期化のどこか
{
    // UITableViewCellSelectionStyleNone 以外ならなんでもOK
    self.selectionStyle = UITableViewCellSelectionStyleBlue;
 
    UIView* view;
    view = [[UIView alloc] initWithFrame:self.contentView.bounds];
    self.backgroundView = view;
    [view release];
 
    view = [[UIView alloc] initWithFrame:self.contentView.bounds];
    // viewにいろんな部品を貼り付ける
    self.selectedBackgroundView = view;
    [view release];
}

数値演算する時に使う expr の注意点 このエントリーを含むはてなブックマーク

2009 年 3 月 2 日 by oishi

exprコマンドを使って数値演算する時は、数値や演算記号の間に必ずスペースを入れて書くようにします。繋げて書くと単なる文字列と見なされてしまいますので要注意。

誤った書き方

$ expr 1+3
1+3

正しい書き方

$ expr 1 + 3
4

ちなみに expr では足し算以外に差・積・商・剰余の計算が可能です。
残念ながらべき乗の計算は出来ません。

$ expr 1 - 3
-2
$ expr 2 \* 10
20
$ expr 10 / 2
5
$ expr 10 / 4; #計算結果は小数値にはならない
2 
$ expr 10 % 3
1

積の演算子はエスケープするのを忘れないようにしましょう。

余談ですが、小数を含む計算や更に複雑な計算が必要な場合は bc コマンドを使うと良いでしょう。

$ echo "scale=1;10/4" | bc
2.5
$ echo "scale=3;sqrt(2)" | bc
1.414

[参考]