我使用JavaFX并在Javafx中用LineChart概念说明了一个Chart。 如果我绘制图表,我会使用此代码导出此截图。
WritableImage image = lc.snapshot(new SnapshotParameters(), null);
File file = new File("Chart.png");
try {
ImageIO.write(SwingFXUtils.fromFXImage(image, null), "png", file);
}
catch (IOException e) {
//bla
}
这很完美!
现在:有一种简单的方法可以将这个“WritableImage”图像创建为Base64字符串吗?此外,我想用它来将这个Base64-String重现为PHP中的PNG文件。
任何想法? THX
答案 0 :(得分:1)
SwingFXUtils.fromFXImage()
返回BufferedImage
,可以使用Java 8中引入的BASE64.Encoder
轻松转换为Base64-String
。
一个完整的工作示例:
import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.SnapshotParameters;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Base64;
public class Main extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
VBox box = new VBox();
box.setStyle("-fx-background-color:RED;");
Scene scene = new Scene(box, 200, 200);
primaryStage.setScene(scene);
primaryStage.show();
createEncodedString(box);
}
private void createEncodedString(Node node) {
WritableImage image = node.snapshot(new SnapshotParameters(), null);
String base64String = encodeImageToString(SwingFXUtils.fromFXImage(image, null), "png");
System.out.println("Base64 String : " + base64String);
}
private String encodeImageToString(BufferedImage image, String type) {
String imageString = null;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
ImageIO.write(image, type, bos);
byte[] imageBytes = bos.toByteArray();
imageString = Base64.getEncoder().encodeToString(imageBytes);
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
return imageString;
}
}
答案 1 :(得分:0)
您的代码需要继续使用以下内容:
//File file = new File("Chart.png"); -> this is already there
FileInputStream fis = new FileInputStream(file);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int read= 0;
while( (read = fis.read(buffer)) > -1){
baos.write(buffer, 0, read);
}
fis.close();
baos.close();
byte pgnBytes [] = baos.toByteArray();
Base64.Encoder base64_enc = Base64.getEncoder();
String base64_image = base64_enc.encodeToString(pgnBytes);
如果您不需要将图形存储到文件中,可以进一步优化以将文件直接写入字节数组:
WritableImage image = lc.snapshot(new SnapshotParameters(), null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
ImageIO.write(SwingFXUtils.fromFXImage(image, null), "png", baos);
}
catch (IOException e) {
//bla
}
byte pgnBytes [] = baos.toByteArray();
Base64.Encoder base64_enc = Base64.getEncoder();
String base64_image = base64_enc.encodeToString(pgnBytes);
}
在这两种情况下,图像都存储在内存中,如果图像太大等,可能会导致OutOfMemory错误。