Negative float Werte?

Diskutiere Negative float Werte? im Java Basics - Anfänger-Themen Bereich.
A

abc66

Weiß jemand, wieso
Java:
float f = (float) b.getRGB(j, i) / (float) 0xFFFFFF;
immer negative Werte liefert? Die Werte sollen zwischen 0 und 1 sein
 
L

LimDul

Kleiner Tipp: Bennen deine Variablen mal vernünftig, dann muss man nicht nachfragen. Ein Buchstabige Variablen sind eigentlich ein No-Go außer für Schleifenzähle oder sowas wie x/y Koordinaten.

Zwei Probleme: a) Der Alphakanal kommt mit
b) Es wird nicht als int geliefert, sondern als Binarzahl - die nach Int konvertiert wird. Und da der int signed ist, aber ggf. alle Bits verwendet wird (spätestens mit Alphakanal) können auch negative Zahlen rauskommen.
 
A

abc66

Geht
float f = (float) (b.getRGB(j, i)>>>8) / (float) 0xFFFFFF; ?
Um den Alpha-Kanal zu ignorieren?

@LimDul sorry wenn du kein Java kannst.
 
L

LimDul

@LimDul sorry wenn du kein Java kannst.
Das hat damit nix zu tun.

This is a problem with single-letter variable names. Certainly a loop counter may be
named i or j or k (though never l!) if its scope is very small and no other names can conflict
with it. This is because those single-letter names for loop counters are traditional.
However, in most other contexts a single-letter name is a poor choice; it’s just a place
holder that the reader must mentally map to the actual concept. There can be no worse reason
for using the name c than because a and b were already taken.
In general programmers are pretty smart people. Smart people sometimes like to show
off their smarts by demonstrating their mental juggling abilities. After all, if you can reliably
remember that r is the lower-cased version of the url with the host and scheme
removed, then you must clearly be very smart.
One difference between a smart programmer and a professional programmer is that
the professional understands that clarity is king. Professionals use their powers for good
and write code that others can understand.
Darfst gerne mal suchen, wo das Zitat her stammt :)
 
A

abc66

and write code that others can understand
Man kann keinen Code schreiben, den alle verstehen können. Das würde voraussetzen, dass es keine dummen Menschen gibt.

Mein Oma würde zum Beispiel b.getRGB(j, i); auch nicht dann verstehen, wenn dort bufferedImage.getRGB(j, i); stünde.

Hingegen kann man mit etwas Erfahrung kürzere Variablennamen schneller lesen; das ist einfach die logische Konklusion, da diese kürzer sind, also weniger Buchstaben beinhalten...

So und jetzt nochmal zur Frage zurück... Wie tilge ich den Alphakanal-Wert?
 
mrBrown

mrBrown

Das würde voraussetzen, dass es keine dummen Menschen gibt.
"dumme Menschen", die zB das Javadoc zu benutzen Funktionen nicht lesen oder nicht verstehen? ;)

Mein Oma würde zum Beispiel b.getRGB(j, i); auch nicht dann verstehen, wenn dort bufferedImage.getRGB(j, i); stünde.
Wenn deine Oma Englisch-Sprachig ist und die Domäne kennt, versteht sie "imageWithBird.getRGB(x, y)" sicherlich besser als "b.getRGB(j, i)".

Vielleicht zählst du deine Oma aber auch zu "dummen Menschen" und traust ihr nichts zu.

Hingegen kann man mit etwas Erfahrung kürzere Variablennamen schneller lesen; das ist einfach die logische Konklusion, da diese kürzer sind, also weniger Buchstaben beinhalten...
Ja, "b" kann man schneller lesen als "bufferedImage", schneller verstehen aber nicht.

Den meisten Menschen ist verstehen wichtiger als schnelles lesen.

So und jetzt nochmal zur Frage zurück... Wie tilge ich den Alphakanal-Wert?
argb & 0x00FFFFFF, sinnvoller ist aber vermutlich anderes, kommt drauf an was du machen möchtest.
 
Zuletzt bearbeitet:
A

abc66

Ergibt noch keinen Sinn. Wenn ich den Alphakanalwert tilge und durch 0xffffff teile, erhalte ich Werte zwischen 1.0 und 0.9...

Hier mit:
Code:
	static float getFloatColor(int rgb) {
		// int alpha = (rgb >> 24) & 0xff;
		int red = (rgb >> 16) & 0xff;
		int green = (rgb >> 8) & 0xff;
		int blue = (rgb >> 0) & 0xff;
		float[] f = new float[3];
		Color.RGBtoHSB(red, green, blue, f);
		return f[0];
	}
erhalte ich Werte zwischen 0.0 und 0.09...

In beiden Fällen liegen alle float Werte also nah beieinander.

kommt drauf an was du machen möchtest
Für einen Bildpunkt einen hash (zwischen 0 und 1) erstellen, wobei Schwarz und Weiß möglichst unterschiedliche hashes ergeben sollen.
 
A

abc66

Also vorerst mal so...
Java:
	static float getFloatColor(int rgb) {
		// int alpha = (rgb >> 24) & 0xff;
		int r = (rgb >> 16) & 0xff;
		int g = (rgb >> 8) & 0xff;
		int b = (rgb >> 0) & 0xff;

		// Normalize and gamma correct:
		double rr = Math.pow(r / 255.0, 2.2);
		double gg = Math.pow(g / 255.0, 2.2);
		double bb = Math.pow(b / 255.0, 2.2);

		// Calculate luminance:
		double lum = 0.2126 * rr + 0.7152 * gg + 0.0722 * bb;

		// Gamma compand and rescale to byte range:
		float grayLevel = (float) Math.pow(lum, 1.0 / 2.2);

		return grayLevel;
	}
 
Thema: 

Negative float Werte?

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben