Advertisement
Adam9383

Histogram

Jan 22nd, 2020
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.78 KB | None | 0 0
  1. public class FXMLDocumentController implements Initializable {
  2.  
  3.     @FXML
  4.     private Pane pane;
  5.     @FXML
  6.     private ImageView imageView;
  7.     private LineChart<Integer, Double> lineChart;
  8.     private ObservableList<XYChart.Series<Integer, Double>> series;
  9.    
  10.     private Image image;
  11.     @FXML
  12.     private BorderPane borderPane;
  13.     @FXML
  14.     private FlowPane flowPane;
  15.    
  16.     private final Axis xAxis = new NumberAxis(0, 255, 64);
  17.     private final Axis yAxis = new NumberAxis(0, 100, 10);
  18.     @FXML
  19.     private StackPane leftPane;
  20.    
  21.    
  22.     @Override
  23.     public void initialize(URL url, ResourceBundle rb) {
  24.       lineChart = new LineChart(xAxis, yAxis);
  25.       borderPane.widthProperty().addListener(listener -> resize());
  26.       borderPane.heightProperty().addListener(listener -> resize());
  27.     }    
  28.  
  29.     @FXML
  30.     private void loadImageBtn(ActionEvent event) {
  31.         FileChooser fc = new FileChooser();
  32.         fc.getExtensionFilters().addAll(new FileChooser.ExtensionFilter("JPG", "*.jpg"),
  33.                 new FileChooser.ExtensionFilter("BMP", "*.bmp"));
  34.         File file = fc.showOpenDialog(IPOG_Zkouska_Histogram.stage);
  35.        
  36.         if (Objects.nonNull(file)) {
  37.             image = new Image(file.toURI().toString());
  38.             if (image != null && !image.isError()) {
  39.                 imageView.setImage(image);
  40.                 resize();
  41.                 obnovHistogram();
  42.             } else {
  43.                 Alert alert = new Alert(AlertType.ERROR);
  44.                 alert.setContentText("ERROR image");
  45.                 alert.setHeaderText(null);
  46.                 alert.setTitle("ERROR");
  47.                
  48.                 alert.showAndWait();
  49.             }
  50.         } else {
  51.             Alert alert = new Alert(AlertType.ERROR);
  52.                 alert.setContentText("ERROR file");
  53.                 alert.setHeaderText(null);
  54.                 alert.setTitle("ERROR");
  55.                
  56.                 alert.showAndWait();
  57.         }
  58.    
  59.     }
  60.  
  61.     private void resize() {
  62.         double height = borderPane.getHeight()-flowPane.getPrefHeight();
  63.         lineChart.setPrefHeight(height);
  64.        
  65.         if (image != null) {
  66.            
  67.             double pomW = leftPane.getWidth()/image.getWidth();
  68.             double pomH = leftPane.getHeight()/image.getHeight();
  69.  
  70.             double pomF = pomW < pomH ? pomW : pomH;
  71.  
  72.             imageView.setFitHeight(pomF*image.getHeight());
  73.             imageView.setFitWidth(pomF*image.getWidth());
  74.         }    
  75.            
  76.     }
  77.  
  78.     private void obnovHistogram() {
  79.         if (series != null) {
  80.             series.clear();
  81.         }
  82.        
  83.        
  84.         lineChart = new LineChart(xAxis, yAxis);
  85.         lineChart.setCreateSymbols(false);
  86.         series = lineChart.getData();
  87.         lineChart.setPrefWidth(300);
  88.         lineChart.setPrefHeight(pane.getHeight());
  89.        
  90.         double red[] = new double[256];
  91.         double green[] = new double[256];
  92.         double blue[] = new double[256];
  93.        
  94.         Arrays.fill(red, 0);
  95.         Arrays.fill(green, 0);
  96.         Arrays.fill(blue, 0);
  97.        
  98.         XYChart.Series<Integer, Double> seriesRed = new XYChart.Series<>();
  99.         XYChart.Series<Integer, Double> seriesGreen = new XYChart.Series<>();
  100.         XYChart.Series<Integer, Double> seriesBlue = new XYChart.Series<>();
  101.         ObservableList<XYChart.Data<Integer, Double>> dataRed = seriesRed.getData();
  102.         ObservableList<XYChart.Data<Integer, Double>> dataGreen = seriesGreen.getData();
  103.         ObservableList<XYChart.Data<Integer, Double>> dataBlue = seriesBlue.getData();
  104.        
  105.         PixelReader pr = image.getPixelReader();
  106.        
  107.         for (int i = 0; i < image.getWidth(); i++) {
  108.             for (int j = 0; j < image.getHeight(); j++) {
  109.                 Color color = pr.getColor(i, j);
  110.                 red[to255(color.getRed())]++;
  111.                 green[to255(color.getGreen())]++;
  112.                 blue[to255(color.getBlue())]++;
  113.             }
  114.            
  115.         }
  116.        
  117.         double maxR = 0;
  118.         double maxG = 0;
  119.         double maxB = 0;
  120.        
  121.         for (int i = 0; i < red.length; i++) {
  122.             maxR = Math.max(maxR, red[i]);
  123.             maxG = Math.max(maxG, green[i]);
  124.             maxB = Math.max(maxB, blue[i]);
  125.         }
  126.        
  127.         for (int i = 0; i < red.length; i++) {
  128.             dataRed.add(new XYChart.Data<>(i,(red[i]/maxR)*100));
  129.             dataGreen.add(new XYChart.Data<>(i,(green[i]/maxG)*100));
  130.             dataBlue.add(new XYChart.Data<>(i,(blue[i]/maxB)*100));
  131.         }
  132.        
  133.         series.addAll(seriesRed, seriesBlue, seriesGreen);
  134.         pane.getChildren().add(lineChart);
  135.        
  136.        
  137.        
  138.     }
  139.    
  140.     private int to255(double i) {
  141.         return (int)(i*255);
  142.     }
  143.    
  144. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement