JavaFX Bildgröße verkleinern

micfire

Mitglied
Hallo liebe Community.

Nach mittlerweile ein paar Stunden bei Google, diversen Foren und auch hier bitte ich ganz kurz um eure Hilfe.

Durch folgenden Code lade ich eine Bilddatei in ein ImageView:

Java:
    public void fileChooser() throws IOException, SQLException{
        FileChooser fileChooser = new FileChooser();
        fileChooser.setTitle("Durchsuchen...");
        FileChooser.ExtensionFilter JPG= new FileChooser.ExtensionFilter("JPEG (*.jpg)", "*.JPG");
        FileChooser.ExtensionFilter PNG= new FileChooser.ExtensionFilter("PNG (*.png)", "*.PNG");
        fileChooser.getExtensionFilters().addAll(JPG,PNG);
       
        fileFlugzeug = fileChooser.showOpenDialog(Main.primaryStage);
        if(fileFlugzeug != null){
            Image image = new Image(fileFlugzeug.toURI().toURL().toExternalForm());           
            ImageViewBild.setImage(image);   
        }
    }

Ich suche nach einer Möglichkeit, dieses Bild beim laden auf eine Größe von 200px, 100px zu skallieren. Diese Größe sollte dann fest sein, d.h. kein Zoom usw..
Absicht ist es, dass Bild danach in dieser Größe zu Speichern, dabei die Dateigröße zu reduzieren und schließlich das spätere Laden zu verschnellern.

Vielen Dank im Voraus...
 
Das steht als Beispiel in der JavaDoc des ImageView:
https://docs.oracle.com/javase/8/javafx/api/javafx/scene/image/ImageView.html

Java:
         // resizes the image to have width of 100 while preserving the ratio and using
         // higher quality filtering method; this ImageView is also cached to
         // improve performance
         ImageView iv2 = new ImageView();
         iv2.setImage(image);
         iv2.setFitWidth(100);
         iv2.setPreserveRatio(true);
         iv2.setSmooth(true);
         iv2.setCache(true);
 
Ja das hab ich auch schon gefunden. Das Bild speichere ich als File in eine Datenbank. Das funktioniert soweit ganz gut. Aber da das File ansich ja nicht in der Größe verändert wird, sondern lediglich das ImageView hab ich beim speicher/laden wieder das größere Bild, welches dann wiederum verkleinert wird.

Methode zum speichern:
Java:
    public static void PreparedStatementBLOB(String statement, File file) throws SQLException, IOException{
        Connection connection = DriverManager.getConnection(JDBC_URL);
        PreparedStatement ps = connection.prepareStatement(statement);
        FileInputStream fis = new FileInputStream(file);
        ps.setBinaryStream(1, fis);
        ps.execute();
    }

Methode zum laden:
Java:
public static Image imageStream(String SQL, String ColumnName) throws ClassNotFoundException, SQLException, IOException{
        ResultSet rs = getResultSet(SQL);
        Image i = null;
            while(rs.next()){
                InputStream is = rs.getBinaryStream(1);
                if(is!=null){           
                    i = new Image(is);
                    is.close();
                }else{
                    i = new Image("bibliothek/bilder/kein_flugzeug.png");
                }
            }
        return i;
    }
 
Sieht ganz gut aus, erfüllt aber nicht ganz meine Anforderungen. Wenn ich mir das so durchlese ist es eher ein Workaround. Das Bild exisitiert fürs Laden in Java und zum Speichern in die Datenbank als File Object. In ein Image Object wird es erst umgewandelt, wenn es in einem ImageView angezeigt werden soll.

Der logische Ablauf aus meiner Sicht wäre, das Bild in Java als File laden, dann die Größenänderung und erstellen eines neuen File Objects, dann 1. Anzeige des daraus generierten Images im ImageView und 2. bei Bedarf Speichern desselben Files in die Datenbank.

Und für diese Größenänderung und vllt. auch Erzeugung eines neuen temp Images habe ich keine Idee zur Umsetzung.
 
Da wir uns nun darauf geeinigt haben, dass du eigentlich Bildbearbeitung machen möchtest, ist festzustellen, das JavaFX als GUI-Framework - das im Normalfall eben "nur" für das Entwickeln von (in diesem Fall Rich-Client-) Oberflächen gedacht ist - dafür nicht wirklich die beste Wahl ist.

Dafür musst du mal die Google-Suche bemühen. Z.B., indem du nach "java image processing" suchst.
Beispielhaftes Ergebnis:
 

Zurück
Oben