2009-07-28 4 views
0

Je construis un System.Drawing.Bitmap en code à partir d'un tableau d'octets, et je ne suis pas sûr quelles propriétés et telles doivent être définies pour qu'il soit correctement sauvegardé en tant que fichier .BMP. Je Bitmap b = new Bitmap(width, height, PixelFormat.Format32bppArgb); que mon constructeur etConstruire un bitmap à partir du code; quelles étapes sont nécessaires?

for (int i = 1; i < data.Length; i += 2;) 
    { 
     Color c = new Color(); 
     c.A = data[i]; 
     c.R = data[i]; 
     c.G = data[i]; 
     c.B = data[i]; 
     int x = (i + 1)/2; 
     int y = x/width; 
     x %= width; 
     b.SetPixel(x, y, c); 
    } 

que le code qui définit les données bitmap (il est lu à partir d'un tableau d'octets contenant les valeurs little'endian 16 bits et les convertir en niveaux de gris des pixels). Quoi d'autre devrait être fait pour rendre cette bitmap sauvable?

Répondre

1

Rien d'autre ne doit être fait, vous pouvez enregistrer le bitmap juste après avoir défini ses données d'image.

Notez également que la méthode utilisée SetPixel dans une boucle est tout à fait lente, see this link for more information.

+0

Je vais pour le code de travail plutôt que la vitesse pour le moment. Cela ressemble à la meilleure réponse, merci! – RCIX

0

(à partir de i=1 ressemble à un mauvais mouvement, BTW - devrait être 0?)

Que se passe lorsque vous essayez de l'enregistrer (b.Save("foo.bmp");)?

Aussi; Si c'est une grande image, vous pouvez regarder LockBits; un article associé est here (bien qu'il utilise un tableau rectangulaire et non un tableau à une dimension).

+0

On m'a conseillé de jeter l'octet supérieur de chaque valeur 16 bits lors de la conversion à une couleur, c'est pourquoi je commence à 1 et ajouter 2. Je n'ai pas tout à fait au point où je peux tester mais je travaille dessus. – RCIX

1

Une instance de la classe Bitmap peut être enregistré en tant que fichier .bmp simplement en appelant la méthode Save(string filename).

Comme mentionné dans d'autres réponses, le réglage des pixels un à la fois dans une boucle est un peu lent.

En outre, vous ne pouvez pas définir les propriétés d'un struct Color, vous devrez créer comme suit:

Color c = Color.FromArgb(data[i], data[i + 1], data[i + 2], data[i + 3]); 

(Je ne sais pas ce qui est dans vos données tableau [])

+0

J'ai depuis mis au point une autre méthode pour convertir mes données en valeurs int, merci quand même! – RCIX

0

Votre formule pour calculer les niveaux de gris n'est normalement pas celle utilisée. Certes, cela fonctionnera plutôt bien, mais vous voudrez probablement rester fidèle à la norme. L'œil étant plus réceptif à certaines couleurs (vert), vous utilisez généralement une autre pesée. Je définirais la couleur comme ceci;

c.R = 0.3 * data[i]; 
c.G = 0.59 * data[i]; 
c.B = 0.11 * data[i]; 
c.A = 1; 

Voir Wikipedia article on Grayscale pour plus d'informations