【问题标题】:Over Saturated Snapshot in JavaFXJavaFX 中的过饱和快照
【发布时间】:2018-12-08 16:08:01
【问题描述】:

我一直在尝试从我的 JavaFX 媒体播放器中拍摄快照,但它一直给我一个过度饱和的图像。

从兴奋按钮拍摄的过饱和图像示例。 Sample of the over saturated image taken from excited button.

我对如何制作普通快照一无所知。

我们将不胜感激任何帮助和建议。先感谢您。 :)

这是我的 Java 代码:

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
}    

【问题讨论】:

    标签: java image javafx fxml snapshot


    【解决方案1】:

    我不认为过饱和是这里的问题。我想你只是被这个错误击中了:https://bugs.openjdk.java.net/browse/JDK-8119048

    作为一种解决方法,您可以将 BufferedImage 转换为不包含 alpha 的类型并写入。我对其进行了测试,它适用于 PNG 和 JPEG 格式。

    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);
    

    【讨论】:

    • 当我将它保存为 PNG 文件时它工作正常。但我想当你将它保存在 JPEG 上时会有一个错误。 :(
    • 应用workarround,您也可以将其另存为JPEG。请参阅上面的更新答案,是的,JPEG 存在问题。这就是错误报告“JPEG 文件中的颜色错误”的全部内容。
    • 抱歉回复晚了。顺便提一句。变通方法工作。 :)
    猜你喜欢
    • 2014-06-16
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 2020-04-11
    • 2011-05-17
    • 2010-11-20
    • 2016-05-27
    • 1970-01-01
    相关资源
    最近更新 更多