Tirage couleur à chaque pixel dans picturebox
Quelqu'un peut m'aider: je tiens à attirer les couleurs de chaque pixel pour un contrôle picturebox
C'est ce que j'ai fait jusqu'à présent:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication25
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
int x, y;
for (y = 0; y < 200; y++)
{
for (x = 0; x < 200; x++)
{
((Bitmap)pictureBox1.Image).SetPixel(x, y, Color.FromArgb(255, 255, 0));
}
}
}
}
}
J'ai ajouté une Minuterie afin que je puisse voir le progrès dans l'élaboration de chaque pixel.
Le problème le code de dessiner dans la mémoire - retard - puis mettez-les dans la zone d'image
Je veux dessiner chaque couleur y = 0 et x = 0 à 200 , y =1 x = 0 à 200, y=2 x=0 à 200 etc
- Une solution simple est de trois boucles imbriquées pour générer la portée de toutes les valeurs possibles. Il est O(n^3), mais 8 millions d'itérations n'est pas trop mauvais.
- n'avait-il possible?
- Il est en effet possible de générer toutes les couleurs entre (R,B,G) = (0..200, 0..200, 0..200). J'ai suggéré une façon que vous pouvez faire.
Vous devez vous connecter pour publier un commentaire.
À chaque fois que votre minuterie tiques que vous voulez dessiner un autre pixel avec une (autre?) de la couleur, non?
Ce que vous devez faire est de déclarer actuelle coordonnées x et y à l'extérieur de timer1_Tick de méthode et d'augmenter leur valeur en conséquence chaque fois que vous dessinez quelque chose.
De voir immédiatement le résultat, vous devez également appeler pictureBox1.Refresh() à l'intérieur de timer1_Tick().
Voici ma solution rapide pour dessiner 200x200 bitmap avec un motif similaire à ceci:
Tous les 24 bits de couleurs RVB.
Vous pouvez modifier les couleurs produites par le calcul de currentX, currentY et partWidth.
Remarque: je suppose que vous dessinez un carré bitmap. Dessin d'un rectangle aurait besoin d'un peu plus de travail. La même chose s'applique à différentes tailles.
Votre code définit chaque pixel de la même couleur.
Si, comme vous l'avez écrit vous voulez regarder de toutes les couleurs est en cours d'être peint, vous devez effectuer deux modifications:
(Espace couleur RVB est 256x256x256)
Voici un exemple:
Note qu'il utilise un
Form
niveau variable pour la valeur de bleu et l'incrémente dans leTick
événement.Cela attirera chaque pixel d'une couleur différente pour une valeur de Bleu et va se répéter sur toutes les valeurs pour le bleu. Ainsi, après 256 itération vous ai jamais vu de couleur RVB, il est.
Si vous voulez regarder chaque pixel en cours de jeu, vous devez déplacer x et y pour le niveau de forme et d'un incrément dans le
Tick
comme ceci:au lieu de la double boucle. Pour que cela fonctionne, vous besoin pour déplacer le
ligne, par exemple, aux
Form
constructeur ou leForm_Load
événement!Il fonctionne, mais ça va être lent 😉
De réutiliser le
Bitmap
il suffit de créer à l'extérieur de laTick
, peut-être dans le constructeur!Si au contraire, vous voulez tous les pixels ont la même
Color
vous ne devez pas définir les pixels un par un. Au lieu de cela, vous pouvez créer unGraphics
pour laBitmap
et de l'utiliser pourClear
tous les pixels d'une Couleur:Ou vous pouvez simplement dessiner à la surface de contrôle:
Ce serait la manière la plus rapide, sauf que, bien sûr, la Tique va vraiment déterminer la vitesse, à moins que vous agrandir la taille du contrôle d'un lot..
Noter la Couleur de l'espace est un espace 3D, donc il n'est pas évident de trouver un chemin pour passer par toutes les couleurs de la plus belle façon..
La petite note finale: Si votre
PictureBox
a unBorder
vous devez définir laImage
à l' (intérieure)CientSize
de ne pas le (externe)Size
!