ページ

2009年1月3日土曜日

キャプチャ画像を縮小して保存する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

キャプチャ画像を縮小して保存する機能を追加する。

用途はブログなどの利用を第一に想定しているので厳密な縮小率はいらない。通常あるような数値を入れたり、プリファレンスで設定するUIは面倒なのでもっとお手軽な方法を取る事にする。SimpleViewerがウィンドウをリサイズすることでキャプチャ画像を自由な縮小率で表示できるので、これをそのまま利用しよう。つまり今目でみている縮小率で画像を縮小して(上書き)保存してしまう。

まず SimpleViewerの右下に現在目に見えている縮小率(%)を表示し、保存用のボタンをその横へ追加する。


縮小は、縮小用にテンポラリの NSImage を用意し、そこへ元画像の NSImage から縮小描画する。この時、縮小画像が奇麗に補間されるように以前紹介した NSGraphicContext#setImageInterpolation: を使う。
コードはこんな感じ。

 NSImage* image = [_image_view image];
CGFloat ratio = [self reductionRatio];
NSRect rect = NSZeroRect;
NSRect new_rect = NSZeroRect;
rect.size = [image size];
new_rect.size.width = (int)(rect.size.width * ratio);
new_rect.size.height = (int)(rect.size.height * ratio);

NSImage* new_image = [[[NSImage alloc] initWithSize:new_rect.size] autorelease];

[new_image lockFocus];
[NSGraphicsContext saveGraphicsState];
[[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh];
[image drawInRect:new_rect
fromRect:NSZeroRect
operation:NSCompositeSourceOver
fraction:1.0];
[NSGraphicsContext restoreGraphicsState];
[new_image unlockFocus];



ボタンを押すと上記コードを使い縮小画像を作った後、ファイルを上書き保存する。保存後はファイルを読み直す(表示は当然 100%になる)。また上書き前の画像は事前にゴミ箱へ移動しておく。


なお NSGraphicContext#setImageInterpolation: は NSImage#lockFocus の後に呼出す必要がある。lockFocusの前に setImageInterpolation: を読んでも縮小時の画像補間が意図通りに行われない。下記の様に縮小画像が奇麗にならない。

縮小画像が奇麗にならずここで少しハマった。

- - - -
縮小機能は前から欲しかったのでちょっとうれしい。以前はわざわざプレビューを立ち上げてキャプチャ画像を縮小していた。