JavaFX图表到图像到Base64字符串使用PHP

时间:2015-07-14 13:00:53

标签: java php image javafx base64

我使用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

2 个答案:

答案 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错误。