2011-07-10 5 views
3

グラフィック描画を使用して256x256色空間イメージを作成するにはどうすればよいですか?現在、私はポインタを使って各ピクセル位置をループして設定しています。青はXで0 ... 255、Yで0 ... 255になります。画像は初期化されています。イメージを描画するには?

Bitmap image = new Bitmap(256, 256); 
imageData = image.LockBits(new Rectangle(0, 0, 256, 256), 
      ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); 
for (int row = 0; row < 256; row++) 
{ 
    byte* ptr = (byte*)imageData.Scan0 + (row * 768); 
    for (int col = 0; col < 256; col++) 
    { 
     ptr[col * 3] = (byte)col; 
     ptr[col * 3 + 1] = (byte)(255 - row); 
     ptr[col * 3 + 2] = 0; 
    } 
} 

私は赤で0 ... 255になるスライダーを持っています。各スクロールで、このループを通過し、イメージを更新します。

for (int row = 0; row < 256; row++) 
{ 
    byte* ptr = (byte*)imageData.Scan0 + (row * 768); 
    for (int col = 0; col < 256; col++) 
    { 
     ptr[col * 3 + 2] = (byte)trackBar1.Value; 
    } 
} 

私は、スクロール部分の代わりにColorMatrixを使用する方法を考え出しましたが、どのように私は、ポインタまたはsetPixelを使うことなく画像を初期化することができますか?

+3

なぜポインタを使用していますか? –

+0

私はポインタを使用しています。なぜなら、値をループで直接更新できるだけなので、理解して使用するのが最も簡単な方法だったからです。 GetPixelとSetPixelを使用するよりも高速でした。 – Jack

答えて

3

まず、PictureBoxコントロールをフォームに追加します。次に、このコードは、ループ内のインデックスに基づいて、各画素に異なる色を割り当て、コントロールに画像を割り当てる

Bitmap image = new Bitmap(pictureBox3.Width, pictureBox3.Height); 
SolidBrush brush = new SolidBrush(Color.Empty); 
using (Graphics g = Graphics.FromImage(image)) 
{ 
    for (int x = 0; x < image.Width; x++) 
    { 
     for (int y = 0; y < image.Height; y++) 
     { 
      brush.Color = Color.FromArgb(x, y, 0); 
      g.FillRectangle(brush, x, y, 1, 1); 
     } 
    } 
} 
pictureBox3.Image = image; 

思ったように全くSetPixel又はDrawPixelはありませんいくつかの理由が、 FillRectangleは1x1の寸法で塗りつぶすときと全く同じことを行います。

小さな画像では問題なく動作しますが、画像が大きくなるほど遅くなることに注意してください。

+1

hmm、OPは性能上の理由からSetPixelを使用したくないと言っていましたが、1x1の長方形を描くのはそれほど良くないでしょう。 – gordy

+0

@Gordy for 256x256イメージそれはまだ素晴らしいですし、約2時間かかります。効率。私はメモリを乱雑にするのを避けるために毎回新しい 'Brush'を作成しないことに注意してください。 –

1

あなたはバイト配列内の勾配を構築し、Marshal.Copyそれをあなたのビットマップにする必要がありますポインタやとsetPixelを使用したくない場合は、次の

int[] b = new int[256*256]; 
for (int i = 0; i < 256; i++) 
    for (int j = 0; j < 256; j++) 
     b[i * 256 + j] = j|i << 8; 

Bitmap bmp = new Bitmap(256, 256, PixelFormat.Format32bppRgb); 
BitmapData bits = bmp.LockBits(new Rectangle(0, 0, 256, 256), 
    ImageLockMode.ReadWrite, PixelFormat.Format32bppRgb); 

Marshal.Copy(b, 0, bits.Scan0, b.Length); 
0

これはあなたに白を作成しますイメージ256x256

Bitmap image = new Bitmap(256, 256); 
using (Graphics g = Graphics.FromImage(image)){ 
    g.FillRectangle(Brushes.White, 0, 0, 256, 256); 
} 
関連する問題