如何使用图形绘制创建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的情况下初始化图像?
答案 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;
出于某种原因,我没有像我期望的那样SetPixel
或DrawPixel
,但当你给它填充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);
}