2008-10-02 4 views
6

Ich habe ein Objekt vom Typ System.Drawing.Image und möchte jedes Pixel, das eine bestimmte Farbe hat, zum Beispiel schwarz, transparent machen (also alpha auf 0 für dieses Pixel).Jedes Pixel eines Bildes mit einer bestimmten Farbe transparent machen

Was ist der beste Weg, dies zu tun?

+0

Ich habe eine sehr ähnliche Frage, und ich frage mich, ob Sie mir helfen könnten: http://stackoverflow.com/questions/1096165/transparent-winform-using-selective- Farben –

Antwort

6

Ein guter Ansatz besteht darin, die Klasse ImageAttributes zu verwenden, um eine Liste von Farben einzurichten, die beim Zeichnen neu zugeordnet werden sollen. Der Vorteil ist eine gute Leistung sowie eine sehr einfache Anpassung der Remapping-Farben. Probieren Sie etwas wie dieser Code ...

ImageAttributes attribs = new ImageAttributes(); 
List<ColorMap> colorMaps = new List<ColorMap>(); 
// 
// Remap black top be transparent 
ColorMap remap = new ColorMap(); 
remap.OldColor = Color.Black; 
remap.NewColor = Color.Transparent; 
colorMaps.Add(remap); 
// 
// ...add additional remapping entries here... 
// 
attribs.SetRemapTable(colorMaps.ToArray(), ColorAdjustType.Bitmap); 
context.Graphics.DrawImage(image, imageRect, 0, 0, 
          imageRect.Width, imageRect.Height, 
          GraphicsUnit.Pixel, attribs); 
2

Wissen Sie nur, dass es ein Bild ist? Wenn es sich um eine Bitmap handelt, können Sie LockBits aufrufen, jedes Pixel überprüfen und korrigieren und dann die Bits wieder entsperren.

3

Erstellen Sie eine Bitmap aus dem Image, und rufen Sie dann MakeTransparent() auf dieser Bitmap auf. Sie können eine Farbe angeben, die transparent dargestellt werden soll.

+0

MakeTransparent wird funktionieren, aber höchstwahrscheinlich möchten Sie eine Funktion schreiben, die das gleiche tut, aber mit einer Toleranz arbeitet. Dies ermöglicht eine flüssigere Mischung beim Compositing. – plinth

+0

Danke, dass ich MakeTransparent benutze, habe mich aber entschieden, Phil Wrights Antwort zu akzeptieren, weil sie allgemeiner ist und die meisten Stimmen bekommen hat. – leod