10
votes

Conversion de Int à la couleur en C # pour Silverlight's WritereBitmap

Dans Silverlight 3, il existe maintenant un wri manedicbitmap qui fournit des capacités de pixel get / mettre des pixels. Cela peut être fait comme si:

// getting a pixel example
int colorAsInt = bitmap.Pixels[0];
Color c;
// TODO:: fill in the color c from the integer ??


0 commentaires

7 Réponses :


-1
votes
Color.FromArgb(intVal)

1 commentaires

Pour clarifier, il n'y a pas de méthode de DieRgB (int) en Silverlight .. Seulement FromArgB (octets, octets, octets, octets) - qui fait partie de mon problème



0
votes

Vous recherchez peut-être le ColorTranslator Classe , mais je ne suis pas sûr qu'il soit disponible à Silverlight ou à ce dont vous avez besoin. C'est absolument un bon à être conscient de cependant.

EDIT: Voici la suggestion d'une personne (utilisez la réflexion pour dupliquer la classe, Donc, à partir de là, vous avez un convertisseur disponible que les gens connaissent déjà).


1 commentaires

Bonne suggestion sur l'utilisation du réflecteur .. Cela m'a eu à lire où je pouvais lire les valeurs R, G, B et, après un peu plus de piratage, j'ai aussi un analysement alpha. J'ai ajouté une réponse avec elle en utilisant uniquement un débit. .



4
votes

3 commentaires

La deuxième suggestion ici fonctionne bien, mais les bits sont en arrière, cela fonctionne: couleur.fromargb (octets [3], octets [1], octets [0], octets [0]);


Cela serait horriblement (inacceptable) lent pour fonctionner sur les pixels d'un bitmap.


Oups - Mise à jour de l'exemple en conséquence. Merci d'avoir attrapé ça :)



7
votes

Utilisation du réflecteur J'ai trouvé comment R, G, B est analysé dans l'appel de la norme .NET (non disponible en Silverlight): xxx

à partir de celui que j'ai deviné comment obtenir le canal alpha De plus, et cela fait le travail: xxx


0 commentaires

2
votes

Qu'est-ce qui n'a pas été couvert est que wriceedicbitmap code> utilise PremRUltiPlied em> strong> argb32, donc si vous avez un pixel semitransparent les valeurs R, g et B sont à l'échelle de 0 à la valeur alpha.

Pour récupérer la valeur de couleur, vous devez faire le contraire et l'échelle de l'échelle de 0 à 255. Quelque chose comme indiqué ci-dessous. P>

r = (byte)(r * (255d / alpha))


0 commentaires

0
votes
Color c = colorAsInt.ToColor()

0 commentaires

0
votes

Je pense que quelque chose comme ça devrait fonctionner:

public byte[] GetPixelBytes(WriteableBitmap bitmap)
{
   int[] pixels = bitmap.Pixels;
   int length = pixels.Length * 4;
   byte[] result = new byte[length]; // ARGB
   Buffer.BlockCopy(pixels, 0, result, 0, length);
   return result;
}


0 commentaires