如何在JavaFX中保存图像?



我可以保存图像从ImageView在JavaFX?

我找到了使用ImageIO的方法,但我不能在我的JavaFX项目中导入它。我使用IntelliJ IDEA

我相信有很多方法可以将图像从javafx ImageView保存到文件中,但这里是我能想到的两种:

java.nio.file.Files.copy

Files实用程序类中的这个方法允许您将字节从InputStream复制到目标路径中,这可以被视为将图像保存到文件中。

  • ImageView中呈现的图像是使用文件或url创建的,而不是输入流。
  • 您使用的JavaFX版本与java 9的版本相同或更新,因为在那时引入了Image.getUrl()方法。

你需要通过调用ImageView. getimage()从ImageView中获取图像对象,然后使用Image. geturl()从图像中获取Url,然后你可以用返回的字符串创建一个Url,然后调用Url . openstream()来获得一个InputStream,你可以从使用文件中复制字节。复制


javafx.embed.swing.SwingFXUtils.fromFXImage

这个方法由javafx提供。swing模块,将JavaFX图像对象转换为可以使用ImageIO保存到文件的buffereimage。写


我准备了这个代码示例(我已经在我的机器上进行了测试,并按预期工作)来演示两种方法

package jfxTest;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import javax.imageio.ImageIO;
import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class App extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
VBox root = new VBox(15);
root.setPadding(new Insets(15));
root.setAlignment(Pos.CENTER);
ImageView view = new ImageView(new Image(getClass().getResource("/img.jpg").toExternalForm()));
view.setPreserveRatio(true);
view.setFitHeight(300);
Button saveCopy = new Button("save copy");
Button saveWrite = new Button("save write");
saveCopy.setOnAction(e -> {
try {
File target = new File("saved_using_copy.jpg");

//get Url and open stream
String urlString = view.getImage().getUrl();
InputStream inputStream = new URL(urlString).openStream();

//copy bytes from the stream to the target file
Files.copy(inputStream, target.toPath(), StandardCopyOption.REPLACE_EXISTING);

System.out.println("Image saved at " + target.getAbsolutePath());
} catch (Exception x) {
System.err.println("Failed to save Image");
x.printStackTrace();
}
});

saveWrite.setOnAction(e -> {
try {
File target = new File("saved_using_write.jpg");

//Convert to bufferedImage
BufferedImage toWrite = SwingFXUtils.fromFXImage(view.getImage(), null);

//write using ImageIO
ImageIO.write(toWrite, "jpg", target);

System.out.println("Image saved at " + target.getAbsolutePath());
} catch (Exception x) {
System.err.println("Failed to save Image");
x.printStackTrace();
}
});
root.getChildren().addAll(view, saveCopy, saveWrite);
primaryStage.setScene(new Scene(root));
primaryStage.show();
}
}

最新更新