# Image-Pixel manipulieren



## CAYAMIDES (2. Nov 2004)

MOIN!

wie kann ich den farbwert eines Pixels in einem Image auslesen oder verändern?

mit dem normalen Image-object geht das scheinbar nicht.
mit dem Buffered Image wärs zwar möglich, 
aber ich weiß nich wie ich jetzt das image in das buffered Image bekomme... 

soweit bin ich:

Ich nehme an das Bufferes Image muss die selben eigenschaften haben wie das Image (größe, auflösung ect.),
also erzeuge ich mir ein Image und ein Buffered Image Object.

dann ein Graphics2D object erzeugen und mit der Buffered Image verknüpfen:

```
Graphics2D  my2D = myBuffImg.createGraphics();
```
und das normale Image in das Graphics2D -object zeichnen:

```
my2D.drawImage(myImg,0,0,null);
```


nun müsste (nehme ich an...) meine Image in der Buffered Image stehen,
und ich kann die Pixel Farbwerte auslesen, mit zb. :

```
myBuffImg.getRGB(posX,posY);  //liefert int RGB
```

Color myCol = new Color( myBuffImg.getRGB(posX,posY) );  
// nun müsste myCol den Farbwert der Pixelpos im BufferImage haben.... geht aber nix... *funz*


spätestens hier bin ich mit meinem Latain am ende...
das prog läuft, zeigt keine fehler an, aber es funktioniert nicht.

naja... ähm hatt jemand nen Tip wie ich weiterkomme? bin ich auf dem richtigen weg?
udn wie kriege ich die manipilierte BuffImg wieder zurück ins Image?
da ich auch in meinen pdf´s nix gefunden hab, und mir in der Java-hülfe die Code-bsp.
fehlen, vieleicht könnte mir mal jemand von Euch nen Tip geben.
vieleicht stelle ich das auch viel zu umständlich an, im .NET jedenfalls 
brachte ein IMAGE-Object gleich auch Methoden zur Pixelmanipulation mit.
muss doch in java auch gehen.

THX Cayamides


----------



## thE_29 (2. Nov 2004)

also wenn du ein BufferedImage hast, dann kannst du mittels getRaster().getPixel die Pixel ändern!

dann kannst du mittels ImageIO.write das Bild speichern oder vielleicht in in ein Image umwandeln lassen und dann gibts noch ne Klasse die sich PixelGrabber nennt! Guck dir die mal an!


----------



## CelikBlek (2. Nov 2004)

Also so kannst du das Bild in ein Array wandeln:

```
/**
   * PixelGrabber. Liesst die Werte aus dem Image.
   * @param img Image Das uebergebene Image
   * @return int[] Die gelesenen int Werte
   */
  public int[]imageToArray(Image img)  {
    int width = img.getWidth(null);
    int height = img.getHeight(null);
    int[] array = new int[ width * height];
    grabber = new PixelGrabber(img, 0, 0, img.getWidth(null), img.getHeight(null),
                               array, 0, img.getWidth(null));
    try    {
      grabber.grabPixels();
    }
    catch (Exception e)    {
      e.printStackTrace();
    }
    return array;
  }
```
Und Beispielsweise so könntest du die Werte dann verändern und wieder in ein Image zurück verwandeln:

```
...
for(int i=0; i < bildArray.length; i++)    {
      DirectColorModel colorModel = (DirectColorModel) ColorModel.getRGBdefault();
      currentAlpha = colorModel.getAlpha(bildArray[i]);
      currentRed = colorModel.getRed(bildArray[i]);
      currentGreen = colorModel.getGreen(bildArray[i]);
      ...
}
```
Gruss


----------



## CAYAMIDES (2. Nov 2004)

THX! das hilft mir eventuell auch weiter....

ABER ich wüsste trotzdem gerne wie ich ein Image in ein Buffered Image verwandeln kann  ?

plz CAYAMIDES


----------



## CelikBlek (2. Nov 2004)

```
import java.awt.image.BufferedImage; 
import java.awt.Image; 
... 

BufferedImage bufferedImage = new BufferedImage ( imageWidth, imageHeight,  BufferedImage.TYPE_INT_BGR ); 
bufferedImage.createGraphics().drawImage( image, 0, 0, this /* observer */ );
```

so musste es gehen


----------



## Kaan (2. Nov 2004)

Kann man ein BufferedImage nicht einfach einem Image zuweisen? Also bei mir klappts, ist ja auch logisch...(OOP)


----------



## Roar (2. Nov 2004)

ja, aber umgekehrt ist das problem :-/


----------



## CelikBlek (2. Nov 2004)

BufferedImage erbt von Image, dass ist klar. habe noch nie versucht eine transformation durchzuführen. könnte möglich sein.
wie ich oben beschrieben habe geht es auf jeden fall, nach OOP Regeln sollte eine Zuweisung auch funzen. natürlich nur in die richtige richtung.
hast du es ausprobiert?


----------



## CAYAMIDES (3. Nov 2004)

moin celik!


```
bufferedImage.createGraphics().drawImage( image, 0, 0, this /* observer */ );
```

irgenndwie existiert diese überladung nich...
ich bin noch n javaneuling, hab aber schon programmiererfahrung. 
ich hab des klassenhirarchy-dingens von java noch net ganz geschnallt... *würks*
im .NET liefert image gleich die entsprechenden methoden mit (zb. Pixelauslesen),
langer rede kurzer sinn:

Ja ich habs probiert, Nein ich hab immer noch kein image in die Buffered Image geschmissen.
lese ich den farbwert aus kümmt schwarz bei raus, also 0,0,0 und des heißt ja wohl das die
buffered image leer ist. (naja jedenfalls ist die image net drinne)

ich werds jetzt mal ganz anders probieren, also mit dem pixelgrabber.

TROTZDEM: 

ich geb net ruhe bevor ich weiß , wie ich nun die IMAGE ins BUFF-image reinkriege,
einfach aus prinzip     :autsch:


----------



## CelikBlek (3. Nov 2004)

hi,
verstehe, dass du es zum laufen bringen willst .
also so funzt es bei mir. nur bei new Color() könntest du dir was überlegen. Ansonsten gehts.

```
BufferedImage bf = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB);
    bf.createGraphics().drawImage(mg, 0, 0, new Color(10 ,10, 10), observer);
```
übrigens ist BufferedImage in diesem package und da existiert oben genannte Methode auf jeden Fall.

```
import java.awt.image.BufferedImage;
```
Gruss


----------

