2024-12-03 16:38:24 +08:00
|
|
|
/*
|
|
|
|
* StegSolve.java
|
|
|
|
*
|
|
|
|
* Created on 18-Apr-2011, 08:48:02
|
|
|
|
*/
|
|
|
|
|
|
|
|
package stegsolve;
|
|
|
|
|
2024-12-03 17:54:25 +08:00
|
|
|
import java.awt.*;
|
|
|
|
import java.awt.event.*;
|
2024-12-03 16:38:24 +08:00
|
|
|
import java.awt.image.*;
|
2024-12-03 17:54:25 +08:00
|
|
|
import java.io.*;
|
2024-12-03 16:38:24 +08:00
|
|
|
import javax.imageio.*;
|
2024-12-03 17:54:25 +08:00
|
|
|
import javax.swing.*;
|
|
|
|
import javax.swing.filechooser.*;
|
2024-12-03 16:38:24 +08:00
|
|
|
|
|
|
|
// todo - sort out dimensions in linux
|
|
|
|
// todo - width/height explorer
|
|
|
|
|
|
|
|
/**
|
|
|
|
* StegSolve
|
2024-12-03 17:51:49 +08:00
|
|
|
*
|
2024-12-03 16:38:24 +08:00
|
|
|
* @author Caesum
|
|
|
|
*/
|
2024-12-03 17:51:49 +08:00
|
|
|
public class StegSolve extends JFrame {
|
2024-12-03 17:36:56 +08:00
|
|
|
static StegSolve that;
|
2024-12-03 16:38:24 +08:00
|
|
|
/**
|
|
|
|
* Menu option - about
|
|
|
|
*/
|
|
|
|
private JMenuItem about;
|
|
|
|
/**
|
|
|
|
* Menu option - file exit
|
|
|
|
*/
|
|
|
|
private JMenuItem fileExit;
|
|
|
|
/**
|
|
|
|
* Menu option - file save
|
|
|
|
*/
|
|
|
|
private JMenuItem fileSave;
|
|
|
|
/**
|
|
|
|
* Menu option - file save
|
|
|
|
*/
|
|
|
|
private JMenuItem fileOpen;
|
|
|
|
/**
|
|
|
|
* Menu option - analyse format
|
|
|
|
*/
|
|
|
|
private JMenuItem analyseFormat;
|
|
|
|
/**
|
|
|
|
* Menu option - extract data
|
|
|
|
*/
|
|
|
|
private JMenuItem analyseExtract;
|
|
|
|
/**
|
|
|
|
* Menu option - solve stereogram
|
|
|
|
*/
|
|
|
|
private JMenuItem stereoSolve;
|
|
|
|
/**
|
|
|
|
* Menu option - frame browser
|
|
|
|
*/
|
|
|
|
private JMenuItem frameBrowse;
|
|
|
|
/**
|
|
|
|
* Menu option - frame browser
|
|
|
|
*/
|
|
|
|
private JMenuItem imageCombine;
|
|
|
|
/**
|
|
|
|
* Menu bar
|
|
|
|
*/
|
|
|
|
private JMenuBar menuBar;
|
|
|
|
/**
|
|
|
|
* Sub menu - file
|
|
|
|
*/
|
|
|
|
private JMenu menuFile;
|
|
|
|
/**
|
|
|
|
* Sub menu - analyse
|
|
|
|
*/
|
|
|
|
private JMenu menuAnalyse;
|
|
|
|
/**
|
|
|
|
* Sub menu - help
|
|
|
|
*/
|
|
|
|
private JMenu menuHelp;
|
|
|
|
/**
|
|
|
|
* label that shows the number of the frame currently being shown
|
|
|
|
*/
|
|
|
|
private JLabel nowShowing;
|
|
|
|
/**
|
|
|
|
* panel for buttons
|
|
|
|
*/
|
|
|
|
private JPanel buttonPanel;
|
2024-12-03 17:36:56 +08:00
|
|
|
private ZoomSlider zoomSlider;
|
2024-12-03 16:38:24 +08:00
|
|
|
/**
|
|
|
|
* Next frame button
|
|
|
|
*/
|
|
|
|
private JButton forwardButton;
|
|
|
|
/**
|
|
|
|
* Previous frame button
|
|
|
|
*/
|
|
|
|
private JButton backwardButton;
|
|
|
|
/**
|
|
|
|
* Panel with image on it
|
|
|
|
*/
|
|
|
|
private DPanel dp;
|
|
|
|
/**
|
|
|
|
* Scroll bars for panel with image
|
|
|
|
*/
|
|
|
|
private JScrollPane scrollPane;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The image file
|
|
|
|
*/
|
|
|
|
private File sfile = null;
|
|
|
|
/**
|
|
|
|
* The image
|
|
|
|
*/
|
|
|
|
private BufferedImage bi = null;
|
|
|
|
/**
|
|
|
|
* The transformation being viewed
|
|
|
|
*/
|
|
|
|
private Transform transform = null;
|
|
|
|
|
2024-12-03 17:51:49 +08:00
|
|
|
/**
|
|
|
|
* Creates new form stegsolve
|
|
|
|
*/
|
|
|
|
private StegSolve() {
|
2024-12-03 17:36:56 +08:00
|
|
|
that = this;
|
2024-12-03 16:38:24 +08:00
|
|
|
initComponents();
|
|
|
|
}
|
|
|
|
|
|
|
|
// <editor-fold defaultstate="collapsed" desc="Initcomponents()">
|
|
|
|
private void initComponents() {
|
|
|
|
menuBar = new JMenuBar();
|
|
|
|
menuFile = new JMenu();
|
|
|
|
fileOpen = new JMenuItem();
|
|
|
|
fileSave = new JMenuItem();
|
|
|
|
fileExit = new JMenuItem();
|
|
|
|
menuAnalyse = new JMenu();
|
|
|
|
analyseFormat = new JMenuItem();
|
|
|
|
analyseExtract = new JMenuItem();
|
|
|
|
stereoSolve = new JMenuItem();
|
|
|
|
frameBrowse = new JMenuItem();
|
|
|
|
imageCombine = new JMenuItem();
|
|
|
|
menuHelp = new JMenu();
|
|
|
|
about = new JMenuItem();
|
|
|
|
nowShowing = new JLabel();
|
|
|
|
|
|
|
|
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
|
|
|
|
|
2024-12-03 18:11:54 +08:00
|
|
|
menuFile.setText("File");
|
2024-12-03 16:38:24 +08:00
|
|
|
|
|
|
|
fileOpen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, 0));
|
2024-12-03 18:11:54 +08:00
|
|
|
fileOpen.setText("Open");
|
2024-12-03 17:36:56 +08:00
|
|
|
fileOpen.addActionListener(this::fileOpenActionPerformed);
|
2024-12-03 16:38:24 +08:00
|
|
|
menuFile.add(fileOpen);
|
|
|
|
|
|
|
|
fileSave.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, 0));
|
2024-12-03 18:11:54 +08:00
|
|
|
fileSave.setText("Save As");
|
2024-12-03 17:36:56 +08:00
|
|
|
fileSave.addActionListener(this::fileSaveActionPerformed);
|
2024-12-03 16:38:24 +08:00
|
|
|
menuFile.add(fileSave);
|
|
|
|
|
|
|
|
fileExit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, 0));
|
2024-12-03 18:11:54 +08:00
|
|
|
fileExit.setText("Exit");
|
2024-12-03 17:36:56 +08:00
|
|
|
fileExit.addActionListener(this::fileExitActionPerformed);
|
2024-12-03 16:38:24 +08:00
|
|
|
menuFile.add(fileExit);
|
|
|
|
|
|
|
|
menuBar.add(menuFile);
|
|
|
|
|
2024-12-03 18:11:54 +08:00
|
|
|
menuAnalyse.setText("Analyse");
|
2024-12-03 16:38:24 +08:00
|
|
|
|
2024-12-03 18:11:54 +08:00
|
|
|
analyseFormat.setText("File Format");
|
2024-12-03 17:36:56 +08:00
|
|
|
analyseFormat.addActionListener(this::analyseFormatActionPerformed);
|
2024-12-03 16:38:24 +08:00
|
|
|
menuAnalyse.add(analyseFormat);
|
|
|
|
|
2024-12-03 18:11:54 +08:00
|
|
|
analyseExtract.setText("Data Extract");
|
2024-12-03 17:36:56 +08:00
|
|
|
analyseExtract.addActionListener(this::analyseExtractActionPerformed);
|
2024-12-03 16:38:24 +08:00
|
|
|
menuAnalyse.add(analyseExtract);
|
|
|
|
|
2024-12-03 18:11:54 +08:00
|
|
|
stereoSolve.setText("Stereogram Solver");
|
2024-12-03 17:36:56 +08:00
|
|
|
stereoSolve.addActionListener(this::stereoSolveActionPerformed);
|
2024-12-03 16:38:24 +08:00
|
|
|
menuAnalyse.add(stereoSolve);
|
|
|
|
|
2024-12-03 18:11:54 +08:00
|
|
|
frameBrowse.setText("Frame Browser");
|
2024-12-03 17:36:56 +08:00
|
|
|
frameBrowse.addActionListener(this::frameBrowseActionPerformed);
|
2024-12-03 16:38:24 +08:00
|
|
|
menuAnalyse.add(frameBrowse);
|
|
|
|
|
2024-12-03 18:11:54 +08:00
|
|
|
imageCombine.setText("Image Combiner");
|
2024-12-03 17:36:56 +08:00
|
|
|
imageCombine.addActionListener(this::imageCombineActionPerformed);
|
2024-12-03 16:38:24 +08:00
|
|
|
menuAnalyse.add(imageCombine);
|
|
|
|
|
|
|
|
menuBar.add(menuAnalyse);
|
|
|
|
|
2024-12-03 18:11:54 +08:00
|
|
|
menuHelp.setText("Help");
|
2024-12-03 16:38:24 +08:00
|
|
|
|
2024-12-03 18:11:54 +08:00
|
|
|
about.setText("About");
|
2024-12-03 17:36:56 +08:00
|
|
|
about.addActionListener(this::aboutActionPerformed);
|
2024-12-03 16:38:24 +08:00
|
|
|
menuHelp.add(about);
|
|
|
|
|
|
|
|
menuBar.add(menuHelp);
|
|
|
|
|
|
|
|
setJMenuBar(menuBar);
|
|
|
|
|
|
|
|
setLayout(new BorderLayout());
|
|
|
|
|
2024-12-03 17:36:56 +08:00
|
|
|
JPanel textZoom = new JPanel();
|
|
|
|
textZoom.setLayout(new BorderLayout());
|
|
|
|
|
|
|
|
textZoom.add(nowShowing, BorderLayout.NORTH);
|
2024-12-03 16:38:24 +08:00
|
|
|
|
|
|
|
buttonPanel = new JPanel();
|
|
|
|
backwardButton = new JButton("<");
|
2024-12-03 17:36:56 +08:00
|
|
|
backwardButton.addActionListener(this::backwardButtonActionPerformed);
|
2024-12-03 16:38:24 +08:00
|
|
|
forwardButton = new JButton(">");
|
2024-12-03 17:36:56 +08:00
|
|
|
forwardButton.addActionListener(this::forwardButtonActionPerformed);
|
2024-12-03 16:38:24 +08:00
|
|
|
buttonPanel.add(backwardButton);
|
|
|
|
buttonPanel.add(forwardButton);
|
|
|
|
|
|
|
|
add(buttonPanel, BorderLayout.SOUTH);
|
|
|
|
|
2024-12-03 17:36:56 +08:00
|
|
|
zoomSlider = new ZoomSlider(10, 1000, 100);
|
|
|
|
|
|
|
|
zoomSlider.addChangeListener(v -> {
|
|
|
|
dp.apply(v);
|
|
|
|
dp.revalidate();
|
|
|
|
});
|
|
|
|
|
|
|
|
textZoom.add(zoomSlider, BorderLayout.SOUTH);
|
|
|
|
|
|
|
|
add(textZoom, BorderLayout.NORTH);
|
|
|
|
|
2024-12-03 16:38:24 +08:00
|
|
|
dp = new DPanel();
|
|
|
|
scrollPane = new JScrollPane(dp);
|
2024-12-03 17:36:56 +08:00
|
|
|
|
|
|
|
//Horizontal scrolling
|
|
|
|
JFrame frame = this;
|
|
|
|
frame.addKeyListener(new KeyListener() {
|
|
|
|
@Override
|
|
|
|
public void keyPressed(KeyEvent e) {
|
2024-12-03 17:51:49 +08:00
|
|
|
// TODO Auto-generated method stub
|
|
|
|
if (e.isShiftDown()) {
|
|
|
|
frame.addMouseWheelListener(arg01 -> {
|
|
|
|
// TODO Auto-generated method stub
|
|
|
|
scrollPane.getHorizontalScrollBar().setValue(scrollPane.getHorizontalScrollBar().getValue() + arg01.getWheelRotation());
|
|
|
|
});
|
2024-12-03 17:36:56 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void keyReleased(KeyEvent e) {
|
2024-12-03 17:51:49 +08:00
|
|
|
if (!e.isShiftDown()) {
|
2024-12-03 17:36:56 +08:00
|
|
|
frame.removeMouseWheelListener(frame.getMouseWheelListeners()[0]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2024-12-03 17:51:49 +08:00
|
|
|
public void keyTyped(KeyEvent e) {
|
|
|
|
}
|
2024-12-03 17:36:56 +08:00
|
|
|
});
|
|
|
|
|
2024-12-03 16:38:24 +08:00
|
|
|
add(scrollPane, BorderLayout.CENTER);
|
|
|
|
|
2024-12-03 17:51:49 +08:00
|
|
|
backwardButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "back");
|
2024-12-03 16:38:24 +08:00
|
|
|
backwardButton.getActionMap().put("back", backButtonPress);
|
2024-12-03 17:51:49 +08:00
|
|
|
forwardButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "forward");
|
2024-12-03 16:38:24 +08:00
|
|
|
forwardButton.getActionMap().put("forward", forwardButtonPress);
|
2024-12-03 17:51:49 +08:00
|
|
|
|
|
|
|
this.setTitle("StegSolve 1.5 by Souno (龙腾四季专版)");
|
2024-12-03 16:38:24 +08:00
|
|
|
this.setMaximumSize(getToolkit().getScreenSize());
|
2024-12-03 17:36:56 +08:00
|
|
|
|
2024-12-03 16:38:24 +08:00
|
|
|
pack();
|
2024-12-03 17:36:56 +08:00
|
|
|
|
2024-12-03 17:51:49 +08:00
|
|
|
this.setSize(800, 600);
|
2024-12-03 16:38:24 +08:00
|
|
|
//setResizable(false);
|
|
|
|
}// </editor-fold>
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Close the form on file exit
|
2024-12-03 17:51:49 +08:00
|
|
|
*
|
2024-12-03 16:38:24 +08:00
|
|
|
* @param evt Event
|
|
|
|
*/
|
|
|
|
private void fileExitActionPerformed(ActionEvent evt) {
|
|
|
|
dispose();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This is used to map the left arrow key to the back button
|
|
|
|
*/
|
2024-12-03 17:51:49 +08:00
|
|
|
private Action backButtonPress = new AbstractAction() {
|
|
|
|
public void actionPerformed(ActionEvent e) {
|
|
|
|
backwardButtonActionPerformed(e);
|
|
|
|
}
|
2024-12-03 16:38:24 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Move back by one image
|
2024-12-03 17:51:49 +08:00
|
|
|
*
|
2024-12-03 16:38:24 +08:00
|
|
|
* @param evt Event
|
|
|
|
*/
|
|
|
|
private void backwardButtonActionPerformed(ActionEvent evt) {
|
2024-12-03 17:51:49 +08:00
|
|
|
if (transform == null) return;
|
2024-12-03 16:38:24 +08:00
|
|
|
transform.back();
|
|
|
|
updateImage();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This is used to map the right arrow key to the forward button
|
|
|
|
*/
|
2024-12-03 17:51:49 +08:00
|
|
|
private Action forwardButtonPress = new AbstractAction() {
|
|
|
|
public void actionPerformed(ActionEvent e) {
|
|
|
|
forwardButtonActionPerformed(e);
|
|
|
|
}
|
2024-12-03 16:38:24 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Move forward by one image
|
2024-12-03 17:51:49 +08:00
|
|
|
*
|
2024-12-03 16:38:24 +08:00
|
|
|
* @param evt Event
|
|
|
|
*/
|
|
|
|
private void forwardButtonActionPerformed(ActionEvent evt) {
|
2024-12-03 17:51:49 +08:00
|
|
|
if (bi == null) return;
|
2024-12-03 16:38:24 +08:00
|
|
|
transform.forward();
|
|
|
|
updateImage();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Show the help/about frame
|
2024-12-03 17:51:49 +08:00
|
|
|
*
|
2024-12-03 16:38:24 +08:00
|
|
|
* @param evt Event
|
|
|
|
*/
|
|
|
|
private void aboutActionPerformed(ActionEvent evt) {
|
|
|
|
new AboutFrame().setVisible(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Open the file format analyser
|
2024-12-03 17:51:49 +08:00
|
|
|
*
|
2024-12-03 16:38:24 +08:00
|
|
|
* @param evt Event
|
|
|
|
*/
|
|
|
|
private void analyseFormatActionPerformed(ActionEvent evt) {
|
|
|
|
new FileAnalysis(sfile).setVisible(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Open the stereogram solver
|
2024-12-03 17:51:49 +08:00
|
|
|
*
|
2024-12-03 16:38:24 +08:00
|
|
|
* @param evt Event
|
|
|
|
*/
|
|
|
|
private void stereoSolveActionPerformed(ActionEvent evt) {
|
|
|
|
new Stereo(bi).setVisible(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Open the frame browser
|
2024-12-03 17:51:49 +08:00
|
|
|
*
|
2024-12-03 16:38:24 +08:00
|
|
|
* @param evt Event
|
|
|
|
*/
|
|
|
|
private void frameBrowseActionPerformed(ActionEvent evt) {
|
|
|
|
new FrameBrowser(bi, sfile).setVisible(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Open the image combiner
|
2024-12-03 17:51:49 +08:00
|
|
|
*
|
2024-12-03 16:38:24 +08:00
|
|
|
* @param evt Event
|
|
|
|
*/
|
|
|
|
private void imageCombineActionPerformed(ActionEvent evt) {
|
|
|
|
JFileChooser fileChooser = new JFileChooser(System.getProperty("user.dir"));
|
|
|
|
FileNameExtensionFilter filter = new FileNameExtensionFilter("Images", "jpg", "jpeg", "gif", "bmp", "png");
|
|
|
|
fileChooser.setFileFilter(filter);
|
2024-12-03 18:11:54 +08:00
|
|
|
fileChooser.setDialogTitle("Select image to combine with");
|
2024-12-03 16:38:24 +08:00
|
|
|
int rVal = fileChooser.showOpenDialog(this);
|
|
|
|
System.setProperty("user.dir", fileChooser.getCurrentDirectory().getAbsolutePath());
|
2024-12-03 17:51:49 +08:00
|
|
|
if (rVal == JFileChooser.APPROVE_OPTION) {
|
2024-12-03 16:38:24 +08:00
|
|
|
sfile = fileChooser.getSelectedFile();
|
2024-12-03 17:51:49 +08:00
|
|
|
try {
|
2024-12-03 16:38:24 +08:00
|
|
|
BufferedImage bi2 = null;
|
|
|
|
bi2 = ImageIO.read(sfile);
|
|
|
|
new Combiner(bi, bi2).setVisible(true);
|
2024-12-03 17:51:49 +08:00
|
|
|
} catch (Exception e) {
|
2024-12-03 18:11:54 +08:00
|
|
|
JOptionPane.showMessageDialog(this, "Failed to load file: " + e.toString());
|
2024-12-03 16:38:24 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Open the data extractor
|
2024-12-03 17:51:49 +08:00
|
|
|
*
|
2024-12-03 16:38:24 +08:00
|
|
|
* @param evt Event
|
|
|
|
*/
|
|
|
|
private void analyseExtractActionPerformed(ActionEvent evt) {
|
|
|
|
new Extract(bi).setVisible(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Save the current transformed image
|
2024-12-03 17:51:49 +08:00
|
|
|
*
|
2024-12-03 16:38:24 +08:00
|
|
|
* @param evt Event
|
|
|
|
*/
|
2024-12-03 17:51:49 +08:00
|
|
|
private void fileSaveActionPerformed(ActionEvent evt) {
|
2024-12-03 16:38:24 +08:00
|
|
|
JFileChooser fileChooser = new JFileChooser(System.getProperty("user.dir"));
|
|
|
|
fileChooser.setSelectedFile(new File("solved.bmp"));
|
|
|
|
int rVal = fileChooser.showSaveDialog(this);
|
|
|
|
System.setProperty("user.dir", fileChooser.getCurrentDirectory().getAbsolutePath());
|
2024-12-03 17:51:49 +08:00
|
|
|
if (rVal == JFileChooser.APPROVE_OPTION) {
|
2024-12-03 16:38:24 +08:00
|
|
|
sfile = fileChooser.getSelectedFile();
|
2024-12-03 17:51:49 +08:00
|
|
|
try {
|
2024-12-03 16:38:24 +08:00
|
|
|
bi = transform.getImage();
|
2024-12-03 17:51:49 +08:00
|
|
|
int rns = sfile.getName().lastIndexOf(".") + 1;
|
|
|
|
if (rns == 0)
|
|
|
|
ImageIO.write(bi, "bmp", sfile);
|
2024-12-03 16:38:24 +08:00
|
|
|
else
|
2024-12-03 17:51:49 +08:00
|
|
|
ImageIO.write(bi, sfile.getName().substring(rns), sfile);
|
|
|
|
} catch (Exception e) {
|
2024-12-03 18:11:54 +08:00
|
|
|
JOptionPane.showMessageDialog(this, "Failed to write file: " + e.toString());
|
2024-12-03 16:38:24 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Open a file
|
2024-12-03 17:51:49 +08:00
|
|
|
*
|
2024-12-03 16:38:24 +08:00
|
|
|
* @param evt Event
|
|
|
|
*/
|
|
|
|
private void fileOpenActionPerformed(ActionEvent evt) {
|
|
|
|
JFileChooser fileChooser = new JFileChooser(System.getProperty("user.dir"));
|
|
|
|
FileNameExtensionFilter filter = new FileNameExtensionFilter("Images", "jpg", "jpeg", "gif", "bmp", "png");
|
|
|
|
fileChooser.setFileFilter(filter);
|
|
|
|
int rVal = fileChooser.showOpenDialog(this);
|
|
|
|
System.setProperty("user.dir", fileChooser.getCurrentDirectory().getAbsolutePath());
|
2024-12-03 17:51:49 +08:00
|
|
|
if (rVal == JFileChooser.APPROVE_OPTION) {
|
2024-12-03 16:38:24 +08:00
|
|
|
sfile = fileChooser.getSelectedFile();
|
2024-12-03 17:36:56 +08:00
|
|
|
loadImage(sfile);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void loadImage(String path) {
|
|
|
|
File sfile = new File(path);
|
|
|
|
loadImage(sfile);
|
|
|
|
}
|
|
|
|
|
|
|
|
void loadImage(File sfile) {
|
|
|
|
this.sfile = sfile;
|
2024-12-03 17:51:49 +08:00
|
|
|
try {
|
2024-12-03 17:36:56 +08:00
|
|
|
bi = ImageIO.read(sfile);
|
|
|
|
transform = new Transform(bi);
|
|
|
|
newImage();
|
2024-12-03 17:51:49 +08:00
|
|
|
} catch (Exception e) {
|
2024-12-03 17:36:56 +08:00
|
|
|
e.printStackTrace();
|
2024-12-03 18:11:54 +08:00
|
|
|
JOptionPane.showMessageDialog(this, "Failed to load file: " + e.toString());
|
2024-12-03 16:38:24 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Reset settings for a new image
|
|
|
|
*/
|
2024-12-03 17:51:49 +08:00
|
|
|
private void newImage() {
|
2024-12-03 16:38:24 +08:00
|
|
|
nowShowing.setText(transform.getText());
|
|
|
|
dp.setImage(transform.getImage());
|
2024-12-03 17:36:56 +08:00
|
|
|
dp.setSize(transform.getImage().getWidth(), transform.getImage().getHeight());
|
2024-12-03 17:51:49 +08:00
|
|
|
dp.setPreferredSize(new Dimension(transform.getImage().getWidth(), transform.getImage().getHeight()));
|
2024-12-03 16:38:24 +08:00
|
|
|
this.setMaximumSize(getToolkit().getScreenSize());
|
2024-12-03 17:36:56 +08:00
|
|
|
zoomSlider.setValue(100);
|
|
|
|
dp.apply(100);
|
2024-12-03 16:38:24 +08:00
|
|
|
scrollPane.revalidate();
|
|
|
|
repaint();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Update the image being shown for new transform
|
|
|
|
*/
|
2024-12-03 17:51:49 +08:00
|
|
|
private void updateImage() {
|
2024-12-03 16:38:24 +08:00
|
|
|
nowShowing.setText(transform.getText());
|
|
|
|
dp.setImage(transform.getImage());
|
|
|
|
repaint();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2024-12-03 17:51:49 +08:00
|
|
|
* @param args the command line arguments
|
|
|
|
*/
|
2024-12-03 16:38:24 +08:00
|
|
|
public static void main(String args[]) {
|
2024-12-03 17:36:56 +08:00
|
|
|
EventQueue.invokeLater(() -> new StegSolve().setVisible(true));
|
2024-12-03 16:38:24 +08:00
|
|
|
}
|
|
|
|
}
|