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

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

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

Re[6]: 自分の画面にGetPixcel()とSetPixel()


(過去ログ 72 を表示中)

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

■42253 / inTopicNo.1)  自分の画面にGetPixcel()とSetPixel()
  
□投稿者/ yac (1回)-(2009/10/10(Sat) 17:25:18)

分類:[.NET 全般] 

VC#2008で質問させてください。

Paintイベントハンドラ
{
Graphicsオブジェクトに対する描画処理
※ここまで書いてきた画面の輝度を変更
}

上記※の部分を実装したいのですが、GetPixel()やSetPixel()のようなことはできるでしょうか。
輝度変更処理はわかります。

よろしくお願いいたします。

引用返信 編集キー/
■42259 / inTopicNo.2)  Re[1]: 自分の画面にGetPixcel()とSetPixel()
□投稿者/ 倉田 有大 (737回)-(2009/10/10(Sat) 18:39:36)
No42253 (yac さん) に返信
> VC#2008で質問させてください。
>
> Paintイベントハンドラ
> {
> Graphicsオブジェクトに対する描画処理
> ※ここまで書いてきた画面の輝度を変更
> }
>
> 上記※の部分を実装したいのですが、GetPixel()やSetPixel()のようなことはできるでしょうか。
> 輝度変更処理はわかります。

GetPixelやSetPixel遅いですよ?
Bitmapオブジェクトつくって、それにGraphicsオブジェクトで描画、
次に直接Bitmapオブジェクトのメモリーにアクセスして輝度変更
で、Bitmapオブジェクトを画面に描画してあげるのはいかがでしょうか。
引用返信 編集キー/
■42263 / inTopicNo.3)  Re[2]: 自分の画面にGetPixcel()とSetPixel()
□投稿者/ yac (3回)-(2009/10/10(Sat) 23:04:00)
No42259 (倉田 有大 さん) に返信

> GetPixelやSetPixel遅いですよ?
> Bitmapオブジェクトつくって、それにGraphicsオブジェクトで描画、
> 次に直接Bitmapオブジェクトのメモリーにアクセスして輝度変更
> で、Bitmapオブジェクトを画面に描画してあげるのはいかがでしょうか。

ご返信ありがとうございます。
説明はよくわかりましたが、.netでの実装のイメージが湧かず、大変お手数おかけしますが、コードで提示いただけないでしょうか。
引用返信 編集キー/
■42269 / inTopicNo.4)  Re[3]: 自分の画面にGetPixcel()とSetPixel()
□投稿者/ 倉田 有大 (738回)-(2009/10/11(Sun) 08:45:28)
にゅー

ごそごそと自分のソースあさる。

            BitmapData bmData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
            byte[] srcBmData = new Byte[bmData.Height * bmData.Stride];
            System.IntPtr Scan0 = bmData.Scan0;
            int stride = bmData.Stride; 
            unsafe
            {
                byte* p = (byte*)(void*)Scan0;
                int nOffset = stride - bmData.Width * 3;

                for (int y = 0; y < bmData.Height; ++y)
                {
                    for (int x = 0; x < bmData.Width; ++x)
                    {
  p[0] = p[1] = p[2] = (byte)(.299 * p[2]
                            + .587 * p[1]
                            + .114 * p[0]);

                        p += 3;
                    }
                    p += nOffset;
                }

            }
            bitmap.UnlockBits(bmData);

グレイスケール変換の例

引用返信 編集キー/
■42271 / inTopicNo.5)  Re[4]: 自分の画面にGetPixcel()とSetPixel()
□投稿者/ yac (4回)-(2009/10/11(Sun) 10:48:52)
No42269 (倉田 有大 さん) に返信

ソースの提示、本当にありがとうございます。

@Bitmapオブジェクトつくって
AそれにGraphicsオブジェクトで描画、
B次に直接Bitmapオブジェクトのメモリーにアクセスして輝度変更
CBitmapオブジェクトを画面に描画してあげるのはいかがでしょうか。

ただ、提示いただいたのは上記@とBの部分だと思うのですが、なんとか
AとCの部分も教示いただくことはできないでしょうか...
なにとぞよろしくお願いいたします。

引用返信 編集キー/
■42274 / inTopicNo.6)  Re[5]: 自分の画面にGetPixcel()とSetPixel()
□投稿者/ 倉田 有大 (739回)-(2009/10/11(Sun) 11:27:56)
> AそれにGraphicsオブジェクトで描画、

Bitmap bmp = new Bitmap(sideSize, sideSize);
Graphics g = Graphics.FromImage(bmp);

> CBitmapオブジェクトを画面に描画してあげるのはいかがでしょうか。

