Как я могу загрузить изображения из каталога компьютера в JAVAFX - PullRequest
7 голосов
/ 20 октября 2011

Я пытаюсь загрузить изображения из папки моего компьютера в стену миниатюр. Я прочитал в теме с другого форума, что ImageView переменная экземпляра "url" не поддерживает системные пути. Я попытался с решением там, но оно выдает исключение: java.lang.OutOfMemoryError: Java heap space as it keeps reading the file.

Другая проблема заключается в том, что он постоянно предупреждает меня об использовании метода javafx.ext -> SwingUtils.toFXImage.

Я также попытался ввести URL-адрес следующим образом:

"file://localhost//Users/USER/Pictures/Camera/test/1.JPG"

Я пытался отобразить несколько изображений, но всегда отображаются только 3-4 изображения.

Я проверил с помощью функции ошибки, полученной из ImageView, она не указывает, что при чтении моих изображений произошла ошибка.

Есть ли альтернативы?

код

function load() {
    println("RUNTIME {Runtime.getRuntime().maxMemory()}");
    System.gc();
    Runtime.getRuntime().freeMemory();

    //MAC Folder PATH
    var path: String = "/Users/username/Pictures/camera/test/1.JPG";;
    var file: File = new File(path);

    //http://download.oracle.com/docs/cd/E17802_01/javafx/javafx/1.3/docs/api/javafx.ext.swing/javafx.ext.swing.SwingUtils.html

    //public toFXImage(image: java.awt.image.BufferedImage) : Image
    //Creates a JavaFX Image from a BufferedImage.
    img = SwingUtils.toFXImage(ImageIO.read(file));
}

Ответы [ 5 ]

27 голосов
/ 11 ноября 2011

Непонятно, что именно вы пытаетесь сделать.Если вы говорите о JavaFX 2.0, работает следующий код.Если вы загружаете много изображений и нуждаетесь в экономии памяти, вам нужно всего лишь создать достаточно ImageView для того количества, которое вы хотите отобразить за один раз.Затем, просматривая изображения, вы можете поменять объект Image , содержащийся в ImageView .

public void start(Stage primaryStage) {
    primaryStage.setTitle("Hello World");
    StackPane root = new StackPane();
    Scene scene = new Scene(root, 300, 250);

    File file = new File("/System/Library/CoreServices/loginwindow.app/Contents/Resources/LogOut.png");
    Image image = new Image(file.toURI().toString());
    ImageView iv = new ImageView(image);

    root.getChildren().add(iv);
    primaryStage.setScene(scene);
    primaryStage.show();
}
.
5 голосов
/ 02 января 2016

все просто: откройте изображение в браузере, скопируйте весь URL-адрес изображения и вставьте его в качестве параметра объекта Image.НЕ УДАЛЯЙТЕ «file ///:», потому что это делает изображение загружаемым.оттуда вы получите другую логику.счастливое кодирование, например

Image image = new Image("file:///C:/Users/Nigel/Desktop/my_image.png");
ImageView imgview = new ImageView(image);
2 голосов
/ 01 марта 2016

извините, если мой ответ пришел с небольшим опозданием, но это был мой подход, и он работает на 100%, куда бы вы ни положили файл 1. назначить ваше изображение в файл 2. разбирать файл на URI 3. назначьте uri.toString () для изображения

бывший код:

File imageFile = new File("path/to/image/outside/your/jar/awesomeless.jpg");
String fileLocation = imageFile.toURI().toString();
Image fxImage = new Image(fileLocation);    

или вы можете просто сложить все вместе вот так:

Image fxImage = new Image(new File("path/.../awesomemore.jpg").toURI().toString());

и, пожалуйста, если кто-нибудь знает лучший подход, дайте нам знать!

1 голос
/ 28 марта 2016

Ни один из предыдущих ответов не работал для меня. Тем не менее, этот, который я видел некоторое время назад, но не могу найти оригинальную ссылку, работает безупречно.

@Override
public void start(Stage primaryStage) throws Exception {
    //create a pane to hold the image views
    Pane pane = new HBox(10);
    pane.setPadding(new Insets(5,5,5,5));

    //create the image to be used!
    Image image = new Image("/Content/vortex.jpg");

    //set some custom properties and add an image
    ImageView imageView = new ImageView(image);
    imageView.setFitHeight(100);
    imageView.setFitWidth(100);
    pane.getChildren().add(imageView);

    //add the second image view with this image and no custom properties
    pane.getChildren().add(new ImageView(image));

    ImageView imageView2 = new ImageView(image);
    imageView2.setRotate(45);
    pane.getChildren().add(imageView2);

    Scene scene = new Scene(pane, 200, 200);
    primaryStage.setScene(scene);
    primaryStage.show();
}

public static void main(String[] args) {
    Application.launch(args);
}

Ключ в том, что когда вы создаете изображение, НАЧИНАЙТЕ путь с помощью '/' (то есть: "/Content/vortex.jpg"). Обратите внимание, что в этой настройке корневая папка является папкой src в большинстве IDE.

1 голос
/ 15 октября 2014

Другое решение - передать InputStream в конструктор класса Image; и работает ...

public void start(Stage primaryStage) {
    primaryStage.setTitle("Hello World");
    StackPane root = new StackPane();
    Scene scene = new Scene(root, 300, 250);

    java.io.FileInputStream fis = new FileInputStream("/System/Library/CoreServices/loginwindow.app/Contents/Resources/LogOut.png");
    ImageView iv = new ImageView(new Image(fis));

    root.getChildren().add(iv);
    primaryStage.setScene(scene);
    primaryStage.show();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...