2009-07-15 4 views
10

In Silverlight 3 gibt es jetzt eine WriteableBitmap, die Get/Put-Pixel-Fähigkeiten bietet. Dies kann etwa so erfolgen:Konvertieren von Int in Farbe in C# für Silverlight WriteableBitmap

// setting a pixel example 
WriteableBitmap bitmap = new WriteableBitmap(400, 200); 
Color c = Colors.Purple; 
bitmap.Pixels[0] = c.A << 24 | c.R << 16 | c.G << 8 | c.B; 

Grundsätzlich eine Pixeleinstellung beinhaltet seine Farbeinstellung, und das kommt durch bitshifting die alpha, rot, blau, grün Werte in eine ganze Zahl.

Meine Frage ist, wie würden Sie eine ganze Zahl zurück zu einer Farbe machen? Was in diesem Beispiel in der fehlenden Stelle geht:

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

Vielen Dank für jede Hilfe, die Sie haben könnten, ich bin gerade nicht auf meiner Bitverschiebung und ich bin sicher, dass andere in diese Hürde zu einem bestimmten Zeitpunkt ausgeführt werden.

Antwort

0
Color.FromArgb(intVal) 
+3

zu klären, gibt es keine FromArgb (int) -Methode in Silverlight .. nur FromArgb (Byte, Byte, Byte, Byte) - das ist ein Teil meines Problems – SmartyP

0

Sie könnten für die ColorTranslator class suchen, aber ich bin nicht sicher, ob es in Silverlight verfügbar ist oder was Sie brauchen. Es ist absolut ein guter zu beachten.

Edit: Here was one person's suggestion (Reflektion verwenden, um die Klasse zu duplizieren, so dass Sie von nun an einen Konverter zur Verfügung haben, den die Leute bereits kennen).

+0

guten Vorschlag zur Verwendung des Reflektors .. es hat mich zu wo Ich konnte die R, G, B Werte lesen, und nach ein bisschen mehr Hacking bekam ich auch das Alpha Parsing. Ich fügte eine Antwort hinzu mit nur Bit Shifting .. – SmartyP

4

Sie möglicherweise BitConverter.GetBytes() konvertieren Sie Ihre int in ein Byte-Array, das mit den Überlastungen von FromArgb funktionieren würde, das hat Silverlight verwenden könnte ...

Color.FromArgb(BitConverter.GetBytes(intVal)); 

// or if that doesn't work 
var bytes = BitConverter.GetBytes(intVal); 
Color.FromArgb(bytes[3], bytes[2], bytes[1], bytes[0]); 
+0

der zweite Vorschlag hier funktioniert super, aber die Bits sind rückwärts funktioniert das: Farbe.FromArgb (Bytes [3], Bytes [2], Bytes [1], Bytes [0]); – SmartyP

+0

Dies wäre schrecklich (inakzeptabel) langsam für den Betrieb auf den Pixeln einer Bitmap. –

+0

oops - aktualisiert das Beispiel entsprechend. Danke fürs Fangen :) –

7

den Reflektor i gefunden, wie R, G, B sind in der Norm .net Aufruf (nicht verfügbar in Silverlight) analysiert:

System.Drawing.ColorTranslator.FromWin32() 

aus, dass ich vermuten, wie den alpha-Kanal als auch zu bekommen, und dies macht den Job:

Color c2 = Color.FromArgb((byte)((colorAsInt >> 0x18) & 0xff), 
          (byte)((colorAsInt >> 0x10) & 0xff), 
          (byte)((colorAsInt >> 8) & 0xff), 
          (byte)(colorAsInt & 0xff)); 
2

Abgedeckte wurde nicht ist, dass WriteableBitmap verwendet Premultiplied ARGB32 Wenn Sie also eine halbtransparente Pixel die R haben, G- und B-Werte von 0 auf den Alpha-Wert skaliert.

Um den Farbwert zurück zu bekommen, müssen Sie das Gegenteil tun und es auf 0 bis 255 zurück skalieren. Etwas wie unten gezeigt.

r = (byte)(r * (255d/alpha)) 
0
public static Color ToColor(this uint argb) 
{ 
    return Color.FromArgb((byte)((argb & -16777216) >> 0x18), 
          (byte)((argb & 0xff0000) >> 0x10), 
          (byte)((argb & 0xff00) >> 8), 
          (byte)(argb & 0xff)); 
} 

und mit:

Color c = colorAsInt.ToColor() 
0

Ich denke, so etwas wie dies funktionieren soll:

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; 
} 

Sobald Sie den Bytes haben, Farben bekommen ist einfach mit einem der verschiedenen Farb-APIs