Farbe-ersetzen-in XNA C#
Lade ich meine Texturen mit
Texture2D.FromFile()
dann ziehen Sie Sie mit
spriteBatch.Draw()
Aber hier ist der Punkt: ich möchte ändern einige Farben des Bildes in einen anderen lieben. Also meine Fragen:
- So ändern Sie eine einzige Farbe, die das Bild auf eine andere einzelne Farbe (zB. blau und rot).
- In der Tat, was ich wirklich tun möchten, ist ändern der Gruppe von Farben, um eine andere Gruppe von Farben. Zum Beispiel rot und ähnlichen Farbtönen rot, blau und ähnlichen Farbtönen blau. Sie können dies tun, zum Beispiel in Corel PHOTO-PAINT ("Farbe Ersetzen").
Bitte beachten Sie, dass ich bin ein Anfänger in XNA.
Beste Grüße,
Jack
EDIT:
Vielen Dank für die Hilfe, Jungs. Callum Antwort ist sehr hilfreich in der Tat. Aber ich Frage mich, gibt es eine integrierte Funktion zum lösen meinem zweiten problem, weil das schreiben Ihre eigenen zeitaufwändig sein kann. Und ich denke, diese Art von Funktion kann sehr nützlich sein. So etwas wie:
color.SetNewColor(Color color_from, Color color_to, int range)
Diese Art von Funktion, wie ich vorher gesagt habe, ist gebaut in Corel PHOTO-PAINT. Um das besser zu erklären, hier ist ein Beispiel von was ich spreche:
So, ich nur color_from, color_to und Reichweite. Ich denke, es funktioniert so: Sie prüft jede Farbe des Bildes, wenn es in Reichweite von color_from, es wird geändert, um ausreichend Farbe im Farbton der color_to.
InformationsquelleAutor Jack | 2010-07-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nehme an, du meinst ändern einzelner Pixel? In diesem Fall benutzen Sie die
GetData()
undSetData()
Methoden derTexture2D
Klasse.Beispielsweise können Sie ein array mit den Farben der einzelnen Pixel an, um dies zu tun:
Hinweis Sie können die anderen überladungen von
GetData()
wählen Sie nur einen Abschnitt.So, Sie zu ersetzen jedes pixel einer bestimmten Farbe zu einer anderen Farbe:
Sehen, wenn die Farben ähnlich sind, versuchen Sie diese Methode:
wo *delta ist die Toleranz der Veränderung für jede Farbe Kanal, den Sie annehmen möchten.
Zur Beantwortung Ihrer Bearbeiten, Nein, es ist eine integrierte Funktion, aber Sie können einfach verwenden Sie eine Mischung von Ideen aus den beiden vorangegangenen Abschnitten:
InformationsquelleAutor Callum Rogers
Verschieben von Daten zwischen der GPU und CPU durch die Verwendung von GetData-und SetData-Methode ist ein teurer Vorgang. Wenn es gibt eine begrenzte Anzahl von Farben, könnte man eine pixel-shader-Effekt bei der Wiedergabe auf dem Bildschirm. Übergeben Sie einen Effekt auf SpriteBatch.Beginn:
Erstellen Sie Ihre Wirkung in Ihrer Methode LoadContent:
Und übergeben Sie die Wirkung auf Ihren Anruf, um SpriteBatch.Begin():
Für das, was Sie wirklich tun möchten, können Sie tauschen die roten und blauen Kanäle ist noch leichter. Ändern Sie Ihre pixel-shader, der main () - Funktion, was swaps b (blau) und r (rot):
InformationsquelleAutor Jason Goemaat
Callum Lösung ist leistungsfähig und flexibel.
Eine begrenzte Lösung, die ist etwas einfacher zu implementieren, ist die Nutzung der spriteBatch color-parameter.
Den Variablen
Die Zeichnung code
Wenn Ihr sprite ist alle weiß, dann wird die Verwendung dieser Methode schalten Sie Ihr sprite red. Auch, stellen Sie sicher, Sie verwenden ein Dateiformat, Transparenz, PNG ist ein Favorit.
InformationsquelleAutor Error 454
Callum trifft es auf den Kopf, wenn Sie das ändern der Farbe von 2D-Bildern, wie es scheint, sind Sie - aber wie Sie sehen können, die Sie benötigen, um zu bestimmen, die tatsächlichen pixel, die Sie ändern möchten, und Bearbeiten Sie Sie, anstatt Sie zu "ersetzen Sie gelb mit grün" zum Beispiel.
Der gleichen Logik könnte verwendet werden, um dies zu tun Ersatz (einfach eine Schleife über die Pixel des Bilds und überprüfen Sie die Farbe - ich kann nur sagen, seien Sie vorsichtig beim Bearbeiten von Texturen wie dieses aber, wie Sie schien, dass einige ziemlich schwere spikes in der Leistung je nachdem, was gemacht wurde und wie oft. Ich habe nicht vollständig zu untersuchen, aber ich denke, es war zu Recht ein bisschen garbage collection.
Color[]
- arrays zugewiesen und die zugeordneten Daten auf. Schaffen Sie Abhilfe, indem Sie Ihre eigene Art, die speichert die aktuelleColor[]
Daten-array und der textur ist es aus und dann ändern Sie einfach den array dann mitSetData()
jeder Zeit - es ist spürbar schneller, aber kommt auf Kosten von mehr Arbeitsspeicher benötigt.InformationsquelleAutor David Larrabee
diese funktioniert bei mir:
InformationsquelleAutor Igor Monteiro