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 ??
7 Réponses :
Color.FromArgb(intVal)
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
Vous recherchez peut-être le ColorTranslator Classe a >, 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. P>
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à). P>
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. .
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 :)
Utilisation du réflecteur J'ai trouvé comment R, G, B est analysé dans l'appel de la norme .NET (non disponible en Silverlight): à partir de celui que j'ai deviné comment obtenir le canal alpha De plus, et cela fait le travail: p>
Qu'est-ce qui n'a pas été couvert est que 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> 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.
r = (byte)(r * (255d / alpha))
Color c = colorAsInt.ToColor()
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; }