JeffNUCode
JeffNUCode

Reputation: 19

Over Saturated Snapshot in JavaFX

I've been trying to take a snapshot from my media player in JavaFX but it keeps on giving me an over saturated image.

Sample of the over saturated image taken from excited button. Sample of the over saturated image taken from excited button.

I'm out of ideas on how to have a normal snapshot.

Any help and suggestions will be appreciated. Thank you in advance. :)

This is my Java code:

public class FXMLDocumentController implements Initializable {
private MediaPlayer mediaPlayer;

@FXML
private MediaView mediaView;
private String filePath;

@FXML 
private Slider seekSlider;

@FXML
private void handleButtonAction(ActionEvent event) {
    FileChooser fileChooser = new FileChooser();
    FileChooser.ExtensionFilter filter = new FileChooser.ExtensionFilter("Select a File ('.mp4')", "*.mp4");
            fileChooser.getExtensionFilters().add(filter);
            File file = fileChooser.showOpenDialog(null);
            filePath = file.toURI().toString();

            if(filePath != null){
                Media media = new Media(filePath);
                mediaPlayer = new MediaPlayer(media);
                mediaView.setMediaPlayer(mediaPlayer);



        mediaPlayer.currentTimeProperty().addListener(new ChangeListener<Duration>() {
        @Override
        public void changed(ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) {
           seekSlider.setMin(0.0);
           seekSlider.setValue(0.0);
           seekSlider.setMax(mediaPlayer.getTotalDuration().toSeconds());
           seekSlider.setValue(newValue.toSeconds());
        }       
            });

            seekSlider.setOnMouseClicked(new EventHandler<MouseEvent>(){
                    @Override
                    public void handle(MouseEvent event) {
                     mediaPlayer.seek(Duration.seconds(seekSlider.getValue()));
                    }

            });
     mediaPlayer.play();

            }

}
@FXML
private void pauseVideo(ActionEvent event){
     mediaPlayer.pause();
}
 @FXML
private void playVideo(ActionEvent event){
    mediaPlayer.play();
}
 @FXML
private void stopVideo(ActionEvent event){
    mediaPlayer.stop();
}
@FXML
private void exit(ActionEvent event){
    System.exit(0);
}

@FXML
private void excitedCapture(ActionEvent event) throws IOException{
   WritableImage img = mediaView.snapshot(new SnapshotParameters(), null);
   BufferedImage bufImg = SwingFXUtils.fromFXImage(img, null);
   ImageIO.write(bufImg, "jpg", new File("hi.jpg"));
}
@Override
public void initialize(URL url, ResourceBundle rb) {
    // TODO
}    

Upvotes: 0

Views: 122

Answers (1)

mipa
mipa

Reputation: 10650

I don't think that oversaturation is the issue here. I think you are just hit by this bug: https://bugs.openjdk.java.net/browse/JDK-8119048

As a workaround, you can convert your BufferedImage to a type that does not include alpha and write that. I tested it and it works fine for both PNG and JPEG formats.

BufferedImage bImage = SwingFXUtils.fromFXImage(image, null);
BufferedImage bImage2 = new BufferedImage(bImage.getWidth(), bImage.getHeight(), BufferedImage.TYPE_3BYTE_BGR);
bImage2.getGraphics().drawImage(bImage, 0, 0, null);
ImageIO.write(bImage2, FILE_TYPE, file);

Upvotes: 1

Related Questions