如何绘制图像

本文关键字:图像 绘制 何绘制 | 更新日期: 2023-09-27 18:01:51

如何使用图形绘制创建256x256色空间图像?目前,我正在使用指针来循环每个像素位置并设置它。蓝色从0开始…X上的255和Green从0开始…

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初始化图像?

如何绘制图像

首先,将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维度填充。

请注意,它可以很好地处理小图像,但图像越大,速度就越慢。

如果你不想使用指针或SetPixel,你将不得不在字节数组中构建梯度,然后Marshal。复制到你的位图:

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

这将创建一个256x256的白色图像

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