这会产生条纹而不是点。为什么?我正在尝试绘制单个像素。还尝试了另一种方法(使用fillrectangle),它也没有给出所需的结果,得到了条形而不是点。
protected override void OnPaint(PaintEventArgs pea )
{
Graphics g = pea.Graphics ;
for ( int y = 1 ; y <= Width ; y++ )
{
for ( int x = 1 ; x <= Height ; x++ )
{
System.Random rand = new System.Random() ;
Color c = (Color.FromArgb(rand.Next(256),
rand.Next(256),
rand.Next(256)));
// SolidBrush myBrush = new SolidBrush(c);
// g.FillRectangle(myBrush, x, y, 1, 1);
Bitmap pt = new Bitmap(1, 1);
pt.SetPixel(0, 0, c);
g.DrawImageUnscaled(pt, x, y);
}
}
}
这里发生了什么?
答案 0 :(得分:4)
您需要在循环外创建System.Random
对象。在循环内部初始化时,它会保持相同的种子(因为它是根据系统时钟初始化的,因为系统时钟仍具有相同的值),因此颜色相同。
答案 1 :(得分:4)
每次不都应创建一个新的Random
对象。因为那将为您提供完全相同的“随机”数字反复重复。
而是使用相同的Random对象,然后只需调用Next
。
答案 2 :(得分:1)
你可能会获得更好的里程数。例如将它绘制在屏幕外,然后立即将其全部绘制。
protected override void OnPaint(PaintEventArgs pea)
{
using (var b = new Bitmap(this.Width, this.Height))
{
using (var g = Graphics.FromImage(b))
{
var rand = new Random();
for (int x = 0; x <= Width; x++)
{
for (int y = 0; y <= Height; y++)
{
Color c = (Color.FromArgb(rand.Next(256),
rand.Next(256),
rand.Next(256)));
using (var newPen = new Pen(c, 1))
{
g.DrawRectangle(newPen, x, y, 0.5f, 0.5f);
}
}
}
}
pea.Graphics.DrawImage(b, 0, 0);
}
}
protected override void OnPaint(PaintEventArgs pea)
{
Graphics g = pea.Graphics;
var rand = new Random();
for (int x = 0; x <= Width; x++)
{
for (int y = 0; y <= Height; y++)
{
Color c = (Color.FromArgb(rand.Next(256),
rand.Next(256),
rand.Next(256)));
using (var newPen = new Pen(c, 1))
{
g.DrawRectangle(newPen, x, y, 0.5f, 0.5f);
}
}
}
}y
答案 3 :(得分:0)
您需要将System.Radom移动到循环之外。这里发生的是每次循环迭代时你都在创建相同的随机点。如果你添加使用系统;到程序的开头比你可以简单地说随机(但这不重要只是一个侧面说明)。创建Random后,只需在对象上调用Next即可获得下一个数字。试试这个,我相信它可以解决你的问题!
答案 4 :(得分:0)
您正在矩形0,0,宽度,高度的每个像素上绘制一个不同的彩色圆点。但是,由于之前的答案是因为随机在每个循环中被初始化为系统时钟,所以循环绘制相同的颜色,给你一条相同颜色的条纹(水平?),直到系统时钟在一点点上滴答并给你一个不同的种子。
如果你将System.Random移动到循环外面,那么每个Next都会得到不同的颜色,那么你会看到点。