Example to display Histogram of on-line images on JavaFX LineChart
remark: In the video, photos from http://www.ultimate-photo-tips.com/histogram-examples.html are used as sample to generate histogram.
Example code:
package javafx_imagehistogram; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.scene.Scene; import javafx.scene.chart.CategoryAxis; import javafx.scene.chart.LineChart; import javafx.scene.chart.NumberAxis; import javafx.scene.chart.XYChart; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.image.PixelReader; import javafx.scene.layout.HBox; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; import javafx.stage.Stage; /** * @web http://java-buddy.blogspot.com */ public class JavaFX_ImageHistogram extends Application { String defaultImage = "http://goo.gl/kYEQl"; @Override public void start(Stage primaryStage) { Label labelInfo = new Label(); labelInfo.setText( "java.version: " + System.getProperty("java.version") + "\n" + "javafx.runtime.version: " + System.getProperty("javafx.runtime.version") ); TextField textSrc = new TextField(); textSrc.setText(defaultImage); Button btnDo = new Button("Do Histogram"); ImageView imageView = new ImageView(); final CategoryAxis xAxis = new CategoryAxis(); final NumberAxis yAxis = new NumberAxis(); final LineChart<String, Number> chartHistogram = new LineChart<>(xAxis, yAxis); chartHistogram.setCreateSymbols(false); btnDo.setOnAction((ActionEvent event) -> { String imageSrc = textSrc.getText(); Image image = new Image(imageSrc); imageView.setImage(image); chartHistogram.getData().clear(); ImageHistogram imageHistogram = new ImageHistogram(image); if(imageHistogram.isSuccess()){ chartHistogram.getData().addAll( //imageHistogram.getSeriesAlpha(), imageHistogram.getSeriesRed(), imageHistogram.getSeriesGreen(), imageHistogram.getSeriesBlue()); } }); HBox hBox = new HBox(); hBox.getChildren().addAll(imageView, chartHistogram); VBox vBox = new VBox(); vBox.getChildren().addAll(labelInfo, textSrc, btnDo, hBox); StackPane root = new StackPane(); root.getChildren().add(vBox); Scene scene = new Scene(root, 1000, 500); primaryStage.setTitle("java-buddy.blogspot.com"); primaryStage.setScene(scene); primaryStage.show(); } /** * @param args the command line arguments */ public static void main(String[] args) { launch(args); } class ImageHistogram { private Image image; private long alpha[] = new long[256]; private long red[] = new long[256]; private long green[] = new long[256]; private long blue[] = new long[256]; XYChart.Series seriesAlpha; XYChart.Series seriesRed; XYChart.Series seriesGreen; XYChart.Series seriesBlue; private boolean success; ImageHistogram(Image src) { image = src; success = false; //init for (int i = 0; i < 256; i++) { alpha[i] = red[i] = green[i] = blue[i] = 0; } PixelReader pixelReader = image.getPixelReader(); if (pixelReader == null) { return; } //count pixels for (int y = 0; y < image.getHeight(); y++) { for (int x = 0; x < image.getWidth(); x++) { int argb = pixelReader.getArgb(x, y); int a = (0xff & (argb >> 24)); int r = (0xff & (argb >> 16)); int g = (0xff & (argb >> 8)); int b = (0xff & argb); alpha[a]++; red[r]++; green[g]++; blue[b]++; } } seriesAlpha = new XYChart.Series(); seriesRed = new XYChart.Series(); seriesGreen = new XYChart.Series(); seriesBlue = new XYChart.Series(); seriesAlpha.setName("alpha"); seriesRed.setName("red"); seriesGreen.setName("green"); seriesBlue.setName("blue"); //copy alpha[], red[], green[], blue[] //to seriesAlpha, seriesRed, seriesGreen, seriesBlue for (int i = 0; i < 256; i++) { seriesAlpha.getData().add(new XYChart.Data(String.valueOf(i), alpha[i])); seriesRed.getData().add(new XYChart.Data(String.valueOf(i), red[i])); seriesGreen.getData().add(new XYChart.Data(String.valueOf(i), green[i])); seriesBlue.getData().add(new XYChart.Data(String.valueOf(i), blue[i])); } success = true; } public boolean isSuccess() { return success; } public XYChart.Series getSeriesAlpha() { return seriesAlpha; } public XYChart.Series getSeriesRed() { return seriesRed; } public XYChart.Series getSeriesGreen() { return seriesGreen; } public XYChart.Series getSeriesBlue() { return seriesBlue; } } }
- Display brightness histogram on JavaFX LineChart
No comments:
Post a Comment