Add low-pass and high-pass filtering

This commit is contained in:
2026-09-22 02:22:13 +02:00
parent cf3cb4d09a
commit 8b1e6ae358
26 changed files with 332 additions and 107 deletions

View File

@@ -1,4 +1,5 @@
# Projet TDS MASI 4 # Projet TDS MASI 4
--- ---
# Ce qui a changé # Ce qui a changé

View File

@@ -4,7 +4,7 @@ import com.google.inject.Injector;
import nu.pattern.OpenCV; import nu.pattern.OpenCV;
import ui.implementation.components.nav.NavBar; import ui.implementation.components.nav.NavBar;
import ui.implementation.views.MainView; import ui.implementation.views.MainView;
import ui.interfaces.IMainView; import ui.abstractions.IMainView;
import javax.swing.*; import javax.swing.*;
@@ -18,7 +18,6 @@ public class Main {
Injector injector = Guice.createInjector(new AppModule()); Injector injector = Guice.createInjector(new AppModule());
SwingUtilities.invokeLater(() -> { SwingUtilities.invokeLater(() -> {
NavBar navBar = injector.getInstance(NavBar.class); NavBar navBar = injector.getInstance(NavBar.class);
MainView view = (MainView) injector.getInstance(IMainView.class); MainView view = (MainView) injector.getInstance(IMainView.class);
view.setNavBar(navBar); view.setNavBar(navBar);

View File

@@ -14,10 +14,10 @@ import ui.implementation.components.nav.NavBar;
import ui.implementation.views.DoubleMatrix; import ui.implementation.views.DoubleMatrix;
import ui.implementation.views.FilteringView; import ui.implementation.views.FilteringView;
import ui.implementation.views.MainView; import ui.implementation.views.MainView;
import ui.interfaces.IDoubleMatrix; import ui.abstractions.IDoubleMatrix;
import ui.interfaces.IFilteringView; import ui.abstractions.IFilteringView;
import ui.interfaces.IMainView; import ui.abstractions.IMainView;
import ui.interfaces.INavBar; import ui.abstractions.INavBar;
/** /**
* Gathers some configurations in order to set the dependency injection container up * Gathers some configurations in order to set the dependency injection container up

View File

@@ -4,6 +4,9 @@ import com.google.inject.Inject;
import com.google.inject.Provider; import com.google.inject.Provider;
import ui.implementation.views.DoubleMatrix; import ui.implementation.views.DoubleMatrix;
import ui.implementation.views.FilteringView; import ui.implementation.views.FilteringView;
import ui.implementation.views.ViewInitializer;
import javax.swing.text.View;
/** /**
* Concrete implement of the INavigator interface. * Concrete implement of the INavigator interface.
@@ -27,12 +30,14 @@ public class SwingNavigator implements INavigator {
@Override @Override
public void showFourier() { public void showFourier() {
DoubleMatrix doubleMatrix = doubleMatrixProvider.get(); DoubleMatrix doubleMatrix = doubleMatrixProvider.get();
ViewInitializer.Initialize(doubleMatrix);
doubleMatrix.setVisible(true); doubleMatrix.setVisible(true);
} }
@Override @Override
public void showFiltering() { public void showFiltering() {
FilteringView filteringView = filteringProvider.get(); FilteringView filteringView = filteringProvider.get();
ViewInitializer.Initialize(filteringView);
filteringView.setVisible(true); filteringView.setVisible(true);
} }
} }

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

View File

@@ -0,0 +1,5 @@
package domain.events.filtering;
import domain.image.Image;
public record HighPassChangedEvent(Image image) { }

View File

@@ -0,0 +1,5 @@
package domain.events.filtering;
import domain.image.Image;
public record LowPassChangedEvent(Image image) { }

View File

@@ -12,7 +12,7 @@ import java.util.List;
public class GlobalLinearFiltering { public class GlobalLinearFiltering {
public static GrayScaleMatrix lowPassFiltering(GrayScaleMatrix matrix, int cutoff) { public static GrayScaleMatrix lowPassFiltering(GrayScaleMatrix matrix, double cutoff) {
int width = matrix.getWidth(); int width = matrix.getWidth();
int height = matrix.getHeight(); int height = matrix.getHeight();
@@ -97,7 +97,7 @@ public class GlobalLinearFiltering {
return new GrayScaleMatrix(pixels); 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 width = matrix.getWidth();
int height = matrix.getHeight(); int height = matrix.getHeight();

View File

@@ -11,7 +11,7 @@ import domain.image.GrayScaleMatrix;
import domain.image.Image; import domain.image.Image;
import domain.image.processing.complex.ComplexMatrix; import domain.image.processing.complex.ComplexMatrix;
import services.ImageService; import services.ImageService;
import ui.interfaces.IDoubleMatrix; import ui.abstractions.IDoubleMatrix;
import java.io.IOException; import java.io.IOException;

View File

@@ -1,21 +1,28 @@
package presenters; package presenters;
import app.state.FilteringState;
import com.google.common.eventbus.Subscribe;
import com.google.inject.Inject; import com.google.inject.Inject;
import domain.events.filtering.HighPassChangedEvent;
import domain.events.filtering.LowPassChangedEvent;
import domain.image.GrayScaleMatrix; import domain.image.GrayScaleMatrix;
import domain.image.Image; import domain.image.Image;
import services.FilteringService; import services.FilteringService;
import services.ImageService; import services.ImageService;
import ui.implementation.views.FilteringView; import ui.abstractions.IFilteringView;
import ui.interfaces.IFilteringView;
public class FilteringPresenter { public class FilteringPresenter {
private final FilteringState state;
private final ImageService imageService; private final ImageService imageService;
private final FilteringService filteringService; private final FilteringService filteringService;
private IFilteringView view; private IFilteringView view;
@Inject @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.imageService = imageService;
this.filteringService = filteringService; this.filteringService = filteringService;
} }
@@ -24,17 +31,25 @@ public class FilteringPresenter {
this.view = view; this.view = view;
} }
public Image computeLowPassFiltering(){ public void computeLowPassFiltering(int percentage){
GrayScaleMatrix matrix = imageService.getGrayScale(); 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(); GrayScaleMatrix matrix = imageService.getGrayScale();
return filteringService.highPassFiltering(matrix); Image image = filteringService.highPassFiltering(matrix, (double) percentage /100);
this.state.setHighPass(image);
} }
public Image getImage(){ @Subscribe
return imageService.getImage(); public void onLowPassUpdate(LowPassChangedEvent event){
view.updateLowPassFiltering(event.image());
}
@Subscribe
public void onHighPassUpdate(HighPassChangedEvent event){
view.updateHighPassFiltering(event.image());
} }
} }

View File

@@ -9,7 +9,7 @@ import domain.events.ModeChangedEvent;
import domain.image.Image; import domain.image.Image;
import services.ImageService; import services.ImageService;
import services.ModeService; import services.ModeService;
import ui.interfaces.IMainView; import ui.abstractions.IMainView;
/** /**
* @author Laurent Crema * @author Laurent Crema

View File

@@ -6,7 +6,7 @@ import domain.common.Mode;
import domain.image.GrayScaleMatrix; import domain.image.GrayScaleMatrix;
import services.ImageService; import services.ImageService;
import services.ModeService; import services.ModeService;
import ui.interfaces.INavBar; import ui.abstractions.INavBar;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;

View File

@@ -6,14 +6,20 @@ import domain.image.processing.filtering.GlobalLinearFiltering;
public class FilteringService { public class FilteringService {
public Image lowPassFiltering(GrayScaleMatrix matrix) { public Image lowPassFiltering(GrayScaleMatrix matrix, double percentage) {
GrayScaleMatrix filteredMatrix = GlobalLinearFiltering.lowPassFiltering(matrix, 10); double cutoff = percentage * getMaxCutoff(matrix.getWidth(), matrix.getHeight());
GrayScaleMatrix filteredMatrix = GlobalLinearFiltering.lowPassFiltering(matrix, cutoff);
return filteredMatrix.toImage(); return filteredMatrix.toImage();
} }
public Image highPassFiltering(GrayScaleMatrix matrix) { public Image highPassFiltering(GrayScaleMatrix matrix, double percentage) {
GrayScaleMatrix filteredMatrix = GlobalLinearFiltering.highPassFiltering(matrix, 10); double cutoff = percentage * getMaxCutoff(matrix.getWidth(), matrix.getHeight());
GrayScaleMatrix filteredMatrix = GlobalLinearFiltering.highPassFiltering(matrix, cutoff);
return filteredMatrix.toImage(); 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));
}
} }

View 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();
}

View File

@@ -1,4 +1,4 @@
package ui.interfaces; package ui.abstractions;
import domain.image.GrayScaleMatrix; import domain.image.GrayScaleMatrix;

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

View File

@@ -1,11 +1,7 @@
package ui.interfaces; package ui.abstractions;
import domain.common.Mode; import domain.common.Mode;
import domain.image.Image; import domain.image.Image;
import presenters.DoubleMatrixPresenter;
import presenters.MainPresenter;
import java.awt.image.BufferedImage;
public interface IMainView { public interface IMainView {

View File

@@ -0,0 +1,6 @@
package ui.abstractions;
public interface INavBar {
}

View File

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

View File

@@ -4,7 +4,6 @@ import domain.image.GrayScaleMatrix;
import domain.image.processing.histogram.Histogramme; import domain.image.processing.histogram.Histogramme;
import domain.common.Mode; import domain.common.Mode;
import jakarta.inject.Inject; import jakarta.inject.Inject;
import jdk.jshell.spi.ExecutionControl;
import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame; import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart; import org.jfree.chart.JFreeChart;
@@ -18,7 +17,7 @@ import ui.implementation.components.intent.FileChooser;
import ui.implementation.dialogs.ImageCreatorDialog; import ui.implementation.dialogs.ImageCreatorDialog;
import ui.implementation.dialogs.GreyScaleImageCreatorDialog; import ui.implementation.dialogs.GreyScaleImageCreatorDialog;
import ui.implementation.dialogs.RGBImageCreatorDialog; import ui.implementation.dialogs.RGBImageCreatorDialog;
import ui.interfaces.INavBar; import ui.abstractions.INavBar;
import javax.swing.*; import javax.swing.*;
import java.awt.event.ActionEvent; 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", linearMenu = new Menu("Linéaire","/cp_51_p1.jpg",
new Menu("Global", new Menu("Global",
new Menu("Formes", new Menu("Ideal",
new MenuItem("PasseBasIdeal", this::displayFilter), new MenuItem("Passe-bas", this::displayFilter),
new MenuItem("PasseHautIdeal", this::displayFilter), new MenuItem("Passe-haut", this::displayFilter)),
new MenuItem("PasseBasButterworth", this::displayFilter), new Menu("Butterworth",
new MenuItem("PasseHautButterworth", this::displayFilter) 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(){ private File chooseFile(){
FileChooser chooser = new FileChooser("./"); FileChooser chooser = new FileChooser("./src/main/resources");
int dialogResult = chooser.showOpenDialog(this); int dialogResult = chooser.showOpenDialog(this);
if (dialogResult != JFileChooser.APPROVE_OPTION) return null; if (dialogResult != JFileChooser.APPROVE_OPTION) return null;

View File

@@ -1,17 +1,17 @@
package ui.implementation.views; package ui.implementation.views;
import domain.image.GrayScaleMatrix; import domain.image.GrayScaleMatrix;
import domain.image.Image;
import jakarta.inject.Inject; import jakarta.inject.Inject;
import presenters.DoubleMatrixPresenter; import presenters.DoubleMatrixPresenter;
import ui.abstractions.AbstractView;
import ui.implementation.components.button.SaveButton;
import ui.implementation.components.image.ImagePanel; import ui.implementation.components.image.ImagePanel;
import ui.implementation.components.intent.FileChooser; import ui.implementation.components.intent.FileChooser;
import ui.interfaces.IDoubleMatrix; import ui.abstractions.IDoubleMatrix;
import java.awt.*; import java.awt.*;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.io.*; import java.io.*;
import java.util.Objects;
import javax.swing.*; import javax.swing.*;
import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeEvent;
@@ -19,7 +19,7 @@ import javax.swing.event.ChangeEvent;
/** /**
* @author Jean-Marc Wagner, Laurent Crema * @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 normalizedWhite;
private double normalizedBlack; private double normalizedBlack;
@@ -32,6 +32,8 @@ public class DoubleMatrix extends JFrame implements IDoubleMatrix
private ImagePanel realPreviewContainer; private ImagePanel realPreviewContainer;
private ImagePanel imaginaryPreviewContainer; private ImagePanel imaginaryPreviewContainer;
private SaveButton saveButton;
private JSlider whiteSlider; private JSlider whiteSlider;
private JTextField whiteTextField; private JTextField whiteTextField;
private JLabel maxLabel; private JLabel maxLabel;
@@ -46,17 +48,16 @@ public class DoubleMatrix extends JFrame implements IDoubleMatrix
public DoubleMatrix(DoubleMatrixPresenter presenter) public DoubleMatrix(DoubleMatrixPresenter presenter)
{ {
this.presenter = presenter; this.presenter = presenter;
initComponents();
presenter.setView(this);
initValues();
} }
private void initComponents() { @Override
public void initComponents() {
modulePreviewContainer = new ImagePanel(); this.presenter.setView(this);
phasePreviewContainer = new ImagePanel(); this.modulePreviewContainer = new ImagePanel();
realPreviewContainer = new ImagePanel(); this.phasePreviewContainer = new ImagePanel();
imaginaryPreviewContainer = new ImagePanel(); this.realPreviewContainer = new ImagePanel();
this.imaginaryPreviewContainer = new ImagePanel();
this.saveButton = new SaveButton();
blackSlider = buildSlider(); blackSlider = buildSlider();
whiteSlider = buildSlider(); whiteSlider = buildSlider();
@@ -69,15 +70,6 @@ public class DoubleMatrix extends JFrame implements IDoubleMatrix
JLabel minValueText = new JLabel("Valeur MIN :"); JLabel minValueText = new JLabel("Valeur MIN :");
JLabel maxValueText = new JLabel("Valeur MAX :"); 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(); modeTab = buildModeTab();
buildLayout(modeTab, maxValueText, minValueText, minLabel, maxLabel, saveButton); buildLayout(modeTab, maxValueText, minValueText, minLabel, maxLabel, saveButton);
@@ -86,11 +78,22 @@ public class DoubleMatrix extends JFrame implements IDoubleMatrix
pack(); pack();
} }
private void initValues(){ @Override
modeTab.setSelectedIndex(1); public void initValues(){
this.presenter.setView(this);
blackSlider.setValue(0); this.modeTab.setSelectedIndex(1);
whiteSlider.setValue(1000);
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() { private JSlider buildSlider() {
@@ -224,7 +227,7 @@ public class DoubleMatrix extends JFrame implements IDoubleMatrix
} }
private File chooseFile(){ private File chooseFile(){
FileChooser chooser = new FileChooser("./"); FileChooser chooser = new FileChooser("./src/main/resources");
int dialogResult = chooser.showOpenDialog(this); int dialogResult = chooser.showOpenDialog(this);
if (dialogResult != JFileChooser.APPROVE_OPTION) return null; if (dialogResult != JFileChooser.APPROVE_OPTION) return null;

View File

@@ -1,58 +1,190 @@
package ui.implementation.views; package ui.implementation.views;
import com.google.inject.Inject; import com.google.inject.Inject;
import domain.image.Image;
import infrastructure.ui.ImageMapper; import infrastructure.ui.ImageMapper;
import presenters.FilteringPresenter; import presenters.FilteringPresenter;
import ui.abstractions.AbstractView;
import ui.implementation.components.button.SaveButton;
import ui.implementation.components.image.ImagePanel; import ui.implementation.components.image.ImagePanel;
import ui.interfaces.IFilteringView; import ui.abstractions.IFilteringView;
import javax.swing.*; import javax.swing.*;
import java.awt.*; import javax.swing.event.ChangeEvent;
import java.awt.image.BufferedImage;
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 final FilteringPresenter presenter;
private boolean isUpdating;
@Inject @Inject
public FilteringView(FilteringPresenter presenter) { public FilteringView(FilteringPresenter presenter) {
this.presenter = presenter; this.presenter = presenter;
this.presenter.setView(this);
initComponents();
} }
private void initComponents(){ @Override
this.imagePanel = new ImagePanel(); public void initComponents(){
this.imagePanel.loadImage(ImageMapper.toBufferedImage(presenter.computeHighPassFiltering())); this.lowPassContainer = new ImagePanel();
buildLayout(); 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"); setTitle("Filtering");
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
pack(); pack();
} }
private void buildLayout(){ @Override
setLayout(new BorderLayout()); public void initValues(){
add(imagePanel, BorderLayout.CENTER); 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 @Override
public void updateLowPassFiltering(BufferedImage image) { public void updateLowPassFiltering(Image image) {
this.imagePanel.loadImage(image); lowPassContainer.loadImage(ImageMapper.toBufferedImage(image));
} }
@Override @Override
public void updateHighPassFiltering(BufferedImage image) { public void updateHighPassFiltering(Image image) {
highPassContainer.loadImage(ImageMapper.toBufferedImage(image));
}
@Override
public void updateButterworthHighPassFiltering(Image image) {
} }
@Override @Override
public void updateButterworthHighPassFiltering(BufferedImage image) { public void updateButterworthLowPassFiltering(Image image) {
}
@Override
public void updateButterworthLowPassFiltering(BufferedImage image) {
} }
} }

View File

@@ -7,7 +7,7 @@ import infrastructure.ui.ImageMapper;
import presenters.MainPresenter; import presenters.MainPresenter;
import ui.implementation.components.image.ImagePanel; import ui.implementation.components.image.ImagePanel;
import ui.implementation.components.nav.NavBar; import ui.implementation.components.nav.NavBar;
import ui.interfaces.IMainView; import ui.abstractions.IMainView;
import javax.swing.*; import javax.swing.*;
import java.awt.*; import java.awt.*;

View 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();
}
}

View File

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

View File

@@ -1,8 +0,0 @@
package ui.interfaces;
import presenters.NavPresenter;
public interface INavBar {
}