JavaFX Teil eines Bildes ausschneiden / als neues Bild nutzen

Syrghar

Mitglied
Hallo,

beschäftige mich seit wenigen Tagen mit JavaFX und hätte eine Frage bezüglich arbeiten mit Bildern.

Möchte aus einem Bild, das aktuell die Karten eines Decks zeigt, einen Teilbereich ausschneiden, der nur eine einzelne Karte zeigt, und dieses Teilbild weiters dazu nutzen die Handkarten des Spielers anzuzeigen. Je nach gezogener Karte vom Deck soll der richtige Teilbereich des Bildes ausgegeben werden.

Ist das überhaupt möglich?

Habe Google bereits herangezogen, aber leider nichts in diese Richtung finden können.

Danke schonmal.


Mfg. Syrghar
 
Du könntest die RGB-Werte des Bildes in eine zweidimensionale Array speichern und den Teil, den du grade brauchst (z.B [100][90] - [120][130]), in eine neue Array kopieren und daraufhin wieder in ein Bild umwandeln.

Code:
BufferedImage im = ...;
int[][] rgb = new int[im.getWidth()][im.getHeight()];
for(int i = 0; i < im.getWidth(); i++)
    for(int j = 0; j < im.getHeight(); j++)
        rgb[i][j] = im.getRGB(i, j);
Code:
BufferedImage im2 = new BufferedImage(<neue Breite>, <neue Höhe>, BufferedImage.TYPE_INT_RGB);
        for(int i = 0; i < <neue Breite>; i++)
            for(int j = 0; j < <neue Höhe>; j++)
                im2.setRGB(i, j, <neue Array>[i][j]);
 
Mir erscheint das wenig performant. Ich würde jede Karte als einzelnes Bild abspeichern und dann das Deck und die Karten auf der Hand aus den einzelnen Karten zusammen bauen.

Gruß

Claus
 
Ich denke, dass du das Problem mit einem BufferedImage lösen kannst. Du liest dein Bild ein. Und danach kannst du mithilfe der Methode getSubimage() ein Teil des Bildes auswählen. Dabei musst du die Koordinaten wissen, von wo bis wo das Bild gewählt werden soll.
 
Danke, für eure Infos.

Habe es nun folgendermaßen versucht:
Java:
 public static Image showCardImage() throws IOException
    {   
       
            BufferedImage b = ImageIO.read(new File("style/Cards.jpg"));
            System.out.println(b.getWidth() + " - " + b.getHeight());
            BufferedImage sub = b.getSubimage(40, 0, 80, 60);
           
        //Image img2 = new Image ("style/card1.jpg", true);
           
       
        return null;
   
       
    }

Aktuell gebe ich nur NULL zurück, da ich was versuchen wollte. Bekomme jetzt jedoch folgenden Fehler in dieser Zeile:
Java:
  BufferedImage b = ImageIO.read(new File("style/Cards.jpg"));

Exception in Application start method
Exception in thread "NEW THREAD" java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown Source)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$152(Unknown Source)
at com.sun.javafx.application.LauncherImpl$$Lambda$50/1141538472.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: javax.imageio.IIOException: Can't read input file!
at javax.imageio.ImageIO.read(Unknown Source)
at at.fhj.swd2.project.berdievs14bergerru14.Card.showCardImage(Card.java:161)
at at.fhj.swd2.project.berdievs14bergerru14.GameView.start(GameView.java:54)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$159(Unknown Source)
at com.sun.javafx.application.LauncherImpl$$Lambda$53/2016722519.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$172(Unknown Source)
at com.sun.javafx.application.PlatformImpl$$Lambda$45/186276003.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$null$170(Unknown Source)
at com.sun.javafx.application.PlatformImpl$$Lambda$48/1669840693.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$171(Unknown Source)
at com.sun.javafx.application.PlatformImpl$$Lambda$47/237061348.run(Unknown Source)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$145(Unknown Source)
at com.sun.glass.ui.win.WinApplication$$Lambda$36/2117255219.run(Unknown Source)
... 1 more

Wenn ich den Code in der Methode auf folgendes ändere, nur um zu sehen, ob überhaupt was eingelesen wird, geht es:
Java:
Image img2 = new Image ("style/card1.jpg", true);

Also der Pfad stimmt. Habt ihr eine Idee, wieso ich das als BufferImage nicht einlasen kann?
Danke schonmal.
 
