C#のアプリからAndroid 9-patch形式の画像を扱うクラスを書いてみたよ

クラスファイルはこちら。
https://github.com/aquarla/CSharp-NinePatch-Sample/blob/master/NinePatchSample/NinePatch.cs

これはなに?

C#で書かれたWindowsフォームなどのプログラムから、Androidアプリで使用される9-patch形式の画像を扱うクラスです。

Android 9-patchってなに?

Androidの各種UI部品に使用されている画像フォーマットです。
UI部品が拡大されたときに「どのピクセルを引き伸ばすか」の情報が画像内に含まれている為、UI部品のサイズが可変になる場合でも、見た目が崩れることなく描画することが出来るようになります。
こんな感じ。

などと説明すると、とても高尚なものに聞こえますが、

  • PNG画像の上下左右に1ピクセル分の透明な余白を作って
  • 引き伸ばす対象部分のピクセル(上辺および左辺)を黒く塗りつぶす

というだけのものです。
詳しくはここを読む。
http://developer.android.com/guide/developing/tools/draw9patch.html
日本語が良ければこちらを参考に。
9patchを覚えよう! - 明日の鍵

どうやって使うの?

簡単な使い方
NinePatch ninePatch = new NinePatch(image); // 9-patch画像imageから9-patchオブジェクトを作成
Image newImage = ninePatch.ImageSizeOf(500, 500) // 500x500に引き伸ばした画像を取得
ボタンの背景画像に指定する
protected override void OnResize(EventArgs e)
{
    button1.BackgroundImage = ninePatch.ImageSizeOf(button1.Width, button1.Height);
    base.OnResize(e);
}

ボタンのサイズが変更された時にはImageを再設定してやる必要があるので、FormのOnResizeなどに書く必要あり。
また、ButtonのFlatStyleはFlat、BackgroundImageLayoutはStretchとかに指定してやると、わりと幸せになれる。

キャッシュをクリア
ninePatch.ClearCache();

9-patchの画像生成処理は全ピクセルをナメることになり処理が重くなりがちなので、画像サイズごとにキャッシュを設けている。
但し、どこかのタイミングでキャッシュをクリアしてあげないと、メモリが大変なことになるので、臨機応変にClearCacheメソッドを呼んであげる。

サンプルとかある?

こちらをどうぞ。
GitHub - aquarla/CSharp-NinePatch-Sample: Sample for using Android 9-patch format image in C#
Visual Studio 2008 Professional を使ってますが、形式を変換すれば2010とかでも動くはずです。たぶん。