如何绘制图像
本文关键字:图像 绘制 何绘制 | 更新日期: 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;
由于某种原因,没有SetPixel
或DrawPixel
像我期望的那样,但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);
}