Add low-pass and high-pass filtering
This commit is contained in:
@@ -4,7 +4,7 @@ import com.google.inject.Injector;
|
||||
import nu.pattern.OpenCV;
|
||||
import ui.implementation.components.nav.NavBar;
|
||||
import ui.implementation.views.MainView;
|
||||
import ui.interfaces.IMainView;
|
||||
import ui.abstractions.IMainView;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
@@ -18,7 +18,6 @@ public class Main {
|
||||
Injector injector = Guice.createInjector(new AppModule());
|
||||
|
||||
SwingUtilities.invokeLater(() -> {
|
||||
|
||||
NavBar navBar = injector.getInstance(NavBar.class);
|
||||
MainView view = (MainView) injector.getInstance(IMainView.class);
|
||||
view.setNavBar(navBar);
|
||||
|
||||
@@ -14,10 +14,10 @@ import ui.implementation.components.nav.NavBar;
|
||||
import ui.implementation.views.DoubleMatrix;
|
||||
import ui.implementation.views.FilteringView;
|
||||
import ui.implementation.views.MainView;
|
||||
import ui.interfaces.IDoubleMatrix;
|
||||
import ui.interfaces.IFilteringView;
|
||||
import ui.interfaces.IMainView;
|
||||
import ui.interfaces.INavBar;
|
||||
import ui.abstractions.IDoubleMatrix;
|
||||
import ui.abstractions.IFilteringView;
|
||||
import ui.abstractions.IMainView;
|
||||
import ui.abstractions.INavBar;
|
||||
|
||||
/**
|
||||
* Gathers some configurations in order to set the dependency injection container up
|
||||
|
||||
@@ -4,6 +4,9 @@ import com.google.inject.Inject;
|
||||
import com.google.inject.Provider;
|
||||
import ui.implementation.views.DoubleMatrix;
|
||||
import ui.implementation.views.FilteringView;
|
||||
import ui.implementation.views.ViewInitializer;
|
||||
|
||||
import javax.swing.text.View;
|
||||
|
||||
/**
|
||||
* Concrete implement of the INavigator interface.
|
||||
@@ -27,12 +30,14 @@ public class SwingNavigator implements INavigator {
|
||||
@Override
|
||||
public void showFourier() {
|
||||
DoubleMatrix doubleMatrix = doubleMatrixProvider.get();
|
||||
ViewInitializer.Initialize(doubleMatrix);
|
||||
doubleMatrix.setVisible(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showFiltering() {
|
||||
FilteringView filteringView = filteringProvider.get();
|
||||
ViewInitializer.Initialize(filteringView);
|
||||
filteringView.setVisible(true);
|
||||
}
|
||||
}
|
||||
|
||||
27
src/main/java/app/state/FilteringState.java
Normal file
27
src/main/java/app/state/FilteringState.java
Normal file
@@ -0,0 +1,27 @@
|
||||
package app.state;
|
||||
|
||||
import com.google.common.eventbus.EventBus;
|
||||
import com.google.inject.Inject;
|
||||
import domain.events.filtering.HighPassChangedEvent;
|
||||
import domain.events.filtering.LowPassChangedEvent;
|
||||
import domain.events.fourier.ModuleChangedEvent;
|
||||
import domain.image.GrayScaleMatrix;
|
||||
import domain.image.Image;
|
||||
|
||||
public class FilteringState extends State {
|
||||
|
||||
private Image lowPass;
|
||||
private Image highPass;
|
||||
|
||||
@Inject
|
||||
public FilteringState() { super(new EventBus()); }
|
||||
|
||||
public void setLowPass(Image image) {
|
||||
this.eventBus.post(new LowPassChangedEvent(image));
|
||||
}
|
||||
|
||||
public void setHighPass(Image image) {
|
||||
this.eventBus.post(new HighPassChangedEvent(image));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package domain.events.filtering;
|
||||
|
||||
import domain.image.Image;
|
||||
|
||||
public record HighPassChangedEvent(Image image) { }
|
||||
@@ -0,0 +1,5 @@
|
||||
package domain.events.filtering;
|
||||
|
||||
import domain.image.Image;
|
||||
|
||||
public record LowPassChangedEvent(Image image) { }
|
||||
@@ -12,7 +12,7 @@ import java.util.List;
|
||||
|
||||
public class GlobalLinearFiltering {
|
||||
|
||||
public static GrayScaleMatrix lowPassFiltering(GrayScaleMatrix matrix, int cutoff) {
|
||||
public static GrayScaleMatrix lowPassFiltering(GrayScaleMatrix matrix, double cutoff) {
|
||||
|
||||
int width = matrix.getWidth();
|
||||
int height = matrix.getHeight();
|
||||
@@ -97,7 +97,7 @@ public class GlobalLinearFiltering {
|
||||
return new GrayScaleMatrix(pixels);
|
||||
}
|
||||
|
||||
public static GrayScaleMatrix highPassFiltering(GrayScaleMatrix matrix, int cutoff){
|
||||
public static GrayScaleMatrix highPassFiltering(GrayScaleMatrix matrix, double cutoff){
|
||||
int width = matrix.getWidth();
|
||||
int height = matrix.getHeight();
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ import domain.image.GrayScaleMatrix;
|
||||
import domain.image.Image;
|
||||
import domain.image.processing.complex.ComplexMatrix;
|
||||
import services.ImageService;
|
||||
import ui.interfaces.IDoubleMatrix;
|
||||
import ui.abstractions.IDoubleMatrix;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
|
||||
@@ -1,21 +1,28 @@
|
||||
package presenters;
|
||||
|
||||
import app.state.FilteringState;
|
||||
import com.google.common.eventbus.Subscribe;
|
||||
import com.google.inject.Inject;
|
||||
import domain.events.filtering.HighPassChangedEvent;
|
||||
import domain.events.filtering.LowPassChangedEvent;
|
||||
import domain.image.GrayScaleMatrix;
|
||||
import domain.image.Image;
|
||||
import services.FilteringService;
|
||||
import services.ImageService;
|
||||
import ui.implementation.views.FilteringView;
|
||||
import ui.interfaces.IFilteringView;
|
||||
import ui.abstractions.IFilteringView;
|
||||
|
||||
public class FilteringPresenter {
|
||||
|
||||
private final FilteringState state;
|
||||
private final ImageService imageService;
|
||||
private final FilteringService filteringService;
|
||||
private IFilteringView view;
|
||||
|
||||
@Inject
|
||||
public FilteringPresenter(ImageService imageService, FilteringService filteringService) {
|
||||
public FilteringPresenter(FilteringState state, ImageService imageService, FilteringService filteringService) {
|
||||
this.state = state;
|
||||
this.state.register(this);
|
||||
|
||||
this.imageService = imageService;
|
||||
this.filteringService = filteringService;
|
||||
}
|
||||
@@ -24,17 +31,25 @@ public class FilteringPresenter {
|
||||
this.view = view;
|
||||
}
|
||||
|
||||
public Image computeLowPassFiltering(){
|
||||
public void computeLowPassFiltering(int percentage){
|
||||
GrayScaleMatrix matrix = imageService.getGrayScale();
|
||||
return filteringService.lowPassFiltering(matrix);
|
||||
Image image = filteringService.lowPassFiltering(matrix, (double) percentage /100);
|
||||
this.state.setLowPass(image);
|
||||
}
|
||||
|
||||
public Image computeHighPassFiltering(){
|
||||
public void computeHighPassFiltering(int percentage){
|
||||
GrayScaleMatrix matrix = imageService.getGrayScale();
|
||||
return filteringService.highPassFiltering(matrix);
|
||||
Image image = filteringService.highPassFiltering(matrix, (double) percentage /100);
|
||||
this.state.setHighPass(image);
|
||||
}
|
||||
|
||||
public Image getImage(){
|
||||
return imageService.getImage();
|
||||
@Subscribe
|
||||
public void onLowPassUpdate(LowPassChangedEvent event){
|
||||
view.updateLowPassFiltering(event.image());
|
||||
}
|
||||
|
||||
@Subscribe
|
||||
public void onHighPassUpdate(HighPassChangedEvent event){
|
||||
view.updateHighPassFiltering(event.image());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ import domain.events.ModeChangedEvent;
|
||||
import domain.image.Image;
|
||||
import services.ImageService;
|
||||
import services.ModeService;
|
||||
import ui.interfaces.IMainView;
|
||||
import ui.abstractions.IMainView;
|
||||
|
||||
/**
|
||||
* @author Laurent Crema
|
||||
|
||||
@@ -6,7 +6,7 @@ import domain.common.Mode;
|
||||
import domain.image.GrayScaleMatrix;
|
||||
import services.ImageService;
|
||||
import services.ModeService;
|
||||
import ui.interfaces.INavBar;
|
||||
import ui.abstractions.INavBar;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
||||
@@ -6,14 +6,20 @@ import domain.image.processing.filtering.GlobalLinearFiltering;
|
||||
|
||||
public class FilteringService {
|
||||
|
||||
public Image lowPassFiltering(GrayScaleMatrix matrix) {
|
||||
GrayScaleMatrix filteredMatrix = GlobalLinearFiltering.lowPassFiltering(matrix, 10);
|
||||
public Image lowPassFiltering(GrayScaleMatrix matrix, double percentage) {
|
||||
double cutoff = percentage * getMaxCutoff(matrix.getWidth(), matrix.getHeight());
|
||||
GrayScaleMatrix filteredMatrix = GlobalLinearFiltering.lowPassFiltering(matrix, cutoff);
|
||||
return filteredMatrix.toImage();
|
||||
}
|
||||
|
||||
public Image highPassFiltering(GrayScaleMatrix matrix) {
|
||||
GrayScaleMatrix filteredMatrix = GlobalLinearFiltering.highPassFiltering(matrix, 10);
|
||||
public Image highPassFiltering(GrayScaleMatrix matrix, double percentage) {
|
||||
double cutoff = percentage * getMaxCutoff(matrix.getWidth(), matrix.getHeight());
|
||||
GrayScaleMatrix filteredMatrix = GlobalLinearFiltering.highPassFiltering(matrix, cutoff);
|
||||
return filteredMatrix.toImage();
|
||||
}
|
||||
|
||||
private double getMaxCutoff(int width, int height) {
|
||||
return Math.sqrt(Math.pow(width / 2.0, 2) + Math.pow(height / 2.0, 2));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
8
src/main/java/ui/abstractions/AbstractView.java
Normal file
8
src/main/java/ui/abstractions/AbstractView.java
Normal file
@@ -0,0 +1,8 @@
|
||||
package ui.abstractions;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
public abstract class AbstractView extends JFrame {
|
||||
public abstract void initComponents();
|
||||
public abstract void initValues();
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package ui.interfaces;
|
||||
package ui.abstractions;
|
||||
|
||||
import domain.image.GrayScaleMatrix;
|
||||
|
||||
10
src/main/java/ui/abstractions/IFilteringView.java
Normal file
10
src/main/java/ui/abstractions/IFilteringView.java
Normal file
@@ -0,0 +1,10 @@
|
||||
package ui.abstractions;
|
||||
|
||||
import domain.image.Image;
|
||||
|
||||
public interface IFilteringView {
|
||||
void updateLowPassFiltering(Image image);
|
||||
void updateHighPassFiltering(Image image);
|
||||
void updateButterworthHighPassFiltering(Image image);
|
||||
void updateButterworthLowPassFiltering(Image image);
|
||||
}
|
||||
@@ -1,11 +1,7 @@
|
||||
package ui.interfaces;
|
||||
package ui.abstractions;
|
||||
|
||||
import domain.common.Mode;
|
||||
import domain.image.Image;
|
||||
import presenters.DoubleMatrixPresenter;
|
||||
import presenters.MainPresenter;
|
||||
|
||||
import java.awt.image.BufferedImage;
|
||||
|
||||
public interface IMainView {
|
||||
|
||||
6
src/main/java/ui/abstractions/INavBar.java
Normal file
6
src/main/java/ui/abstractions/INavBar.java
Normal file
@@ -0,0 +1,6 @@
|
||||
package ui.abstractions;
|
||||
|
||||
public interface INavBar {
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package ui.implementation.components.button;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.net.URL;
|
||||
import java.util.Objects;
|
||||
|
||||
public class SaveButton extends JButton {
|
||||
|
||||
public SaveButton(){
|
||||
super(new ImageIcon());
|
||||
URL icon = Objects.requireNonNull(getClass().getResource("/dd_27_p3.jpg"));
|
||||
setIcon(new ImageIcon(Objects.requireNonNull(icon)));
|
||||
}
|
||||
}
|
||||
@@ -4,7 +4,6 @@ import domain.image.GrayScaleMatrix;
|
||||
import domain.image.processing.histogram.Histogramme;
|
||||
import domain.common.Mode;
|
||||
import jakarta.inject.Inject;
|
||||
import jdk.jshell.spi.ExecutionControl;
|
||||
import org.jfree.chart.ChartFactory;
|
||||
import org.jfree.chart.ChartFrame;
|
||||
import org.jfree.chart.JFreeChart;
|
||||
@@ -18,7 +17,7 @@ import ui.implementation.components.intent.FileChooser;
|
||||
import ui.implementation.dialogs.ImageCreatorDialog;
|
||||
import ui.implementation.dialogs.GreyScaleImageCreatorDialog;
|
||||
import ui.implementation.dialogs.RGBImageCreatorDialog;
|
||||
import ui.interfaces.INavBar;
|
||||
import ui.abstractions.INavBar;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.event.ActionEvent;
|
||||
@@ -83,11 +82,12 @@ public class NavBar extends JMenuBar implements INavBar {
|
||||
|
||||
linearMenu = new Menu("Linéaire","/cp_51_p1.jpg",
|
||||
new Menu("Global",
|
||||
new Menu("Formes",
|
||||
new MenuItem("PasseBasIdeal", this::displayFilter),
|
||||
new MenuItem("PasseHautIdeal", this::displayFilter),
|
||||
new MenuItem("PasseBasButterworth", this::displayFilter),
|
||||
new MenuItem("PasseHautButterworth", this::displayFilter)
|
||||
new Menu("Ideal",
|
||||
new MenuItem("Passe-bas", this::displayFilter),
|
||||
new MenuItem("Passe-haut", this::displayFilter)),
|
||||
new Menu("Butterworth",
|
||||
new MenuItem("Passe-bas", this::displayFilter),
|
||||
new MenuItem("Passe-haut", this::displayFilter)
|
||||
)
|
||||
)
|
||||
);
|
||||
@@ -111,7 +111,7 @@ public class NavBar extends JMenuBar implements INavBar {
|
||||
//####################################################
|
||||
|
||||
private File chooseFile(){
|
||||
FileChooser chooser = new FileChooser("./");
|
||||
FileChooser chooser = new FileChooser("./src/main/resources");
|
||||
|
||||
int dialogResult = chooser.showOpenDialog(this);
|
||||
if (dialogResult != JFileChooser.APPROVE_OPTION) return null;
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
package ui.implementation.views;
|
||||
|
||||
import domain.image.GrayScaleMatrix;
|
||||
import domain.image.Image;
|
||||
import jakarta.inject.Inject;
|
||||
import presenters.DoubleMatrixPresenter;
|
||||
import ui.abstractions.AbstractView;
|
||||
import ui.implementation.components.button.SaveButton;
|
||||
import ui.implementation.components.image.ImagePanel;
|
||||
import ui.implementation.components.intent.FileChooser;
|
||||
import ui.interfaces.IDoubleMatrix;
|
||||
import ui.abstractions.IDoubleMatrix;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.io.*;
|
||||
import java.util.Objects;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.event.ChangeEvent;
|
||||
@@ -19,7 +19,7 @@ import javax.swing.event.ChangeEvent;
|
||||
/**
|
||||
* @author Jean-Marc Wagner, Laurent Crema
|
||||
*/
|
||||
public class DoubleMatrix extends JFrame implements IDoubleMatrix
|
||||
public class DoubleMatrix extends AbstractView implements IDoubleMatrix
|
||||
{
|
||||
private double normalizedWhite;
|
||||
private double normalizedBlack;
|
||||
@@ -32,6 +32,8 @@ public class DoubleMatrix extends JFrame implements IDoubleMatrix
|
||||
private ImagePanel realPreviewContainer;
|
||||
private ImagePanel imaginaryPreviewContainer;
|
||||
|
||||
private SaveButton saveButton;
|
||||
|
||||
private JSlider whiteSlider;
|
||||
private JTextField whiteTextField;
|
||||
private JLabel maxLabel;
|
||||
@@ -46,17 +48,16 @@ public class DoubleMatrix extends JFrame implements IDoubleMatrix
|
||||
public DoubleMatrix(DoubleMatrixPresenter presenter)
|
||||
{
|
||||
this.presenter = presenter;
|
||||
initComponents();
|
||||
presenter.setView(this);
|
||||
initValues();
|
||||
}
|
||||
|
||||
private void initComponents() {
|
||||
|
||||
modulePreviewContainer = new ImagePanel();
|
||||
phasePreviewContainer = new ImagePanel();
|
||||
realPreviewContainer = new ImagePanel();
|
||||
imaginaryPreviewContainer = new ImagePanel();
|
||||
@Override
|
||||
public void initComponents() {
|
||||
this.presenter.setView(this);
|
||||
this.modulePreviewContainer = new ImagePanel();
|
||||
this.phasePreviewContainer = new ImagePanel();
|
||||
this.realPreviewContainer = new ImagePanel();
|
||||
this.imaginaryPreviewContainer = new ImagePanel();
|
||||
this.saveButton = new SaveButton();
|
||||
|
||||
blackSlider = buildSlider();
|
||||
whiteSlider = buildSlider();
|
||||
@@ -69,15 +70,6 @@ public class DoubleMatrix extends JFrame implements IDoubleMatrix
|
||||
JLabel minValueText = new JLabel("Valeur MIN :");
|
||||
JLabel maxValueText = new JLabel("Valeur MAX :");
|
||||
|
||||
JButton saveButton = new JButton(new ImageIcon(Objects.requireNonNull(getClass().getResource("/dd_27_p3.jpg"))));
|
||||
saveButton.addActionListener(this::saveImage);
|
||||
|
||||
blackSlider.addChangeListener(this::onValueUpdate);
|
||||
whiteSlider.addChangeListener(this::onValueUpdate);
|
||||
|
||||
blackTextField.addActionListener(this::jTextFieldNoirActionPerformed);
|
||||
whiteTextField.addActionListener(this::jTextFieldBlancActionPerformed);
|
||||
|
||||
modeTab = buildModeTab();
|
||||
buildLayout(modeTab, maxValueText, minValueText, minLabel, maxLabel, saveButton);
|
||||
|
||||
@@ -86,11 +78,22 @@ public class DoubleMatrix extends JFrame implements IDoubleMatrix
|
||||
pack();
|
||||
}
|
||||
|
||||
private void initValues(){
|
||||
modeTab.setSelectedIndex(1);
|
||||
@Override
|
||||
public void initValues(){
|
||||
this.presenter.setView(this);
|
||||
|
||||
blackSlider.setValue(0);
|
||||
whiteSlider.setValue(1000);
|
||||
this.modeTab.setSelectedIndex(1);
|
||||
|
||||
this.blackSlider.setValue(0);
|
||||
this.whiteSlider.setValue(1000);
|
||||
|
||||
this.saveButton.addActionListener(this::saveImage);
|
||||
|
||||
this.blackSlider.addChangeListener(this::onValueUpdate);
|
||||
this.whiteSlider.addChangeListener(this::onValueUpdate);
|
||||
|
||||
this.blackTextField.addActionListener(this::jTextFieldNoirActionPerformed);
|
||||
this.whiteTextField.addActionListener(this::jTextFieldBlancActionPerformed);
|
||||
}
|
||||
|
||||
private JSlider buildSlider() {
|
||||
@@ -224,7 +227,7 @@ public class DoubleMatrix extends JFrame implements IDoubleMatrix
|
||||
}
|
||||
|
||||
private File chooseFile(){
|
||||
FileChooser chooser = new FileChooser("./");
|
||||
FileChooser chooser = new FileChooser("./src/main/resources");
|
||||
|
||||
int dialogResult = chooser.showOpenDialog(this);
|
||||
if (dialogResult != JFileChooser.APPROVE_OPTION) return null;
|
||||
|
||||
@@ -1,58 +1,190 @@
|
||||
package ui.implementation.views;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import domain.image.Image;
|
||||
import infrastructure.ui.ImageMapper;
|
||||
import presenters.FilteringPresenter;
|
||||
import ui.abstractions.AbstractView;
|
||||
import ui.implementation.components.button.SaveButton;
|
||||
import ui.implementation.components.image.ImagePanel;
|
||||
import ui.interfaces.IFilteringView;
|
||||
import ui.abstractions.IFilteringView;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.awt.image.BufferedImage;
|
||||
import javax.swing.event.ChangeEvent;
|
||||
|
||||
public class FilteringView extends JFrame implements IFilteringView {
|
||||
public class FilteringView extends AbstractView implements IFilteringView {
|
||||
|
||||
private ImagePanel imagePanel;
|
||||
private ImagePanel lowPassContainer;
|
||||
private ImagePanel highPassContainer;
|
||||
private JTabbedPane modeTab;
|
||||
private JSlider intensitySlider;
|
||||
private JLabel intensityLabel;
|
||||
private final FilteringPresenter presenter;
|
||||
private boolean isUpdating;
|
||||
|
||||
@Inject
|
||||
public FilteringView(FilteringPresenter presenter) {
|
||||
this.presenter = presenter;
|
||||
this.presenter.setView(this);
|
||||
initComponents();
|
||||
}
|
||||
|
||||
private void initComponents(){
|
||||
this.imagePanel = new ImagePanel();
|
||||
this.imagePanel.loadImage(ImageMapper.toBufferedImage(presenter.computeHighPassFiltering()));
|
||||
buildLayout();
|
||||
@Override
|
||||
public void initComponents(){
|
||||
this.lowPassContainer = new ImagePanel();
|
||||
this.highPassContainer = new ImagePanel();
|
||||
this.modeTab = buildModeTab();
|
||||
this.intensitySlider = new JSlider(0,100,0);
|
||||
this.intensitySlider.setOrientation(JSlider.VERTICAL);
|
||||
this.intensityLabel = new JLabel();
|
||||
JButton saveButton = new SaveButton();
|
||||
|
||||
saveButton.addActionListener(e -> {});
|
||||
|
||||
buildLayout(modeTab, intensityLabel, intensitySlider, saveButton);
|
||||
setTitle("Filtering");
|
||||
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
|
||||
pack();
|
||||
}
|
||||
|
||||
private void buildLayout(){
|
||||
setLayout(new BorderLayout());
|
||||
add(imagePanel, BorderLayout.CENTER);
|
||||
@Override
|
||||
public void initValues(){
|
||||
this.presenter.setView(this);
|
||||
|
||||
this.intensitySlider.setMinimum(0);
|
||||
this.intensitySlider.setMaximum(100);
|
||||
this.intensitySlider.setValue(50);
|
||||
this.intensitySlider.addChangeListener(this::onCutoffUpdate);
|
||||
|
||||
this.intensityLabel.setText(String.valueOf(intensitySlider.getValue()));
|
||||
|
||||
this.modeTab.addChangeListener(e -> {
|
||||
switch (modeTab.getSelectedIndex()) {
|
||||
case 0 -> presenter.computeLowPassFiltering(intensitySlider.getValue());
|
||||
case 1 -> presenter.computeHighPassFiltering(intensitySlider.getValue());
|
||||
}
|
||||
});
|
||||
|
||||
this.presenter.computeLowPassFiltering(intensitySlider.getValue());
|
||||
}
|
||||
|
||||
private JTabbedPane buildModeTab(){
|
||||
JTabbedPane modeTabs = new JTabbedPane();
|
||||
modeTabs.addTab("Passe-bas", lowPassContainer);
|
||||
modeTabs.addTab("Passe-haut", highPassContainer);
|
||||
return modeTabs;
|
||||
}
|
||||
|
||||
private void buildLayout(JTabbedPane modeTab,
|
||||
JLabel valueTextField,
|
||||
JSlider intensitySlider,
|
||||
JButton saveButton) {
|
||||
|
||||
JPanel rightPanel = new JPanel();
|
||||
GroupLayout rightLayout = new GroupLayout(rightPanel);
|
||||
rightPanel.setLayout(rightLayout);
|
||||
|
||||
rightLayout.setHorizontalGroup(
|
||||
rightLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
|
||||
.addComponent(valueTextField, GroupLayout.PREFERRED_SIZE, 90, GroupLayout.PREFERRED_SIZE)
|
||||
.addGroup(rightLayout.createSequentialGroup()
|
||||
.addComponent(intensitySlider)
|
||||
.addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED)
|
||||
)
|
||||
);
|
||||
|
||||
rightLayout.setVerticalGroup(
|
||||
rightLayout.createSequentialGroup()
|
||||
.addComponent(valueTextField, GroupLayout.PREFERRED_SIZE,
|
||||
GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
|
||||
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addGroup(rightLayout.createParallelGroup(GroupLayout.Alignment.CENTER)
|
||||
.addComponent(intensitySlider)
|
||||
)
|
||||
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
|
||||
);
|
||||
|
||||
// -------------------------
|
||||
// MAIN LAYOUT
|
||||
// -------------------------
|
||||
GroupLayout layout = new GroupLayout(getContentPane());
|
||||
getContentPane().setLayout(layout);
|
||||
|
||||
layout.setHorizontalGroup(
|
||||
layout.createParallelGroup(GroupLayout.Alignment.LEADING)
|
||||
|
||||
// TOP BAR
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
|
||||
//.addComponent(valeurMin)
|
||||
.addGap(50)
|
||||
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
|
||||
//.addComponent(valeurMax)
|
||||
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED,
|
||||
GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(saveButton)
|
||||
.addContainerGap()
|
||||
)
|
||||
|
||||
// MAIN ROW
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addComponent(modeTab, 400, 400, Short.MAX_VALUE)
|
||||
.addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED)
|
||||
.addComponent(rightPanel, GroupLayout.PREFERRED_SIZE,
|
||||
GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
|
||||
.addContainerGap()
|
||||
)
|
||||
);
|
||||
|
||||
layout.setVerticalGroup(
|
||||
layout.createSequentialGroup()
|
||||
|
||||
// TOP BAR
|
||||
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(saveButton)
|
||||
)
|
||||
|
||||
.addPreferredGap(LayoutStyle.ComponentPlacement.RELATED)
|
||||
|
||||
// MAIN CONTENT
|
||||
.addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
|
||||
.addComponent(modeTab)
|
||||
.addComponent(rightPanel)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
private void onCutoffUpdate(ChangeEvent e) {
|
||||
if (isUpdating) return;
|
||||
isUpdating = true;
|
||||
try {
|
||||
this.intensityLabel.setText(String.valueOf(intensitySlider.getValue()));
|
||||
switch (modeTab.getSelectedIndex()) {
|
||||
case 0 -> presenter.computeLowPassFiltering(intensitySlider.getValue());
|
||||
case 1 -> presenter.computeHighPassFiltering(intensitySlider.getValue());
|
||||
}
|
||||
} finally {
|
||||
isUpdating = false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateLowPassFiltering(BufferedImage image) {
|
||||
this.imagePanel.loadImage(image);
|
||||
public void updateLowPassFiltering(Image image) {
|
||||
lowPassContainer.loadImage(ImageMapper.toBufferedImage(image));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateHighPassFiltering(BufferedImage image) {
|
||||
public void updateHighPassFiltering(Image image) {
|
||||
highPassContainer.loadImage(ImageMapper.toBufferedImage(image));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateButterworthHighPassFiltering(Image image) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateButterworthHighPassFiltering(BufferedImage image) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateButterworthLowPassFiltering(BufferedImage image) {
|
||||
public void updateButterworthLowPassFiltering(Image image) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ import infrastructure.ui.ImageMapper;
|
||||
import presenters.MainPresenter;
|
||||
import ui.implementation.components.image.ImagePanel;
|
||||
import ui.implementation.components.nav.NavBar;
|
||||
import ui.interfaces.IMainView;
|
||||
import ui.abstractions.IMainView;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
|
||||
11
src/main/java/ui/implementation/views/ViewInitializer.java
Normal file
11
src/main/java/ui/implementation/views/ViewInitializer.java
Normal file
@@ -0,0 +1,11 @@
|
||||
package ui.implementation.views;
|
||||
|
||||
import ui.abstractions.AbstractView;
|
||||
|
||||
public class ViewInitializer {
|
||||
|
||||
public static void Initialize(AbstractView view) {
|
||||
view.initComponents();
|
||||
view.initValues();
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
package ui.interfaces;
|
||||
|
||||
import java.awt.image.BufferedImage;
|
||||
|
||||
public interface IFilteringView {
|
||||
void updateLowPassFiltering(BufferedImage image);
|
||||
void updateHighPassFiltering(BufferedImage image);
|
||||
void updateButterworthHighPassFiltering(BufferedImage image);
|
||||
void updateButterworthLowPassFiltering(BufferedImage image);
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
package ui.interfaces;
|
||||
|
||||
import presenters.NavPresenter;
|
||||
|
||||
public interface INavBar {
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user