# Java 2dimensionales Bildarray



## Sunderfisch (31. Aug 2011)

Guten Morgen,

Bräuchte ein wenig Starthilfe für ein Programm, welches Affine Transformationen darstellt und berechnet. Wichtig: Die von Java mitgelieferte Klasse AffineTransform soll nicht verwendet werden, da der mathematische Hintergrund dieser Sache beleuchtet werden soll.

Ich habe jetzt ein kleines Programm geschrieben, mit welchem ich per filechooser ein Bild einlesen kann und welches anschließend gezeichnet wird. Doch jetzt stehe ich auf dem Schlauch. Habe mich tagelang durch irgendwelche Java-Dokumentationen und Bücher gefressen, doch irgendwie sehe ich den Wald vor lauter Bäumen nicht mehr.

Ich brauche jetzt eine Matrix, welche mir passend zu den x und y Koordinaten meines Bildes den entsprechenden Farbwert liefert. In der 1. Spalte an der 1. Stelle soll dann der Farbwert von dem Pixel mit den Koordinaten (1|1) stehen.

Hoffe, das war verständlich.
Kann mir bitte jemand Starthilfe geben? Wenn ich diese Matrix habe, kann ich den Rest alleine schreiben, aber irgendwie steige ich nicht mehr durch, wie man so eine Matrix anfertigen soll.
Habe da jetzt verschiedenste Möglichkeiten gelesen, an so ein Array ranzukommen:
Pixelgrabber, oder Buffered Image.getRaster oder soetwas.
Leider sind diese Arrays nur eindimensional - sprich ich kann zwar mit dem Pixel Nummer 2000 sprechen, nicht aber mit dem Pixel an der Position 5|8 (beispielsweise)

Hoffe auf Hilfe,

Gruß


----------



## SlaterB (31. Aug 2011)

von einem eindimensionalen Array in ein zweidimensionales zu wechseln ist doch leicht zu machen, gute Übung für Anfänger,
oder du schreibst dir eine Hilfsmethode

```
get(x,y) {
   return array[korrekt berechneter Index]
}
```
für so eine Kleinigkeit eine neue API zu suchen ist ja irre,

siehe pauschal auch ein aktuelles Thema zu BufferedImage in Verwendung:
http://www.java-forum.org/allgemeine-java-themen/123706-bufferedimage-invertieren.html


----------



## nillehammer (31. Aug 2011)

Genau, Du schreibst Dir eine Hilfsmethode, welche die Pixelwerte in ein zweidimensionales Array kopiert. Ich kenn mich mit den Imageklassen nicht so aus, deswegen nur Pseudocode:

```
public int[][] createTwoDimensional(final Image img) {
  final int[][] result = new int[img.hoehe][img.breite];
  int zeile, spalte;
  for (int pixelNr = 0; pixelNr < img.getPixelAnzahl ; pixelNr++) {
    zeile = pixelNr / img.breite;
    spalte = pixelNr - (zeile* img.breite);
    result[zeile][spalte] = img.getPixelFarbWertAt(pixelNr);
  }
  return result;
}
```
Hoffe, ich habe höhe und breite nicht vertauscht. Aber so in etwa müsste es gehen.


----------



## Evil-Devil (31. Aug 2011)

Wenn es eindimensional ist, kannst es doch ganz einfach ausrechnen.

Du suchst in der achten Zeile und Spalte 5. Farbtiefe wäre hier noch interessant ob 24 oder 32 Bit (3 bzw. 4 Byte/Int). Wobei ich nicht weiß wie Java intern einen RGB Wert ablegt. Wenn ein RGB(A) Wert in einen Int gepackt wird, dann brauchst du die Farbwert Multiplikation nicht.

Somit wäre das nach meinem Verständnis bei deinem Beispiel: 8 x Zeilenlänge + 5 = PixelPosition in der Liste.


----------

