# int-berechnung des RGB-Wertes ohne neue Instanz?



## supersimsonfahrer (29. Nov 2005)

Servus...

Gibt es ne möglichkeit, den Int-Wert des RGB-Wertes ohne eine neue Instanz der color-Klasse zu berechnen?

```
int a =(new Color(255,128,64).getRGB());
```

ich hab ein feld mit 10.000Werten
und das wird dann in einer rekursion ausgeführt
Meine befürchtung ist, dass mir der RAM zugemüllt wird[/code]


----------



## SnooP (29. Nov 2005)

kommt bei dir oben zufällig das raus? 8372256...

in der Spezifikation steht ja drin, wie sich dieser rgb-wert berechnet, dabei müsstest du lediglich die drei byte-werte der Farben an die richtige Stelle schubsen (rot << 16,...) in der int-variablen... dann bekommst du den int-value den du haben möchtest. Allerdings weiß ich nicht, ob du jetzt noch irgendnen speziellen alphakanal haben möchtest, bzw. wie der aussieht normalerweise bei nem color-objekt... z.B. ob da dann 0en oder 1en stehen bei Bit 24-31


----------



## Supersimsonfahrer (29. Nov 2005)

ne, bei mir kommt leider -32704 raus


----------



## Ilja (29. Nov 2005)

da du auf das Color-Objekt keinen Verweis hat, wird es vom GC beim nächsten durchgang freigegeben... mach dir also darum keine sorgen...
... kannst ja am ende der rekursion den GC manuel auslösen, um sicher zu gehen, dass der speicher dann bereits frei ist...

wenn du dir das Color.java anguckst, dann siehste, wie es umgerechnet wird 

PS: der speicherbedarf (falls ALLE 10.000 Color-Objekte im Speicher bleiben):
objektverweis = 32bit (4byte)
long pData = 64bit (8byte)
int value = 32bit (4byte)
2x float array[3] = 2*96bit = (12byte)
float alpha = 32bit (4byte)
ColorSpace mit 2x int = 2x32bit (8byte)
----------
= ~40byte pro new Color()
(statische variablen und objekte sind zu vernachlässigen...)

40byte * 10.000 ~ 400kb

dein speicher wirds überstehen!


----------



## SnooP (29. Nov 2005)

okay... -32704 ist aber genau das, was ich vermutet hatte:
11111111111111111000000001000000
mit der Einschränkung, dass die 8 Bit für den Alphakanal auf 1 gesetzt werden...

also machs doch einfach so: 

```
public static int intRGBValue(int r, int g, int b) {
		//Mit leerem Alphakanal (Bit 24..31 = 255)
		return (255 << 24) | (r << 16) | (g << 8) | b;
	}
```


----------



## Supersimsonfahrer (30. Nov 2005)

Super
genau das hab ich gebraucht

thx an alle beteiligten


----------



## Slava (30. Nov 2005)

in documentation steht



> public Color(int rgb)
> Creates an opaque sRGB color with the specified combined RGB value consisting of the red component in bits 16-23, the green component in bits 8-15, and the blue component in bits 0-7. The actual color used in rendering depends on finding the best match given the color space available for a particular output device. Alpha is defaulted to 255.


mach bestes daraus


----------



## Slava (30. Nov 2005)

original code von Color

```
public class Color extends......{
.....
int value;

    public Color(int rgb) {
        value = 0xff000000 | rgb;
    }

public int getRGB() {
	return value;
    }

public int getRed() {
	return (getRGB() >> 16) & 0xFF;
    }
  public int getGreen() {
	return (getRGB() >> 8) & 0xFF;
    }
public int getBlue() {
	return (getRGB() >> 0) & 0xFF;
    }
 public int getAlpha() {
        return (getRGB() >> 24) & 0xff;
    }
........
}
```


----------



## Mag1c (30. Nov 2005)

Schön, und ?

das Problem ist doch längst gelöst  ???:L 

Gruß
Mag1c


----------



## SnooP (30. Nov 2005)

statt meiner 255 kann man übrigens leetigerweise auch 0xFF schreiben


----------

