2011-07-10 54 views
3

如何使用圖形繪製創建256x256色彩空間圖像?目前我使用指針來遍歷每個像素位置並進行設置。藍色從0到255在X上,綠色從0到255在Y上。圖像初始化如此。如何繪畫?

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; 
    } 
} 

我已經想通了如何使用嘉洛斯而不是爲滾動的一部分,但我怎麼能初始化圖像,而無需使用指針或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; 

出於某種原因沒有SetPixelDrawPixel像我預期,但FillRectangle將爲您填充1x1尺寸時執行完全相同的操作。

請注意,它可以很好地處理小圖像,但圖像越大,圖像越慢。

+1

嗯,OP提到不想使用SetPixel出於性能的原因,我認爲畫一個1x1的矩形不會更好 – gordy

+0

@Gordy對於256x256的圖像它仍然很好,需要一秒鐘左右 - 因爲OP接受了我認爲他妥協的答案效率。請注意,我不會每次創建新的「刷子」以避免混亂的內存。 –

1

如果你不想使用指針或SetPixel你就必須建立一個字節數組的梯度,然後Marshal.Copy到您的位圖:

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); 
}