# jpg.Bilder teilen/bearbeiten für Puzzle



## Centurio (28. Aug 2006)

Hallo erstmal
Ich versuche zur Zeit ein Puzzlespiel zu programmieren, in dem man die Puzzlestuecke per Maus anklickt, verschieben kann usw. wenn man nah genung an dem "richtigen" Teil ist snappt das verschobene Teil automatisch an das andere.
Soweit so gut das funktioniert auch schon aber ich habe folgende Frage zu den Bildern.

Ich würde gerne jedes beliebige Bild (jpg Format und evtl. festgelegte Pixelgröße) einlesen können und dann zerschneiden / bearbeiten können.

Dafür würde ich gerne wissen wie ich aus einem Image viele Kleine erstmal rechteckige Image Instanzen bekomme. Oder wie ich eine allgemeines jpg Bild so einlese, dass es viele quadratisch/rechteckige Teile produziert die ich dann Z.B. per Graphics.drawImage() zeichnen kann.

In einem Zweiten Schritt interessiert mich noch wie ich ein Bild so zerschneide, dass die typischen Puzzlestucke entstehen.

Vielen Dank schonmal für eure Hilfe.

Mfg Centu


----------



## The_S (28. Aug 2006)

Du kannst das Bild mit ImageIO als BufferedImage einlesen und dir von dem dann mittels getSubimage deine gewünschten Teile als kleine Bilder rauskopieren.


----------



## Centurio (29. Aug 2006)

Vielen Dank hat funktioniert!

Nun noch ne Frage. Ich möchte alle beliebigen Bilder benutzen können, die müssen dafür vom Programm auf die richtige Größe gebracht werden. Dafür benutze ich Image.getScaledInstance(...) dummerweise gibt der nur ein Image zurück welches ich nicht auf BufferedImage casten kann, obwohl ichs von einem BufferedImage aus aufrufe, somit kann ich auch aus dem entstandene Bild nicht mehr mit getSubimage(...) kleine Bilder kopieren...

Weiss jemand eine elegante Lösung dafür ?


----------



## The_S (30. Aug 2006)

```
Graphics2D g2D = buffimage.createGraphics();
g2D.drawImage(scaledIamge, 0, 0, this);
```


----------



## Centurio (30. Aug 2006)

Sorry, aber das kapier' ich nicht...

buffimage soll das BufferedImage sein, welches ich z.B. aus der Datei geladen habe. Und scaledImage ist das welches ich per buffimage.getScaledInstance() gewonnen habe.

Jetzt kann ich aber weder mit Graphics noch mit Graphics2D einen bestimmten Bereich aus einem Image zeichnen.


----------



## The_S (30. Aug 2006)

Du bekommst ja mit getScaledImage ein Ojekt des Types Image zurück, möchtest das ganze aber in einem BufferedImage haben um mit getSubimage arbeiten zu können. Richtig?

Mein Code wandelt ein Image in ein BufferedImage um.


```
BufferedImage origImage = ImageIO.read(file);
Image scaledImage = origImage.getScaledInstance(width, height, Image.SCALE_SMOOTH);
BufferedImage scaledBuffImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2D = scaledBuffImage.createGraphics();
g2D.drawImage(scaledImage, 0, 0, this);
g2D.dispose()
```

Du lädst zuerst dein Image (im Beispiel mit ImageIO.read) skallierst es dann mit getScaledInstance. Dadurch bekommst du ein Objekt des Types Image, welches du aber als BufferedImage möchtest. Weil du das nicht einfach casten kannst, musst du das Image auf ein neues BufferedImage zeichnen. Und das geht mit Graphics2D und createGraphics().

Jetzt klarer?


----------



## Centurio (2. Sep 2006)

Jawohl,
tolle Sache dankeschön, auf die idee wäre ich sicher net so schnell gekommen...


----------



## Centurio (3. Sep 2006)

Also danke nochmals für die Hilfe.

Als nächstes stellt sich mir die Frage wie ich die "typische" Puzzleform zeichnen kann. Bisher habe ich nur Rechteckige Puzzlestuecke.

Mein Programmentwurf sieht in etwa so aus, dass ich pro Puzzlestück bis zu 4 Kanten habe, die jeweils ihre "richtigen" Gegenkanten kennen und so den Abstand voneinander berrechnen.
Somit wäre es mir möglich, die Kanten anstelle des immer quadratischen Puzzlestückes zu zeichnen.
Mein erster Ansatz wäre einfach einen größeren Rechteckigen Bereich auszuschneiden und es den Kanten zu überlassen den Teil zu übermalen, der nicht sichtbar ist. Jede Kante besitzt entweder so einen Knubbel oder eben ein Loch.

Wie aber kann ich ein _nicht rechteckiges_ Bild schnell und leicht aus einem Bild ausschneiden, und / oder zuverlässig zeichnen ?

Mfg Centurio


----------