Um das Ganze mal zu lösen wurde das Bild mit den Karten getauscht. Haben nun ein Bild für jede Karte.
Die Methode wurde im foglenden darauf geändert.
Java:
 public static Image showCardImage(String p_card) throws IOException
    {   
        /*
            BufferedImage b = ImageIO.read(new File("style/Cards.jpg"));
            System.out.println(b.getWidth() + " - " + b.getHeight());
            BufferedImage sub = b.getSubimage(40, 0, 80, 60);
           */
        final String v_card = p_card;
        Image img2 = null;
       
        switch (v_card)
        {
            case "kreuzAs11":
                Image img_sub = new Image ("style/cards/K_A.jpg", true);
                img2 = img_sub;
                break;
            case "kreuzZwei2":
                Image img_sub2 = new Image ("style/cards/K_2.jpg", true);
                img2 = img_sub2;
                break;
            case "kreuzDrei3":
                Image img_sub3 = new Image ("style/cards/K_3.jpg", true);
                img2 = img_sub3;
                break;
            case "kreuzVier4":
                Image img_sub4 = new Image ("style/cards/K_4.jpg", true);
                img2 = img_sub4;
                break;
            case "kreuzFuenf5":
                Image img_sub5 = new Image ("style/cards/K_5.jpg", true);
                img2 = img_sub5;
                break;
            case "kreuzSechs6":
                Image img_sub6 = new Image ("style/cards/K_6.jpg", true);
                img2 = img_sub6;
                break;
            case "kreuzSieben7":
                Image img_sub7 = new Image ("style/cards/K_7.jpg", true);
                img2 = img_sub7;
                break;
            case "kreuzAcht8":
                Image img_sub8 = new Image ("style/cards/K_8.jpg", true);
                img2 = img_sub8;
                break;
            case "kreuzNeun9":
                Image img_sub9 = new Image ("style/cards/K_9.jpg", true);
                img2 = img_sub9;
                break;
            case "kreuzZehn10":
                Image img_sub10 = new Image ("style/cards/K_10.jpg", true);
                img2 = img_sub10;
                break;
            case "kreuzBube10":
                Image img_sub11 = new Image ("style/cards/K_J.jpg", true);
                img2 = img_sub11;
                break;
            case "kreuzDame10":
                Image img_sub12 = new Image ("style/cards/K_D.jpg", true);
                img2 = img_sub12;
                break;
            case "kreuzKoenig10":
                Image img_sub13 = new Image ("style/cards/K_K.jpg", true);
                img2 = img_sub13;
                break;
            case "karoAs11":
                Image img_sub14 = new Image ("style/cards/KA_A.jpg", true);
                img2 = img_sub14;
                break;
            case "karoZwei2":
                Image img_sub15 = new Image ("style/cards/KA_2.jpg", true);
                img2 = img_sub15;
                break;
            case "karoDrei3":
                Image img_sub16 = new Image ("style/cards/KA_3.jpg", true);
                img2 = img_sub16;
                break;
            case "karoier4":
                Image img_sub17 = new Image ("style/cards/KA_4.jpg", true);
                img2 = img_sub17;
                break;
            case "karoFuenf5":
                Image img_sub18 = new Image ("style/cards/KA_5.jpg", true);
                img2 = img_sub18;
                break;
            case "karoSechs6":
                Image img_sub19 = new Image ("style/cards/KA_6.jpg", true);
                img2 = img_sub19;
                break;
            case "karoSieben7":
                Image img_sub20 = new Image ("style/cards/KA_7.jpg", true);
                img2 = img_sub20;
                break;
            case "karoAcht8":
                Image img_sub21 = new Image ("style/cards/KA_8.jpg", true);
                img2 = img_sub21;
                break;
            case "karoNeun9":
                Image img_sub22 = new Image ("style/cards/KA_9.jpg", true);
                img2 = img_sub22;
                break;
            case "karoZehn10":
                Image img_sub23 = new Image ("style/cards/KA_10.jpg", true);
                img2 = img_sub23;
                break;
            case "karoBube10":
                Image img_sub24 = new Image ("style/cards/KA_J.jpg", true);
                img2 = img_sub24;
                break;
            case "karoDame10":
                Image img_sub25 = new Image ("style/cards/KA_D.jpg", true);
                img2 = img_sub25;
                break;
            case "karoKoenig10":
                Image img_sub26 = new Image ("style/cards/KA_K.jpg", true);
                img2 = img_sub26;
                break;
            case "herzAs11":
                Image img_sub27 = new Image ("style/cards/H_A.jpg", true);
                img2 = img_sub27;
                break;
            case "herzZwei2":
                Image img_sub28 = new Image ("style/cards/H_2.jpg", true);
                img2 = img_sub28;
                break;
            case "herzDrei3":
                Image img_sub29 = new Image ("style/cards/H_3.jpg", true);
                img2 = img_sub29;
                break;
            case "herzVier4":
                Image img_sub30 = new Image ("style/cards/H_4.jpg", true);
                img2 = img_sub30;
                break;
            case "herzFuenf5":
                Image img_sub31 = new Image ("style/cards/H_5.jpg", true);
                img2 = img_sub31;
                break;
            case "herzSechs6":
                Image img_sub32 = new Image ("style/cards/H_6.jpg", true);
                img2 = img_sub32;
                break;
            case "herzSieben7":
                Image img_sub33 = new Image ("style/cards/H_7.jpg", true);
                img2 = img_sub33;
                break;
            case "herzAcht8":
                Image img_sub34 = new Image ("style/cards/H_8.jpg", true);
                img2 = img_sub34;
                break;
            case "herzNeun9":
                Image img_sub35 = new Image ("style/cards/H_9.jpg", true);
                img2 = img_sub35;
                break;
            case "herzZehn10":
                Image img_sub36 = new Image ("style/cards/H_10.jpg", true);
                img2 = img_sub36;
                break;
            case "herzBube10":
                Image img_sub37 = new Image ("style/cards/H_J.jpg", true);
                img2 = img_sub37;
                break;
            case "herzDame10":
                Image img_sub38 = new Image ("style/cards/H_D.jpg", true);
                img2 = img_sub38;
                break;
            case "herzKoenig10":
                Image img_sub39 = new Image ("style/cards/H_K.jpg", true);
                img2 = img_sub39;
                break;
            case "pikAs11":
                Image img_sub40 = new Image ("style/cards/P_A.jpg", true);
                img2 = img_sub40;
                break;
            case "pikZwei2":
                Image img_sub41 = new Image ("style/cards/P_2.jpg", true);
                img2 = img_sub41;
                break;
            case "pikDrei3":
                Image img_sub42 = new Image ("style/cards/P_3.jpg", true);
                img2 = img_sub42;
                break;
            case "pikVier4":
                Image img_sub43 = new Image ("style/cards/P_4.jpg", true);
                img2 = img_sub43;
                break;
            case "pikFuenf5":
                Image img_sub44 = new Image ("style/cards/P_5.jpg", true);
                img2 = img_sub44;
                break;
            case "pikSechs6":
                Image img_sub45 = new Image ("style/cards/P_6.jpg", true);
                img2 = img_sub45;
                break;
            case "pikSieben7":
                Image img_sub46 = new Image ("style/cards/P_7.jpg", true);
                img2 = img_sub46;
                break;
            case "pikAcht8":
                Image img_sub47 = new Image ("style/cards/P_8.jpg", true);
                img2 = img_sub47;
                break;
            case "pikNeun9":
                Image img_sub48 = new Image ("style/cards/P_9.jpg", true);
                img2 = img_sub48;
                break;
            case "pikZehn10":
                Image img_sub49 = new Image ("style/cards/P_10.jpg", true);
                img2 = img_sub49;
                break;
            case "pikBube10":
                Image img_sub50 = new Image ("style/cards/P_J.jpg", true);
                img2 = img_sub50;
                break;
            case "pikDame10":
                Image img_sub51 = new Image ("style/cards/P_D.jpg", true);
                img2 = img_sub51;
                break;
            case "pikKoenig10":
                Image img_sub52 = new Image ("style/cards/P_K.jpg", true);
                img2 = img_sub52;
                break;
        }
        return img2;
       
    }

Das scheint mir bzw. uns in der Projektgruppe sehr unschön zu sein.
 
Hat sich erledigt.

Java:
public static Image showCardImage() throws IOException
    {
       
        Image img = new Image("style/cards.jpg");
         
        int wert = 0;
        int farbe = 0;
   
        PixelReader reader = img.getPixelReader();
        WritableImage newImage = new WritableImage(reader, wert, farbe, 72, 96);
         
        return newImage;
    }
 
Hallo,

es ist eine neue Frage bezüglich JavaFX aufgetaucht.

In dem aktuellen Projekt gibt es eine Main Stage, wo es die Möglichkeit gibt bis zu 4 Spieler auszuwählen. Mit speichern wird dann weiters eine Anzahl an Sub Stages aufgemacht, die der Anzahl Spieler entspricht.

Wie lassen sich diese Sub Stages nun unterscheiden, um von einer Substage zur Mainstage bzw. einer anderen Substage Daten hin und her zu schieben?

Bitte um Hilfe, danke.


Mfg. Syrghar
 

Zurück
Oben