如何绘制图像?

时间:2011-07-10 07:23:33

标签: c# winforms image drawing

如何使用图形绘制创建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 :(得分:3)

首先,将PictureBox控件添加到Form。

然后,此代码将根据循环中的索引为每个像素分配不同的颜色,并将图像分配给控件:

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,但当你给它填充1x1尺寸时,FillRectangle会做同样的事情。

请注意,对于小图像,它可以正常工作,但图像越大,图像越小。

答案 1 :(得分: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);

答案 2 :(得分:0)

这将为您创建256x256的白色图像

Bitmap image = new Bitmap(256, 256);
using (Graphics g = Graphics.FromImage(image)){
    g.FillRectangle(Brushes.White, 0, 0, 256, 256);
}