Ваш код устанавливает каждый пиксель в один цвет.
Если, как вы написали вы хотите смотреть каждый цвет в настоящее время краситься вы должны сделать два изменения:
- Сделать PictureBox достаточно большой, то есть 256х256 пикселей внутри (цветовое пространство RGB является 256x256x256)
- Draw каждый пиксель с другим цветом
Вот пример:
int blue = 0;
private void timer1_Tick(object sender, EventArgs e)
{
// either dispose of the old Bitmap or simply reuse it!
if (pictureBox1.Image != null) pictureBox1.Image.Dispose();
pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
int x, y;
blue = (blue+1) % 256;
Text = blue + "";
for (y = 0; y < 256; y++)
{
for (x = 0; x < 256; x++)
{
((Bitmap)pictureBox1.Image).SetPixel(x, y, Color.FromArgb(y, x, blue));
}
}
pictureBox1.Refresh();
}
Обратите внимание, что используется переменная уровня Form
для синего значения и увеличивает ее в событии Tick
.
Это будет рисовать каждый пиксель другого цвета для одного значения синего и будет перебирать все значения для синего. Таким образом, после 256 итераций вы увидите когда-либо цвет RGB.
Если вы хотите смотреть каждый пиксель набор, вы бы переместить х и у, чтобы сформировать уровень и увеличивать их в Tick
, как это:
x = x + 1;
if (x >= 256) { x = 0; y = y + 1;}
if (y >= 256) { y = 0; x = 0; blue = blue + 1;}
((Bitmap)pictureBox1.Image).SetPixel(x, y, Color.FromArgb(x, y, blue));
вместо двойной петли. Для этой работы вам необходимо , чтобы переместить линию
pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
до, например, конструктор Form
или событие !
Это будет работать, но он будет медленным ;-)
Чтобы повторно использовать Bitmap
просто создать его за пределами Tick
, может быть в конструкторе!
Если вы хотите, чтобы все пиксели имели одинаковые Color
, вы не должны устанавливать пиксели один за другим.Вместо этого вы можете создать Graphics
для Bitmap
и использовать его для Clear
все пиксели одного цвета:
int argb = 255 << 24; // we want to start with fully opaque colors!
private void timer1_Tick(object sender, EventArgs e)
{
// I have move the Bitmap creation to the Form contructor
argb += 1;
using (Graphics G = Graphics.FromImage(pictureBox1.Image))
{
G.Clear(Color.FromArgb(argb));
}
pictureBox1.Refresh();
Или вы могли бы просто нарисовать на поверхности управления:
private void timer1_Tick(object sender, EventArgs e)
{
pictureBox1.Invalidate();
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
argb += 1;
e.Graphics.Clear(Color.FromArgb(argb));
}
Это будет самый быстрый, за исключением того, что, конечно, Tick действительно определит скорость, если вы не увеличите размер элемента управления.
Примечание. Цветовое пространство представляет собой трехмерное пространство, поэтому нет очевидного пути прохождения каждого цвета в низах т способ ..
Малого Заключительное примечание: Если PictureBox
имеет Border
вы должны установить Image
к (внутренний) CientSize
не к (внешнему) Size
!
Size cs = pictureBox1.ClientSize;
pictureBox1.Image = new Bitmap(cs.Width, cs.Height);
Простым решением является три вложенных цикла для генерации диапазона всех возможных значений. Это O (n^3), но 8 миллионов итераций не так уж плохи. – jdphenix
сделал это? – usr6969
На самом деле можно генерировать каждый цвет между (R, B, G) = (0,200, 0,200, 0,200). Я предложил один из способов сделать это. – jdphenix