カラー画像の白黒化

Prickeis! Xで画像を印刷する時に綺麗に出力するために、カラー画像を白黒に変換する方法を調べてみました。

昔のMacOSであればGWorldとCopyBitsを使えば簡単に綺麗なDither処理のかかった白黒画像を作成することができていたのですが、現在の環境ではフレームワークではサポートしていないみたいです。

画像のディザー処理について検索していると「Atkinson dithering」というのを発見。もしかしたらと思ったらやっぱり私の尊敬するBill Atkinsonでした。しかし、具体的な実装方法を見つけることができず、このアルゴリズムは断念…

次に昔購入した「C言語で学ぶ実践画像処理」という本を引っ張りだしてみると「ディザ法による画像表示」というのを見つけました。Windows用のサンプルプログラムも載っているので早速「組織的ディザ法による2値化」と「平均誤差最小ディザ法による2値化」をMac用に書き直してみました。しかし「平均誤差最小ディザ法」は上下左右のフチの処理がイマイチ。

再度WEBで情報を検索していると、「Error diffusion」というアルゴリズムを見つけたので、これを実装してみたところ、そこそこ綺麗に変換できるようになりました。

とりあえずNSImageのカテゴリーとして

– (NSImage *) monochromeImageType:(int) type;

という形で実装してみました。変換スピードも最初は0.1秒くらいかかる物も有ったのですが、最適化を行って0.01秒くらいで変換できるようになりました(といってもサンプル画像が小さいんですけどね)。

テスト用アプリの実行結果

スクリーンショット 2013-05-10 18.04.38 スクリーンショット 2013-05-10 18.04.43 スクリーンショット 2013-05-10 18.04.46 スクリーンショット 2013-05-10 18.04.50 次のPrickeis! Xのバージョンで利用しようと思います。

 
カテゴリー: Mac, MacOS Apps, Off topic タグ: パーマリンク

コメントを残す