jpg.Bilder teilen/bearbeiten für Puzzle

  • Themenstarter Themenstarter Centurio
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
C

Centurio

Gast
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
 
Du kannst das Bild mit ImageIO als BufferedImage einlesen und dir von dem dann mittels getSubimage deine gewünschten Teile als kleine Bilder rauskopieren.
 
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 ?
 
Code:
Graphics2D g2D = buffimage.createGraphics();
g2D.drawImage(scaledIamge, 0, 0, this);
 
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.
 
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.

Code:
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?
 
Jawohl,
tolle Sache dankeschön, auf die idee wäre ich sicher net so schnell gekommen...
 
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
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben