C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: SetPixelとGetPixelについて


(過去ログ 20 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■8316 / inTopicNo.1)  SetPixelとGetPixelについて
  
□投稿者/ 月光 (1回)-(2007/09/27(Thu) 21:11:35)

分類:[C#] 

VisualBasic2005、C#を利用しています。

画像A、画像B、画像Cと3枚の同じ大きさの画像があるのですが。

画像Aの輝度値が低いピクセルから順番にそのピクセルの”場所”を取得して、
Bの画像の同じ”場所”にある”色”をGetPixelで取得し、画像CにSetPixelで”色”をその”場所”に置いていきたいのですが
処理がものすごく遅くて、どうにか早くする方法はないでしょうか。
よろしくお願いいたします。
 
namespace テスト
{
    public partial class Form1 : Form
    {
        Bitmap effe = new Bitmap(@"画像A.bmp");
        Bitmap mat = new Bitmap(@"画像B.png");
        Bitmap base1 = new Bitmap(@"画像C.png"); 
        Rectangle rect, rect2;

        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        { }
        protected override void OnPaint(PaintEventArgs e)//描画する所
        {
            base.OnPaint(e);
            rect = new Rectangle(0,0,mat.Size.Width,mat.Size.Height);
            e.DrawImage(base1,rect);
        }

        //四捨五入
        public static double ToHalfAdjust(double dValue, int iDigits)
        {
            double dCoef = System.Math.Pow(10, iDigits);

            return dValue > 0 ? System.Math.Floor((dValue * dCoef) + 0.5) / dCoef :
                                System.Math.Ceiling((dValue * dCoef) - 0.5) / dCoef;
        }

        private void SetPixcel()
        {
            int w = effe.Size.Width;
            int h = effe.Size.Height;
            for (int s = 0; s <= 50; s++)
            {
                for (int a = 0; a < w; a++)
                {
                    for (int b = 0; b < h; b++)
                    {
                        double h1 = ToHalfAdjust(effe.GetPixel(a, b).GetBrightness(), 1) * 50;

                        if (h1 == s) 
                        {
                            int P = mat.GetPixel(a,b).ToArgb();
                            base1.SetPixel(a, b, Color.FromArgb(P));
                            Application.DoEvents();
                        }
                    }    
                }
                Invalidate();
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            SetPixcel();
        }
    }
}

引用返信 編集キー/
■8317 / inTopicNo.2)  Re[1]: SetPixelとGetPixelについて
□投稿者/ 魔界の仮面弁士 (435回)-(2007/09/27(Thu) 21:17:43)
No8316 (月光 さん) に返信
> 画像Aの輝度値が低いピクセルから順番にそのピクセルの”場所”を取得して、
> Bの画像の同じ”場所”にある”色”をGetPixelで取得し、画像CにSetPixelで”色”をその”場所”に置いていきたいのですが
> 処理がものすごく遅くて、どうにか早くする方法はないでしょうか。

GetPixel/SetPixel を使う代わりに、LockBits から BitmapData を得て、
Scan0 のポインタを操作すれば OK かと。
引用返信 編集キー/
■8329 / inTopicNo.3)  Re[1]: SetPixelとGetPixelについて
□投稿者/ IIJIMAS (30回)-(2007/09/28(Fri) 00:16:56)
No8316 (月光 さん) に返信
> 処理がものすごく遅くて、どうにか早くする方法はないでしょうか。

魔界の仮面弁士様のおっしゃる通りまず、
Bitmap.LockBits メソッド
http://msdn2.microsoft.com/ja-jp/library/5ey6h79d(VS.80).aspx
を使うほうが速くなると思います。

脱線なのですが、
この前、私もBitmap の処理をしようとしていて、LockBits を使うようにしたのですが、Visual Studioから起動するとなんか妙に遅かったことがあります。
そこでビルドした後のexeを直接エクスプローラから起動するとなぜか今までがうそのように速かったのです。
もしLockBits の対応しても、Visual Studioからの起動(デバッグ時などで必要)で遅い場合は、
プロジェクトプロパティの「デバッグ」タブの
「Visual Studio ホスティング プロセスを有効にする」
のチェックをはずして試してみてください。

引用返信 編集キー/
■8346 / inTopicNo.4)  Re[2]: SetPixelとGetPixelについて
□投稿者/ 月光 (3回)-(2007/09/28(Fri) 09:46:25)
No8317 (魔界の仮面弁士 さん) に返信
No8329 (IIJIMAS さん) に返信

お答えいただいてありがとうございます。
調べて実行してみようとおもいます。
ありがとうございました!
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -