スポンサーサイト

    上記の広告は1ヶ月以上更新のないブログに表示されています。
    新しい記事を書く事で広告が消せます。

    BitmapからRegionを作る関数

    たま~に必要になるので、メモ。

    		public static Region CreateRegionFromBitmap(Bitmap bitmap)
    		{
    			if (!(bitmap.PixelFormat == System.Drawing.Imaging.PixelFormat.Format24bppRgb ||
    				bitmap.PixelFormat == System.Drawing.Imaging.PixelFormat.Format32bppArgb ||
    				bitmap.PixelFormat == System.Drawing.Imaging.PixelFormat.Format32bppRgb))
    				return null;// 24bitか32bit以外は無理
    
    			//ここの変数もっとまともな名前つけたい
    			int channels = Image.GetPixelFormatSize(bitmap.PixelFormat) / 8;
    			int offset = 0;
    			int count = channels;
    			if (bitmap.PixelFormat == System.Drawing.Imaging.PixelFormat.Format32bppArgb)
    			{//Format32bppArgbの場合はα値のみを確認する
    				count = 1;
    				offset = 3;
    			}
    
    			//ビットマップから生データを取得
    			Rectangle rectBitmap = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
    			System.Drawing.Imaging.BitmapData data = bitmap.LockBits(rectBitmap,
    				System.Drawing.Imaging.ImageLockMode.ReadOnly, bitmap.PixelFormat);
    			byte[] values = new byte[data.Height * data.Stride];
    			System.Runtime.InteropServices.Marshal.Copy(data.Scan0, values, 0, data.Height * data.Stride);
    			bitmap.UnlockBits(data);
    
    			//透明にする色を取得
    			byte[] transparent = new byte[count];
    			if (count == 1)
    				transparent[0] = 0;
    			else
    			{
    				for (int i = 0; i < count; ++i)
    					transparent[i] = values[i];
    			}
    
    			//リージョンを構成するパスのインスタンス
    			System.Drawing.Drawing2D.GraphicsPath rgnPath = new System.Drawing.Drawing2D.GraphicsPath();
    
    			Rectangle rect = new Rectangle();
    			for (int y = 0; y < data.Height; ++y)
    			{
    				int offsetY = y * data.Stride;
    				for (int x = 0; x < data.Width; ++x)
    				{
    					for (int c = 0; c < count; ++c)
    					{
    						if (transparent[c] != values[offsetY + x * channels + c + offset])
    						{//透過色ではない
    							rect.X = x;//透過色ではないスタート地点を保存
    							for (++x; x < data.Width; ++x)
    							{
    								for (c = 0; c < count; ++c)
    								{
    									if (transparent[c] != values[offsetY + x * channels + c + offset])
    										goto CONTINUE;	//透過色ではないので続ける
    								}
    								break;	//次の透過色を見つけたので脱出
    							CONTINUE:
    								;
    							}
    							rect.Width = x - rect.X;
    							rect.Y = y;
    							rect.Height = 1;
    
    							//ここでパスにrectを加える
    							rgnPath.AddRectangle(rect);
    							break;
    						}
    					}
    				}
    			}
    
    			//最後にパスからリージョンを作成
    			return new Region(rgnPath);
    		}
    
    スポンサーサイト

    コメントの投稿

    管理者にだけ表示を許可する

    プロフィール

    ざっち

    Author:ざっち
    ざっちのーと
    ♪自由なSEのメモ帳です♪

    ざっちのスキル一覧
    ----------------
    上級(手足も同然!)
    ・.net FrameWork
    ・C#
    ・SqlServer
    ・VisualBasic6.0
    ----------------
    中級(だいたいOK!)
    ・WPF(XAML)
    ・Android
    ・WindowsMobile6.5
    ・HTML
    ----------------
    下級(や、やればできるさ!)
    ・PHP
    ・JavaScript
    ・SilverLight
    ・SQLite
    ・Python(だってjetCreaterが・・・)
    ・C++(OpenCVいじってみたくて・・・)
    ----------------
    最近のお気に入り
    ・WPF(XAML)
    ・Android
    ・GoogleAPI
    ----------------

    最近の記事
    月別アーカイブ
    カテゴリー
    夢見る羊さん
    地球の名言Ⅱ

    presented by 地球の名言

    Twitter...A

    Twitter < > Reload

    ブロとも申請フォーム

    この人とブロともになる

    ブログ内検索
    RSSフィード
    リンク
    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。