Graphics.DrawImage

上記でいけるはず。
使い方は検索してくださいー
引用返信 編集キー/
■42275 / inTopicNo.7)  Re[6]: 自分の画面にGetPixcel()とSetPixel()
□投稿者/ ぽぴ王子 (455回)-(2009/10/11(Sun) 12:02:08)
ぽぴ王子 さんの Web サイト
この例でいけば、特に Paint イベントで処理する必要はなさそうです。

Bitmap を作って、画像処理を施して、それを PictureBox の Image プロパティに
設定してやれば良さそうな感じ。

あと、DrawImage メソッドのオーバーロードとして、ImageAttributes クラスを
指定するものがあります。それを使うとグレースケール変換等も簡単に行える
はずです。…ちょっと今すぐサンプルを出すことはできないですが。
引用返信 編集キー/
■42277 / inTopicNo.8)  Re[6]: 自分の画面にGetPixcel()とSetPixel()
□投稿者/ yac (5回)-(2009/10/11(Sun) 17:29:09)
No42274 (倉田 有大 さん) に返信
わがままに付き合っていただき、ありがとうございました。
MFCから移ったばかりで、勉強になります。基本的にMFCとほとんど
同じ考えでいけるのですね。
本当にありがとうございました。
引用返信 編集キー/
■42278 / inTopicNo.9)  Re[7]: 自分の画面にGetPixcel()とSetPixel()
□投稿者/ yac (6回)-(2009/10/11(Sun) 17:38:12)
No42275 (ぽぴ王子 さん) に返信

ご返信ありがとうございます。

> この例でいけば、特に Paint イベントで処理する必要はなさそうです。
> Bitmap を作って、画像処理を施して、それを PictureBox の Image プロパティに
> 設定してやれば良さそうな感じ。
1秒毎に再描画する必要があり、タイマーハンドラからInvalidate()しています。
全画面にしていることもあり、フォームに直接描画しているのですが、PictureBoxに
描画したらPaintイベントハンドラで実装する必要がない(タイマーハンドラで描画)
のでしょうか。

> あと、DrawImage メソッドのオーバーロードとして、ImageAttributes クラスを
> 指定するものがあります。それを使うとグレースケール変換等も簡単に行える
> はずです。…ちょっと今すぐサンプルを出すことはできないですが。
ありがとうございます。輝度変更に使えるか調査してみます。

引用返信 編集キー/
■42289 / inTopicNo.10)  Re[8]: 自分の画面にGetPixcel()とSetPixel()
□投稿者/ ぽぴ王子 (456回)-(2009/10/12(Mon) 06:40:33)
ぽぴ王子 さんの Web サイト
No42278 (yac さん) に返信

とりあえず、ちょっとサンプル的なものを作ってみました。
フォーム上に TrackBar と PictureBox を追加して、ごそごそと。
TrackBar は Minimum プロパティを 0 Maximum プロパティを 100 に設定しています。
あと、リソース上にてきとーな画像を追加しておくということで。
(この辺はファイルから読む込むようにしてもいいですけど)
TrackBar の ValueChanged イベントと、PictureBox の Paint イベントに以下のイベントハンドラ
を実行するように設定しておいてください。

        private void trackBar1_ValueChanged(object sender, EventArgs e)
        {
            pictureBox1.Invalidate();
        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            Bitmap source = Properties.Resources.(とりあえず何か画像);
            Bitmap destination = new Bitmap(source.Width, source.Height);

            ImageAttributes attribute = new ImageAttributes();
            float r = ((float)trackBar1.Value) * 0.01f;
            float[][] colorMatrixElements = {
                                                new float[] {1, 0, 0, 0, 0},
                                                new float[] {0, 1, 0, 0, 0},
                                                new float[] {0, 0, 1, 0, 0},
                                                new float[] {0, 0, 0, 1, 0},
                                                new float[] {r, r, r, r, r}
                                            };
            ColorMatrix matrix = new ColorMatrix(colorMatrixElements);
            attribute.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
            using (Graphics graphics = Graphics.FromImage(destination))
            {
                graphics.DrawImage(
                    source,
                    new Rectangle(0, 0, destination.Width, destination.Height),
                    0,
                    0,
                    source.Width,
                    source.Height,
                    GraphicsUnit.Pixel,
                    attribute);
            }
            pictureBox1.Image = destination;
        }

トラックバーを動かすと、画像の輝度が変化する感じです。
実際のところ、ImageAttributes のあたりは僕も研究中という感じなので詳しくないですが
こんな感じでできるんじゃないかな?というサンプルということで。

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -