From d4b38e39d2d3da20d97d0f74e2e17e5097b280ae Mon Sep 17 00:00:00 2001 From: Lil-Ran Date: Tue, 3 Dec 2024 17:36:56 +0800 Subject: [PATCH] 1.5-alpha1 sync with https://github.com/Giotino/stegsolve/commit/a90fc2ef2f5a2d748b6f0548e3a5acfc4003bc7f --- stegsolve/AboutFrame.java | 8 +- stegsolve/DPanel.java | 168 ++++++++++++++++++++++++++++++++++++-- stegsolve/Extract.java | 72 ++++++++++++---- stegsolve/StegSolve.java | 164 ++++++++++++++++++++----------------- stegsolve/Updates.txt | 6 ++ stegsolve/ZoomSlider.java | 66 +++++++++++++++ 6 files changed, 378 insertions(+), 106 deletions(-) create mode 100644 stegsolve/ZoomSlider.java diff --git a/stegsolve/AboutFrame.java b/stegsolve/AboutFrame.java index fdbb91c..5706aef 100644 --- a/stegsolve/AboutFrame.java +++ b/stegsolve/AboutFrame.java @@ -37,17 +37,13 @@ public class AboutFrame extends javax.swing.JFrame { okButton.setText("OK"); okButton.setAlignmentX(0.5F); - okButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - okButtonActionPerformed(evt); - } - }); + okButton.addActionListener(this::okButtonActionPerformed); aboutPanel.setPreferredSize(new java.awt.Dimension(450, 300)); jEditorPane1.setContentType("text/html"); jEditorPane1.setEditable(false); - jEditorPane1.setText("\n
Stegsolve v1.3 by Caesum
\n
\nStegsolve is a stegano solver for challenges. It provides these main functions:\n\n

Copy/Cut and paste is available from most text using CTRL-C to copy, CTRL-V to paste and CTRL-X for cut.\n

If an image fails to load, for example because it is corrupt, then file analysis will still open the file that you just tried to view. It may, however, crash out before reporting the information that you want to know. This will work though on images where the PNG has corrupted CRC values for example.\n\n"); + jEditorPane1.setText("\n

Stegsolve v1.4 by Caesum
Mod by Giotino
\n
\nStegsolve is a stegano solver for challenges. It provides these main functions:\n\n

Copy/Cut and paste is available from most text using CTRL-C to copy, CTRL-V to paste and CTRL-X for cut.\n

If an image fails to load, for example because it is corrupt, then file analysis will still open the file that you just tried to view. It may, however, crash out before reporting the information that you want to know. This will work though on images where the PNG has corrupted CRC values for example.\n\n"); jEditorPane1.setMinimumSize(new java.awt.Dimension(150, 150)); jEditorPane1.setPreferredSize(new java.awt.Dimension(150, 150)); jScrollPane1.setViewportView(jEditorPane1); diff --git a/stegsolve/DPanel.java b/stegsolve/DPanel.java index ec5b487..89b00a5 100644 --- a/stegsolve/DPanel.java +++ b/stegsolve/DPanel.java @@ -5,8 +5,13 @@ package stegsolve; import javax.swing.*; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; +import java.awt.dnd.*; import java.awt.image.*; import java.awt.*; +import java.io.File; +import java.util.TooManyListenersException; /** * A JPanel with an image attached to it @@ -14,18 +19,25 @@ import java.awt.*; */ public class DPanel extends JPanel { + private Dimension preferredSize = new Dimension(200, 200); + private Dimension defaultSize = new Dimension(); + private Dimension currentSize = new Dimension(); + + private DropTarget dropTarget; + private DropTargetHandler dropTargetHandler; + private Point dragPoint; + + private boolean dragOver = false; + + public DPanel() { + //setBackground(Color.RED); + } + /** * The image attached to this panel */ private BufferedImage bi = null; - /** - * Constructor - */ - DPanel() - { - } - /** * Overridden paint method for the panel which * paints the image on the panel @@ -35,7 +47,7 @@ public class DPanel extends JPanel protected void paintComponent(Graphics g) { super.paintComponent(g); if(bi!=null) - g.drawImage(bi, 0, 0, this); + g.drawImage(bi, 0, 0, currentSize.width, currentSize.height, this); } /** @@ -46,8 +58,148 @@ public class DPanel extends JPanel public void setImage(BufferedImage bix) { bi = bix; + defaultSize.width = bi.getWidth(); + defaultSize.height = bi.getHeight(); setSize(bi.getWidth(), bi.getHeight()); repaint(); + //apply(100); + } + + @Override + public Dimension getPreferredSize() { + return preferredSize; + } + + public void apply(int percent) { + currentSize.width = (int)(defaultSize.width * (((float)percent)/100)); + currentSize.height = (int)(defaultSize.height * (((float)percent)/100)); + preferredSize = currentSize; + revalidate(); + repaint(); } + protected class DropTargetHandler implements DropTargetListener { + + protected void processDrag(DropTargetDragEvent dtde) { + if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { + dtde.acceptDrag(DnDConstants.ACTION_COPY); + } else { + dtde.rejectDrag(); + } + } + + @Override + public void dragEnter(DropTargetDragEvent dtde) { + processDrag(dtde); + SwingUtilities.invokeLater(new DragUpdate(true, dtde.getLocation())); + repaint(); + } + + @Override + public void dragOver(DropTargetDragEvent dtde) { + processDrag(dtde); + SwingUtilities.invokeLater(new DragUpdate(true, dtde.getLocation())); + repaint(); + } + + @Override + public void dropActionChanged(DropTargetDragEvent dtde) { + } + + @Override + public void dragExit(DropTargetEvent dte) { + SwingUtilities.invokeLater(new DragUpdate(false, null)); + repaint(); + } + + @Override + public void drop(DropTargetDropEvent dtde) { + + SwingUtilities.invokeLater(new DragUpdate(false, null)); + + Transferable transferable = dtde.getTransferable(); + if (dtde.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { + dtde.acceptDrop(dtde.getDropAction()); + try { + java.util.List transferData = (java.util.List) transferable.getTransferData(DataFlavor.javaFileListFlavor); + + if (transferData.size() == 1) { + StegSolve.that.loadImage((File)transferData.get(0)); + dtde.dropComplete(true); + } + + } catch (Exception ex) { + ex.printStackTrace(); + } + } else { + dtde.rejectDrop(); + } + } + } + + protected DropTarget getMyDropTarget() { + if (dropTarget == null) { + dropTarget = new DropTarget(this, DnDConstants.ACTION_COPY_OR_MOVE, null); + } + return dropTarget; + } + + protected DropTargetHandler getDropTargetHandler() { + if (dropTargetHandler == null) { + dropTargetHandler = new DropTargetHandler(); + } + return dropTargetHandler; + } + + @Override + public void addNotify() { + super.addNotify(); + try { + getMyDropTarget().addDropTargetListener(getDropTargetHandler()); + } catch (TooManyListenersException ex) { + ex.printStackTrace(); + } + } + + @Override + public void removeNotify() { + super.removeNotify(); + getMyDropTarget().removeDropTargetListener(getDropTargetHandler()); + } + + /* + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + if (dragOver) { + Graphics2D g2d = (Graphics2D) g.create(); + g2d.setColor(new Color(0, 255, 0, 64)); + g2d.fill(new Rectangle(getWidth(), getHeight())); + if (dragPoint != null && target != null) { + int x = dragPoint.x - 12; + int y = dragPoint.y - 12; + g2d.drawImage(target, x, y, this); + } + g2d.dispose(); + } + } + */ + + public class DragUpdate implements Runnable { + + private boolean dragOver; + private Point dragPoint; + + public DragUpdate(boolean dragOver, Point dragPoint) { + this.dragOver = dragOver; + this.dragPoint = dragPoint; + } + + @Override + public void run() { + DPanel.this.dragOver = dragOver; + DPanel.this.dragPoint = dragPoint; + DPanel.this.repaint(); + } + } } diff --git a/stegsolve/Extract.java b/stegsolve/Extract.java index 958dda3..34a18db 100644 --- a/stegsolve/Extract.java +++ b/stegsolve/Extract.java @@ -6,6 +6,8 @@ package stegsolve; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; import java.awt.image.*; import javax.swing.*; import java.io.*; @@ -402,6 +404,7 @@ public class Extract extends javax.swing.JFrame { bitPlanesPanel = new javax.swing.JPanel(); alphaBitPanel = new javax.swing.JPanel(); alphaLabel = new javax.swing.JLabel(); + aba = new javax.swing.JCheckBox(); ab7 = new javax.swing.JCheckBox(); ab6 = new javax.swing.JCheckBox(); ab5 = new javax.swing.JCheckBox(); @@ -412,6 +415,7 @@ public class Extract extends javax.swing.JFrame { ab0 = new javax.swing.JCheckBox(); redBitPanel = new javax.swing.JPanel(); redLabel = new javax.swing.JLabel(); + rba = new javax.swing.JCheckBox(); rb7 = new javax.swing.JCheckBox(); rb6 = new javax.swing.JCheckBox(); rb5 = new javax.swing.JCheckBox(); @@ -422,6 +426,7 @@ public class Extract extends javax.swing.JFrame { rb0 = new javax.swing.JCheckBox(); greenBitPanel = new javax.swing.JPanel(); greenLabel = new javax.swing.JLabel(); + gba = new javax.swing.JCheckBox(); gb7 = new javax.swing.JCheckBox(); gb6 = new javax.swing.JCheckBox(); gb5 = new javax.swing.JCheckBox(); @@ -432,6 +437,7 @@ public class Extract extends javax.swing.JFrame { gb0 = new javax.swing.JCheckBox(); blueBitPanel = new javax.swing.JPanel(); blueLabel = new javax.swing.JLabel(); + bba = new javax.swing.JCheckBox(); bb7 = new javax.swing.JCheckBox(); bb6 = new javax.swing.JCheckBox(); bb5 = new javax.swing.JCheckBox(); @@ -472,7 +478,7 @@ public class Extract extends javax.swing.JFrame { cancelButton = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); - setMinimumSize(new java.awt.Dimension(720, 560)); + setMinimumSize(new java.awt.Dimension(790, 560)); getContentPane().setLayout(new java.awt.BorderLayout(5, 5)); optionsPanel.setMinimumSize(new java.awt.Dimension(720, 280)); @@ -482,13 +488,14 @@ public class Extract extends javax.swing.JFrame { lhSettingsPanel.setMinimumSize(new java.awt.Dimension(360, 280)); lhSettingsPanel.setPreferredSize(new java.awt.Dimension(360, 280)); - bitPlanesPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Bit Planes")); - bitPlanesPanel.setMinimumSize(new java.awt.Dimension(360, 200)); - bitPlanesPanel.setPreferredSize(new java.awt.Dimension(360, 200)); + int bitPlanesWidth = 480; + + bitPlanesPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Bit Planes")); + bitPlanesPanel.setMinimumSize(new java.awt.Dimension(bitPlanesWidth, 200)); + bitPlanesPanel.setPreferredSize(new java.awt.Dimension(bitPlanesWidth, 200)); - alphaBitPanel.setMinimumSize(new java.awt.Dimension(100, 33)); alphaBitPanel.setName("alphaBitPanel"); // NOI18N - alphaBitPanel.setPreferredSize(new java.awt.Dimension(350, 34)); + alphaBitPanel.setPreferredSize(new java.awt.Dimension(bitPlanesWidth-10, 34)); alphaLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); alphaLabel.setText("Alpha"); @@ -498,6 +505,11 @@ public class Extract extends javax.swing.JFrame { alphaLabel.setPreferredSize(new java.awt.Dimension(40, 14)); alphaBitPanel.add(alphaLabel); + aba.setText("all"); + alphaBitPanel.add(aba); + + checkAllListener(aba, ab7, ab6, ab5, ab4, ab3, ab2, ab1, ab0); + ab7.setText("7"); alphaBitPanel.add(ab7); @@ -525,8 +537,7 @@ public class Extract extends javax.swing.JFrame { bitPlanesPanel.add(alphaBitPanel); alphaBitPanel.getAccessibleContext().setAccessibleName("alphaBitPanel"); - redBitPanel.setMinimumSize(new java.awt.Dimension(100, 33)); - redBitPanel.setPreferredSize(new java.awt.Dimension(350, 34)); + redBitPanel.setPreferredSize(new java.awt.Dimension(bitPlanesWidth-10, 34)); redLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); redLabel.setText("Red"); @@ -536,6 +547,11 @@ public class Extract extends javax.swing.JFrame { redLabel.setPreferredSize(new java.awt.Dimension(40, 14)); redBitPanel.add(redLabel); + rba.setText("all"); + redBitPanel.add(rba); + + checkAllListener(rba, rb7, rb6, rb5, rb4, rb3, rb2, rb1, rb0); + rb7.setText("7"); redBitPanel.add(rb7); @@ -562,8 +578,7 @@ public class Extract extends javax.swing.JFrame { bitPlanesPanel.add(redBitPanel); - greenBitPanel.setMinimumSize(new java.awt.Dimension(100, 33)); - greenBitPanel.setPreferredSize(new java.awt.Dimension(350, 34)); + greenBitPanel.setPreferredSize(new java.awt.Dimension(bitPlanesWidth-10, 34)); greenLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); greenLabel.setText("Green"); @@ -573,6 +588,11 @@ public class Extract extends javax.swing.JFrame { greenLabel.setPreferredSize(new java.awt.Dimension(40, 14)); greenBitPanel.add(greenLabel); + gba.setText("all"); + greenBitPanel.add(gba); + + checkAllListener(gba, gb7, gb6, gb5, gb4, gb3, gb2, gb1, gb0); + gb7.setText("7"); greenBitPanel.add(gb7); @@ -599,8 +619,7 @@ public class Extract extends javax.swing.JFrame { bitPlanesPanel.add(greenBitPanel); - blueBitPanel.setMinimumSize(new java.awt.Dimension(100, 33)); - blueBitPanel.setPreferredSize(new java.awt.Dimension(350, 34)); + blueBitPanel.setPreferredSize(new java.awt.Dimension(bitPlanesWidth-10, 34)); blueLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); blueLabel.setText("Blue"); @@ -610,6 +629,11 @@ public class Extract extends javax.swing.JFrame { blueLabel.setPreferredSize(new java.awt.Dimension(40, 14)); blueBitPanel.add(blueLabel); + bba.setText("all"); + blueBitPanel.add(bba); + + checkAllListener(bba, bb7, bb6, bb5, bb4, bb3, bb2, bb1, bb0); + bb7.setText("7"); blueBitPanel.add(bb7); @@ -658,8 +682,7 @@ public class Extract extends javax.swing.JFrame { rhSettingsPanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.CENTER, 0, 5)); orderSettingsPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Order settings")); - orderSettingsPanel.setMinimumSize(new java.awt.Dimension(300, 260)); - orderSettingsPanel.setPreferredSize(new java.awt.Dimension(300, 260)); + orderSettingsPanel.setPreferredSize(new java.awt.Dimension(280, 260)); orderSettingsPanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT)); extractByLabel.setText("Extract By"); @@ -676,7 +699,7 @@ public class Extract extends javax.swing.JFrame { orderSettingsPanel.add(extractByPanel); - bitOrderPanel.setPreferredSize(new java.awt.Dimension(240, 41)); + bitOrderPanel.setPreferredSize(new java.awt.Dimension(250, 41)); bitOrderPanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT)); bitOrderLabel.setText("Bit Order"); @@ -693,7 +716,7 @@ public class Extract extends javax.swing.JFrame { orderSettingsPanel.add(bitOrderPanel); - bitPlaneOrderPanel.setPreferredSize(new java.awt.Dimension(200, 120)); + bitPlaneOrderPanel.setPreferredSize(new java.awt.Dimension(250, 130)); bitPlaneOrderLabel.setText("Bit Plane Order"); @@ -831,6 +854,19 @@ public class Extract extends javax.swing.JFrame { pack(); }// //GEN-END:initComponents + private void checkAllListener(JCheckBox ca, JCheckBox c7, JCheckBox c6, JCheckBox c5, JCheckBox c4, JCheckBox c3, JCheckBox c2, JCheckBox c1, JCheckBox c0) { + ca.addItemListener(e -> { + c7.setSelected(ca.isSelected()); + c6.setSelected(ca.isSelected()); + c5.setSelected(ca.isSelected()); + c4.setSelected(ca.isSelected()); + c3.setSelected(ca.isSelected()); + c2.setSelected(ca.isSelected()); + c1.setSelected(ca.isSelected()); + c0.setSelected(ca.isSelected()); + }); + } + /** * Generate the extract and generate the preview * @param evt Event @@ -885,6 +921,7 @@ public class Extract extends javax.swing.JFrame { private javax.swing.JCheckBox ab5; private javax.swing.JCheckBox ab6; private javax.swing.JCheckBox ab7; + private javax.swing.JCheckBox aba; private javax.swing.JPanel alphaBitPanel; private javax.swing.JLabel alphaLabel; private javax.swing.JCheckBox bb0; @@ -895,6 +932,7 @@ public class Extract extends javax.swing.JFrame { private javax.swing.JCheckBox bb5; private javax.swing.JCheckBox bb6; private javax.swing.JCheckBox bb7; + private javax.swing.JCheckBox bba; private javax.swing.ButtonGroup bitGroup; private javax.swing.JLabel bitOrderLabel; private javax.swing.JPanel bitOrderPanel; @@ -920,6 +958,7 @@ public class Extract extends javax.swing.JFrame { private javax.swing.JCheckBox gb5; private javax.swing.JCheckBox gb6; private javax.swing.JCheckBox gb7; + private javax.swing.JCheckBox gba; private javax.swing.JPanel greenBitPanel; private javax.swing.JLabel greenLabel; private javax.swing.JCheckBox hdInclude; @@ -940,6 +979,7 @@ public class Extract extends javax.swing.JFrame { private javax.swing.JCheckBox rb5; private javax.swing.JCheckBox rb6; private javax.swing.JCheckBox rb7; + private javax.swing.JCheckBox rba; private javax.swing.JPanel redBitPanel; private javax.swing.JLabel redLabel; private javax.swing.JPanel rhSettingsPanel; diff --git a/stegsolve/StegSolve.java b/stegsolve/StegSolve.java index c81f108..d7602f0 100644 --- a/stegsolve/StegSolve.java +++ b/stegsolve/StegSolve.java @@ -7,6 +7,9 @@ package stegsolve; import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; import javax.swing.filechooser.*; import java.io.*; import java.awt.image.*; @@ -23,6 +26,7 @@ import java.awt.*; */ public class StegSolve extends JFrame { + static StegSolve that; /** * Menu option - about */ @@ -83,6 +87,7 @@ public class StegSolve extends JFrame * panel for buttons */ private JPanel buttonPanel; + private ZoomSlider zoomSlider; /** * Next frame button */ @@ -114,8 +119,9 @@ public class StegSolve extends JFrame private Transform transform = null; /** Creates new form stegsolve */ - public StegSolve() + private StegSolve() { + that = this; initComponents(); } @@ -143,29 +149,17 @@ public class StegSolve extends JFrame fileOpen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, 0)); fileOpen.setText("Open"); - fileOpen.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - fileOpenActionPerformed(evt); - } - }); + fileOpen.addActionListener(this::fileOpenActionPerformed); menuFile.add(fileOpen); fileSave.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, 0)); fileSave.setText("Save As"); - fileSave.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - fileSaveActionPerformed(evt); - } - }); + fileSave.addActionListener(this::fileSaveActionPerformed); menuFile.add(fileSave); fileExit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, 0)); fileExit.setText("Exit"); - fileExit.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - fileExitActionPerformed(evt); - } - }); + fileExit.addActionListener(this::fileExitActionPerformed); menuFile.add(fileExit); menuBar.add(menuFile); @@ -173,43 +167,23 @@ public class StegSolve extends JFrame menuAnalyse.setText("Analyse"); analyseFormat.setText("File Format"); - analyseFormat.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - analyseFormatActionPerformed(evt); - } - }); + analyseFormat.addActionListener(this::analyseFormatActionPerformed); menuAnalyse.add(analyseFormat); analyseExtract.setText("Data Extract"); - analyseExtract.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - analyseExtractActionPerformed(evt); - } - }); + analyseExtract.addActionListener(this::analyseExtractActionPerformed); menuAnalyse.add(analyseExtract); stereoSolve.setText("Stereogram Solver"); - stereoSolve.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - stereoSolveActionPerformed(evt); - } - }); + stereoSolve.addActionListener(this::stereoSolveActionPerformed); menuAnalyse.add(stereoSolve); frameBrowse.setText("Frame Browser"); - frameBrowse.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - frameBrowseActionPerformed(evt); - } - }); + frameBrowse.addActionListener(this::frameBrowseActionPerformed); menuAnalyse.add(frameBrowse); imageCombine.setText("Image Combiner"); - imageCombine.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - imageCombineActionPerformed(evt); - } - }); + imageCombine.addActionListener(this::imageCombineActionPerformed); menuAnalyse.add(imageCombine); menuBar.add(menuAnalyse); @@ -217,11 +191,7 @@ public class StegSolve extends JFrame menuHelp.setText("Help"); about.setText("About"); - about.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - aboutActionPerformed(evt); - } - }); + about.addActionListener(this::aboutActionPerformed); menuHelp.add(about); menuBar.add(menuHelp); @@ -230,28 +200,60 @@ public class StegSolve extends JFrame setLayout(new BorderLayout()); - this.add(nowShowing, BorderLayout.NORTH); + JPanel textZoom = new JPanel(); + textZoom.setLayout(new BorderLayout()); + + textZoom.add(nowShowing, BorderLayout.NORTH); buttonPanel = new JPanel(); backwardButton = new JButton("<"); - backwardButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - backwardButtonActionPerformed(evt); - } - }); + backwardButton.addActionListener(this::backwardButtonActionPerformed); forwardButton = new JButton(">"); - forwardButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - forwardButtonActionPerformed(evt); - } - }); + forwardButton.addActionListener(this::forwardButtonActionPerformed); buttonPanel.add(backwardButton); buttonPanel.add(forwardButton); add(buttonPanel, BorderLayout.SOUTH); + zoomSlider = new ZoomSlider(10, 1000, 100); + + zoomSlider.addChangeListener(v -> { + dp.apply(v); + dp.revalidate(); + }); + + textZoom.add(zoomSlider, BorderLayout.SOUTH); + + add(textZoom, BorderLayout.NORTH); + dp = new DPanel(); scrollPane = new JScrollPane(dp); + + //Horizontal scrolling + JFrame frame = this; + frame.addKeyListener(new KeyListener() { + @Override + public void keyPressed(KeyEvent e) { + // TODO Auto-generated method stub + if(e.isShiftDown()) { + frame.addMouseWheelListener(arg01 -> { + // TODO Auto-generated method stub + scrollPane.getHorizontalScrollBar().setValue(scrollPane.getHorizontalScrollBar().getValue()+ arg01.getWheelRotation()); + }); + } + } + + @Override + public void keyReleased(KeyEvent e) { + if(!e.isShiftDown()) { + frame.removeMouseWheelListener(frame.getMouseWheelListeners()[0]); + } + } + + @Override + public void keyTyped(KeyEvent e) {} + }); + add(scrollPane, BorderLayout.CENTER); backwardButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,0), "back"); @@ -259,9 +261,12 @@ public class StegSolve extends JFrame forwardButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT,0), "forward"); forwardButton.getActionMap().put("forward", forwardButtonPress); - this.setTitle("StegSolve 1.3 by Caesum"); + this.setTitle("StegSolve 1.4 by Caesum (Mod by Giotino)"); this.setMaximumSize(getToolkit().getScreenSize()); + pack(); + + this.setSize(500, 600); //setResizable(false); }// @@ -420,16 +425,27 @@ public class StegSolve extends JFrame if(rVal == JFileChooser.APPROVE_OPTION) { sfile = fileChooser.getSelectedFile(); - try - { - bi = ImageIO.read(sfile); - transform = new Transform(bi); - newImage(); - } - catch (Exception e) - { - JOptionPane.showMessageDialog(this, "Failed to load file: " +e.toString()); - } + loadImage(sfile); + } + } + + public void loadImage(String path) { + File sfile = new File(path); + loadImage(sfile); + } + + void loadImage(File sfile) { + this.sfile = sfile; + try + { + bi = ImageIO.read(sfile); + transform = new Transform(bi); + newImage(); + } + catch (Exception e) + { + e.printStackTrace(); + JOptionPane.showMessageDialog(this, "Failed to load file: " +e.toString()); } } @@ -440,10 +456,11 @@ public class StegSolve extends JFrame { nowShowing.setText(transform.getText()); dp.setImage(transform.getImage()); - dp.setSize(transform.getImage().getWidth(),transform.getImage().getHeight()); + dp.setSize(transform.getImage().getWidth(), transform.getImage().getHeight()); dp.setPreferredSize(new Dimension(transform.getImage().getWidth(),transform.getImage().getHeight())); this.setMaximumSize(getToolkit().getScreenSize()); - pack(); + zoomSlider.setValue(100); + dp.apply(100); scrollPane.revalidate(); repaint(); } @@ -462,11 +479,6 @@ public class StegSolve extends JFrame * @param args the command line arguments */ public static void main(String args[]) { - EventQueue.invokeLater(new Runnable() { - public void run() { - new StegSolve().setVisible(true); - } - }); + EventQueue.invokeLater(() -> new StegSolve().setVisible(true)); } - } diff --git a/stegsolve/Updates.txt b/stegsolve/Updates.txt index 42f0481..dc4225b 100644 --- a/stegsolve/Updates.txt +++ b/stegsolve/Updates.txt @@ -1,3 +1,9 @@ +Version 1.4 +- Added zoom to image +- Added drag&drop zone for files +- Added "all" option to channel planes in "Data Extract" +- Added horizontal scrolling (Shift+Mousewheel) + Version 1.3 1. Added a transform showing only the gray bits of an image. 2. CRC checks on PNGs now done, and correct CRC shown if wrong. diff --git a/stegsolve/ZoomSlider.java b/stegsolve/ZoomSlider.java new file mode 100644 index 0000000..3445923 --- /dev/null +++ b/stegsolve/ZoomSlider.java @@ -0,0 +1,66 @@ +package stegsolve; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.util.ArrayList; +import java.util.List; + +public class ZoomSlider extends JPanel { + + private JSlider slider; + private JTextField textBox; + private int value; + + public int getValue () { return value; } + + void setValue(int value) { + slider.setValue(value); + textBox.setText(String.valueOf(value)); + this.value = value; + for (SliderChangeListener scl : changeListeners) + scl.change(value); + } + + private List changeListeners = new ArrayList<>(); + + ZoomSlider(int min, int max, int defaultValue) { + JLabel tip = new JLabel("Zoom:"); + + add(tip); + + slider = new JSlider(min, max, defaultValue); + + slider.addChangeListener(e -> { + setValue(slider.getValue()); + }); + + add(slider); + + textBox = new JTextField(String.valueOf(defaultValue), 5); + + textBox.addKeyListener(new KeyAdapter() { + @Override + public void keyPressed(KeyEvent e) { + if(e.getKeyCode() == KeyEvent.VK_ENTER){ + setValue(Integer.parseInt(textBox.getText())); + } + } + }); + + slider.setMaximumSize(new Dimension(500, 25)); + + add(textBox); + + value = defaultValue; + } + + void addChangeListener(SliderChangeListener listener) { + changeListeners.add(listener); + } +} + +interface SliderChangeListener { + void change(int v); +} \ No newline at end of file