[Java] Invertierung einer RGB Farbe

Crageth

Ensign
Registriert
Sep. 2014
Beiträge
139
Hey Leute, ich bin noch ein Frischling in Java, ich habe jetzt im Studium das erste mal damit gearbeitet. Mein Prof möchte sehr leichte (und für viele Studenten umständlichere) Lösungsansätze, mit denen ich schon mehr als einmal zu knacken hatte, weil es einfach nicht in meinen Denkfluss passt.


Folgende Sache:
Wir bekommen eine neunstellige Zahl, die RRRGGGBBB aufgebaut ist, also die RGB-Farben direkt hintereinander aufgelistet sind.

Die Zahlen durch einfaches Rechnen voneinander zu trennen ist vorgegeben. Danach Möchte ich die Zahl invertieren, indem ich den Maximalwert von 255 von der einzelnen Zahl abziehe und zum Schluss die Zahlen wieder zu RRRGGGBBB zusammensetze.

Die Sache ist, dass bei der Zahl (10, 128, 255) Hinterher die Zahl (245, 127, 0) als Ergebnis (und im RRRGGGBBB Format) ausgegeben werden sollte. Mein Ergebnis schießt aber über die 255 hinaus und gibt mir 244871000 aus.

Ich gehe davon aus, dass es ein einfaches mathematisches Problem ist, allerdings bin ich gerade zu blind, um es zu finden.


Der Code. In der Hoffnung, dass ich Pastebin richtig genutzt habe ^^

http://pastebin.com/ccGJ4rjv
 
Da dein Problem bei der ersten Farbe nicht auftritt und beide restlichen Farben Probleme machen behaupte ich deine Zahlentrennung am Anfang ist die Fehlerstelle.
Bitte schau dir die Java Modulo Division für dein Problem der Trennung an.
 
Die Sache ist, wenn ich die Rechnung in den Taschenrechner übersetze, dann komm ich auf die Zahlen. Und macht es einen so großen Unterschied (welchen ich gerade eindeutig nicht sehe) ob ich Modulo benutze oder die Zahlen einfach voneinander subtrahiere?
 
Debugge doch einfach.

Wieso übergibst du einen "int"?
Mach einen String daraus, dann kannst du sehr einfach splitten. Den Teilstring wandelst du dann in eine Zahl um und subtrahierst sie von 255. Danach kannst du wieder einen String aus allen drei Zahlen basteln.

PS: wenn es unbedingt ein "int" sein muss, dann wandel die Zahl in der Methode "invertiere()" in einen String um.
 
Zuletzt bearbeitet:
Code:
int blue = farbe - (red * 1000000 - green * 1000);

Entweder musst du das zweite Minus durch ein Plus ersetzen oder die Klammern weglassen.
 
Zuletzt bearbeitet:
Die Sache ist, dass es ja eigentlich keinen Fehler gibt, ich bekomme Zahlen, nur eben eine Falsche, wobei ich einfach nicht hintersteige, warum das der Fall ist.
Wir sollen int-Werte benutzen, das ist einer diese schrägen Ansätze, die der Prof von uns verlangt. Wir hatten bereits Aufgaben, die mit anderen Datentypen oder Funktionen leichter gewesen wären, aber was soll man machen.
Ergänzung ()

OH MEIN GOTT! Diese verdammten Klammern. Nie denke ich daran, dass der Fehler an den Klammern liegen könnte!
Ich danke dir, hat geklappt
 
Lerne zu debuggen... Rechnungen in mehrere Zeilen aufteilen, Schritt für Schritt durchgehen und Zwischenergebnisse anschauen.
 
Dein Ansatz ist der Falsche: RGBA = Int32.

Du musst jede einzelne Farbkomponente per Bit-SHIFT extrahieren,
dann kannst du jede einzelne komponente invertieren und
dann wieder mit Bit-OR zusammenbauen und dann als RGBA zurückschreiben.

Beachte das beim auslesen pro Farbkomponente ein Int32 rauskommt, du aber nur die ersten 8 Bits haben willst -> Bit-Maske.
 
Zuletzt bearbeitet:
Zurück
Oben