« 画像の角を丸める | トップページ | DataSetをXMLで書き出す時の注意点 »

2006/12/14

画像の角を丸める 改良版

前回のkadomarizeメソッドは

  1. ソース画像の読込
  2. 描画用ビットマップの生成
  3. キャンバスを白で描画
  4. クリッピング領域の設定
  5. 描画用ビットマップへソース画像を描画

という手順で実装されていました。今更気にするほどのではないと思われますが、この手順だと描画用のビットマップを生成する分だけメモリを余計に消費することになります。

そこで処理の手順を以下のように修正します。

  1. ソース画像の読込
  2. クリッピング領域の設定
  3. クリッピング領域に白を描画

public void kadomarize(string filename)
{
using(Bitmap bmp = new Bitmap(filename))
{
using(Graphics g = Graphics.FromImage(bmp))
{
g.SmoothingMode = SmoothingMode.AntiAlias;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
int width = bmp.Width;
int height = bmp.Height;
GraphicsPath path = this.CreateRoundedRectangle(width, height);
g.SetClip(path, CombineMode.Exclude);
g.FillRectangle(Brushes.White, 0, 0, width, height);
g.Dispose();
}
string savename = string.Format(@"{0}\{1}k.bmp",
System.IO.Path.GetDirectoryName(filename),
System.IO.Path.GetFileNameWithoutExtension(filename));
bmp.Save(savename, ImageFormat.Bmp);
}
}
g.SetClip(path, CombineMode.Exclude);の第二引数CombineModeが肝です。
また、CreateRoundedRectangleメソッドも修正です。
最後の行が不要です。
private GraphicsPath CreateRoundedRectangle(int width, int height)
{
Size offset = new Size(width / 5, height / 5);
GraphicsPath path = new GraphicsPath(FillMode.Winding);
path.AddArc(width - offset.Width, 0, offset.Width, offset.Height, 270, 90);
path.AddArc(width - offset.Width, height - offset.Height, offset.Width, offset.Height, 0, 90);
path.AddArc(0, height - offset.Height, offset.Width, offset.Height, 90, 90);
path.AddArc(0, 0, offset.Width, offset.Height, 180, 90);
path.AddArc(width - offset.Width, 0, offset.Width, offset.Height, 270, 90);
return path;
}

« 画像の角を丸める | トップページ | DataSetをXMLで書き出す時の注意点 »

02 C#」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: 画像の角を丸める 改良版:

« 画像の角を丸める | トップページ | DataSetをXMLで書き出す時の注意点 »

2021年9月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    

最近のトラックバック

無料ブログはココログ