From 4282b552796056fb82856faa0c61477297cc030a Mon Sep 17 00:00:00 2001 From: Lil-Ran Date: Tue, 3 Dec 2024 17:51:49 +0800 Subject: [PATCH] 1.5 sync with https://github.com/souno-io/Stegsolve/commit/b43da726041e9d76402f691904926b12e81df1bb --- stegsolve/AboutFrame.java | 2 +- stegsolve/Combiner.java | 4 +- stegsolve/FileAnalysis.java | 24 ++--- stegsolve/FrameBrowser.java | 4 +- stegsolve/StegSolve.java | 158 ++++++++++++++++----------------- stegsolve/Stereo.java | 2 + stegsolve/StereoTransform.java | 2 +- stegsolve/Transform.java | 6 +- stegsolve/Updates.txt | 5 ++ stegsolve/ZoomSlider.java | 2 +- 10 files changed, 110 insertions(+), 99 deletions(-) diff --git a/stegsolve/AboutFrame.java b/stegsolve/AboutFrame.java index 5706aef..0b9bf14 100644 --- a/stegsolve/AboutFrame.java +++ b/stegsolve/AboutFrame.java @@ -43,7 +43,7 @@ public class AboutFrame extends javax.swing.JFrame { jEditorPane1.setContentType("text/html"); jEditorPane1.setEditable(false); - 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.setText("\n

Stegsolve v1.5 by Souno Inherited in 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/Combiner.java b/stegsolve/Combiner.java index 191632b..bb5f165 100644 --- a/stegsolve/Combiner.java +++ b/stegsolve/Combiner.java @@ -192,7 +192,7 @@ public class Combiner extends JFrame } catch (Exception e) { - JOptionPane.showMessageDialog(this, "Failed to write file: "+e.toString()); + JOptionPane.showMessageDialog(this, "写入文件失败: "+e.toString()); } } } @@ -222,8 +222,10 @@ public class Combiner extends JFrame dp.setPreferredSize(new Dimension(transform.getImage().getWidth(),transform.getImage().getHeight())); this.setMaximumSize(getToolkit().getScreenSize()); pack(); + dp.apply(100); scrollPane.revalidate(); repaint(); + this.setSize(500, 600); } } diff --git a/stegsolve/FileAnalysis.java b/stegsolve/FileAnalysis.java index df5b367..196083f 100644 --- a/stegsolve/FileAnalysis.java +++ b/stegsolve/FileAnalysis.java @@ -39,9 +39,9 @@ public class FileAnalysis extends javax.swing.JFrame { { rep = new StringBuilder(); rep.append("

"); - rep.append("File format report"); + rep.append("文件格式报告"); rep.append("
"); - rep.append(("
File: "+ifile.getName())); + rep.append(("
文件: "+ifile.getName())); try{ FileInputStream fis = new FileInputStream(ifile); f = new byte[(int)ifile.length()]; @@ -51,7 +51,7 @@ public class FileAnalysis extends javax.swing.JFrame { } catch(Exception e) { - rep.append(("Error reading file: "+e.toString())); + rep.append(("读取文件时出错: "+e.toString())); } rep.append(""); report.setText(rep.toString()); @@ -66,7 +66,7 @@ public class FileAnalysis extends javax.swing.JFrame { // analyse f, write report to rep if(f.length<4) { - rep.append("
file too short?"); + rep.append("
文件太短?"); return; } if(f[0] == 'B' && f[1] == 'M') @@ -78,7 +78,7 @@ public class FileAnalysis extends javax.swing.JFrame { analyse_gif(); else if(f[0]==(byte)0xff && f[1]==(byte)0xd8) analyse_jpg(); - else rep.append("
File format analysis code not done yet!"); + else rep.append("
文件格式分析代码尚未完成!"); } /** @@ -90,8 +90,8 @@ public class FileAnalysis extends javax.swing.JFrame { cpos = analyse_jpg_sections(cpos); if(cposAdditional bytes at end of file = " +(f.length-cpos))); - rep.append("
Dump of additional bytes:"); + rep.append(("
文件末尾的附加字节数 = " +(f.length-cpos))); + rep.append("
转储附加字节:"); fdump(cpos, f.length); } } @@ -105,12 +105,12 @@ public class FileAnalysis extends javax.swing.JFrame { { if(f[pos]==(byte)0xff && f[pos+1]==(byte)0xd8) { - rep.append("
Start of Image"); + rep.append("
图像的开头"); pos+=2; } else if(f[pos] == (byte) 0xff && f[pos + 1] == (byte) 0xd9) { - rep.append("

End of Image"); + rep.append("

图像结尾"); pos+=2; return pos; } @@ -932,7 +932,7 @@ public class FileAnalysis extends javax.swing.JFrame { OKButton = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); - setTitle("File Format Analysis"); + setTitle("文件格式分析"); jPanel1.setMinimumSize(new java.awt.Dimension(400, 300)); jPanel1.setPreferredSize(new java.awt.Dimension(400, 350)); @@ -941,7 +941,7 @@ public class FileAnalysis extends javax.swing.JFrame { jScrollPane1.setPreferredSize(new java.awt.Dimension(400, 260)); report.setContentType("text/html"); - report.setFont(new java.awt.Font("Courier New", 0, 14)); // NOI18N + report.setFont(new java.awt.Font("微软雅黑", 0, 14)); // NOI18N jScrollPane1.setViewportView(report); javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); @@ -960,7 +960,7 @@ public class FileAnalysis extends javax.swing.JFrame { jPanel2.setMinimumSize(new java.awt.Dimension(400, 35)); jPanel2.setPreferredSize(new java.awt.Dimension(400, 35)); - OKButton.setText("OK"); + OKButton.setText("确认"); OKButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); OKButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { diff --git a/stegsolve/FrameBrowser.java b/stegsolve/FrameBrowser.java index 91fee56..a5bd707 100644 --- a/stegsolve/FrameBrowser.java +++ b/stegsolve/FrameBrowser.java @@ -97,7 +97,7 @@ public class FrameBrowser extends JFrame frames.add(bnext); numframes++; } - System.out.println("total frames " + numframes); + System.out.println("总帧数 " + numframes); } catch (IOException e) { @@ -253,8 +253,10 @@ public class FrameBrowser extends JFrame dp.setPreferredSize(new Dimension(bi.getWidth(),bi.getHeight())); this.setMaximumSize(getToolkit().getScreenSize()); pack(); + dp.apply(100); scrollPane.revalidate(); repaint(); + this.setSize(500, 600); } } diff --git a/stegsolve/StegSolve.java b/stegsolve/StegSolve.java index d7602f0..729512b 100644 --- a/stegsolve/StegSolve.java +++ b/stegsolve/StegSolve.java @@ -6,6 +6,8 @@ package stegsolve; +import com.formdev.flatlaf.FlatIntelliJLaf; + import javax.swing.*; import javax.swing.border.Border; import javax.swing.event.ChangeEvent; @@ -22,10 +24,10 @@ import java.awt.*; /** * StegSolve + * * @author Caesum */ -public class StegSolve extends JFrame -{ +public class StegSolve extends JFrame { static StegSolve that; /** * Menu option - about @@ -118,16 +120,17 @@ public class StegSolve extends JFrame */ private Transform transform = null; - /** Creates new form stegsolve */ - private StegSolve() - { + /** + * Creates new form stegsolve + */ + private StegSolve() { that = this; initComponents(); } // private void initComponents() { - + FlatIntelliJLaf.install(); menuBar = new JMenuBar(); menuFile = new JMenu(); fileOpen = new JMenuItem(); @@ -145,52 +148,52 @@ public class StegSolve extends JFrame setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); - menuFile.setText("File"); + menuFile.setText("文件"); fileOpen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, 0)); - fileOpen.setText("Open"); + fileOpen.setText("打开"); fileOpen.addActionListener(this::fileOpenActionPerformed); menuFile.add(fileOpen); fileSave.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, 0)); - fileSave.setText("Save As"); + fileSave.setText("另存为"); fileSave.addActionListener(this::fileSaveActionPerformed); menuFile.add(fileSave); fileExit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, 0)); - fileExit.setText("Exit"); + fileExit.setText("退出"); fileExit.addActionListener(this::fileExitActionPerformed); menuFile.add(fileExit); menuBar.add(menuFile); - menuAnalyse.setText("Analyse"); + menuAnalyse.setText("分析"); - analyseFormat.setText("File Format"); + analyseFormat.setText("文件格式"); analyseFormat.addActionListener(this::analyseFormatActionPerformed); menuAnalyse.add(analyseFormat); - analyseExtract.setText("Data Extract"); + analyseExtract.setText("数据提取"); analyseExtract.addActionListener(this::analyseExtractActionPerformed); menuAnalyse.add(analyseExtract); - stereoSolve.setText("Stereogram Solver"); + stereoSolve.setText("立体视图"); stereoSolve.addActionListener(this::stereoSolveActionPerformed); menuAnalyse.add(stereoSolve); - frameBrowse.setText("Frame Browser"); + frameBrowse.setText("帧浏览器"); frameBrowse.addActionListener(this::frameBrowseActionPerformed); menuAnalyse.add(frameBrowse); - imageCombine.setText("Image Combiner"); + imageCombine.setText("图像合成器"); imageCombine.addActionListener(this::imageCombineActionPerformed); menuAnalyse.add(imageCombine); menuBar.add(menuAnalyse); - menuHelp.setText("Help"); + menuHelp.setText("帮助"); - about.setText("About"); + about.setText("关于"); about.addActionListener(this::aboutActionPerformed); menuHelp.add(about); @@ -234,44 +237,46 @@ public class StegSolve extends JFrame 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()); - }); + // 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()) { + if (!e.isShiftDown()) { frame.removeMouseWheelListener(frame.getMouseWheelListeners()[0]); } } @Override - public void keyTyped(KeyEvent e) {} + public void keyTyped(KeyEvent e) { + } }); add(scrollPane, BorderLayout.CENTER); - backwardButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT,0), "back"); + backwardButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "back"); backwardButton.getActionMap().put("back", backButtonPress); - forwardButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT,0), "forward"); + forwardButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "forward"); forwardButton.getActionMap().put("forward", forwardButtonPress); - - this.setTitle("StegSolve 1.4 by Caesum (Mod by Giotino)"); + + this.setTitle("StegSolve 1.5 by Souno (龙腾四季专版)"); this.setMaximumSize(getToolkit().getScreenSize()); pack(); - this.setSize(500, 600); + this.setSize(800, 600); //setResizable(false); }// /** * Close the form on file exit + * * @param evt Event */ private void fileExitActionPerformed(ActionEvent evt) { @@ -281,18 +286,19 @@ public class StegSolve extends JFrame /** * This is used to map the left arrow key to the back button */ - private Action backButtonPress = new AbstractAction() - { - public void actionPerformed(ActionEvent e) - { backwardButtonActionPerformed(e);} + private Action backButtonPress = new AbstractAction() { + public void actionPerformed(ActionEvent e) { + backwardButtonActionPerformed(e); + } }; /** * Move back by one image + * * @param evt Event */ private void backwardButtonActionPerformed(ActionEvent evt) { - if(transform == null) return; + if (transform == null) return; transform.back(); updateImage(); } @@ -300,24 +306,26 @@ public class StegSolve extends JFrame /** * This is used to map the right arrow key to the forward button */ - private Action forwardButtonPress = new AbstractAction() - { - public void actionPerformed(ActionEvent e) - { forwardButtonActionPerformed(e);} + private Action forwardButtonPress = new AbstractAction() { + public void actionPerformed(ActionEvent e) { + forwardButtonActionPerformed(e); + } }; /** * Move forward by one image + * * @param evt Event */ private void forwardButtonActionPerformed(ActionEvent evt) { - if(bi == null) return; + if (bi == null) return; transform.forward(); updateImage(); } /** * Show the help/about frame + * * @param evt Event */ private void aboutActionPerformed(ActionEvent evt) { @@ -326,6 +334,7 @@ public class StegSolve extends JFrame /** * Open the file format analyser + * * @param evt Event */ private void analyseFormatActionPerformed(ActionEvent evt) { @@ -334,6 +343,7 @@ public class StegSolve extends JFrame /** * Open the stereogram solver + * * @param evt Event */ private void stereoSolveActionPerformed(ActionEvent evt) { @@ -342,6 +352,7 @@ public class StegSolve extends JFrame /** * Open the frame browser + * * @param evt Event */ private void frameBrowseActionPerformed(ActionEvent evt) { @@ -350,33 +361,31 @@ public class StegSolve extends JFrame /** * Open the image combiner + * * @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); - fileChooser.setDialogTitle("Select image to combine with"); + fileChooser.setDialogTitle("选择要合并的图像"); int rVal = fileChooser.showOpenDialog(this); System.setProperty("user.dir", fileChooser.getCurrentDirectory().getAbsolutePath()); - if(rVal == JFileChooser.APPROVE_OPTION) - { + if (rVal == JFileChooser.APPROVE_OPTION) { sfile = fileChooser.getSelectedFile(); - try - { + try { BufferedImage bi2 = null; bi2 = ImageIO.read(sfile); new Combiner(bi, bi2).setVisible(true); - } - catch (Exception e) - { - JOptionPane.showMessageDialog(this, "Failed to load file: " +e.toString()); + } catch (Exception e) { + JOptionPane.showMessageDialog(this, "加载文件失败: " + e.toString()); } } } /** * Open the data extractor + * * @param evt Event */ private void analyseExtractActionPerformed(ActionEvent evt) { @@ -385,35 +394,32 @@ public class StegSolve extends JFrame /** * Save the current transformed image + * * @param evt Event */ - private void fileSaveActionPerformed(ActionEvent evt) - { + private void fileSaveActionPerformed(ActionEvent evt) { 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()); - if(rVal == JFileChooser.APPROVE_OPTION) - { + if (rVal == JFileChooser.APPROVE_OPTION) { sfile = fileChooser.getSelectedFile(); - try - { + try { bi = transform.getImage(); - int rns = sfile.getName().lastIndexOf(".")+1; - if(rns==0) - ImageIO.write(bi, "bmp", sfile); + int rns = sfile.getName().lastIndexOf(".") + 1; + if (rns == 0) + ImageIO.write(bi, "bmp", sfile); else - ImageIO.write(bi, sfile.getName().substring(rns), sfile); - } - catch (Exception e) - { - JOptionPane.showMessageDialog(this, "Failed to write file: "+e.toString()); + ImageIO.write(bi, sfile.getName().substring(rns), sfile); + } catch (Exception e) { + JOptionPane.showMessageDialog(this, "写入文件失败: " + e.toString()); } } } /** * Open a file + * * @param evt Event */ private void fileOpenActionPerformed(ActionEvent evt) { @@ -422,8 +428,7 @@ public class StegSolve extends JFrame fileChooser.setFileFilter(filter); int rVal = fileChooser.showOpenDialog(this); System.setProperty("user.dir", fileChooser.getCurrentDirectory().getAbsolutePath()); - if(rVal == JFileChooser.APPROVE_OPTION) - { + if (rVal == JFileChooser.APPROVE_OPTION) { sfile = fileChooser.getSelectedFile(); loadImage(sfile); } @@ -436,28 +441,24 @@ public class StegSolve extends JFrame void loadImage(File sfile) { this.sfile = sfile; - try - { + try { bi = ImageIO.read(sfile); transform = new Transform(bi); newImage(); - } - catch (Exception e) - { + } catch (Exception e) { e.printStackTrace(); - JOptionPane.showMessageDialog(this, "Failed to load file: " +e.toString()); + JOptionPane.showMessageDialog(this, "加载文件失败: " + e.toString()); } } /** * Reset settings for a new image */ - private void newImage() - { + private void newImage() { nowShowing.setText(transform.getText()); dp.setImage(transform.getImage()); dp.setSize(transform.getImage().getWidth(), transform.getImage().getHeight()); - dp.setPreferredSize(new Dimension(transform.getImage().getWidth(),transform.getImage().getHeight())); + dp.setPreferredSize(new Dimension(transform.getImage().getWidth(), transform.getImage().getHeight())); this.setMaximumSize(getToolkit().getScreenSize()); zoomSlider.setValue(100); dp.apply(100); @@ -468,16 +469,15 @@ public class StegSolve extends JFrame /** * Update the image being shown for new transform */ - private void updateImage() - { + private void updateImage() { nowShowing.setText(transform.getText()); dp.setImage(transform.getImage()); repaint(); } /** - * @param args the command line arguments - */ + * @param args the command line arguments + */ public static void main(String args[]) { EventQueue.invokeLater(() -> new StegSolve().setVisible(true)); } diff --git a/stegsolve/Stereo.java b/stegsolve/Stereo.java index 614a395..f1a4e4f 100644 --- a/stegsolve/Stereo.java +++ b/stegsolve/Stereo.java @@ -214,7 +214,9 @@ public class Stereo extends JFrame this.setMaximumSize(getToolkit().getScreenSize()); pack(); scrollPane.revalidate(); + dp.apply(100); repaint(); + this.setSize(500, 600); } } diff --git a/stegsolve/StereoTransform.java b/stegsolve/StereoTransform.java index eea52fb..d3cc219 100644 --- a/stegsolve/StereoTransform.java +++ b/stegsolve/StereoTransform.java @@ -78,7 +78,7 @@ public class StereoTransform { */ public String getText() { - return "Offset: "+transNum; + return "偏移量: "+transNum; } /** diff --git a/stegsolve/Transform.java b/stegsolve/Transform.java index 1f11740..701c42c 100644 --- a/stegsolve/Transform.java +++ b/stegsolve/Transform.java @@ -375,9 +375,9 @@ public class Transform { switch(transNum) { case 0: - return "Normal Image"; + return "正常图像"; case 1: - return "Colour Inversion (Xor)"; + return "颜色反转 (Xor)"; case 2: case 3: case 4: @@ -429,7 +429,7 @@ public class Transform { case 40: return "Random colour map 3"; case 41: - return "Gray bits"; + return "灰度"; default: return ""; } diff --git a/stegsolve/Updates.txt b/stegsolve/Updates.txt index dc4225b..e52b9fa 100644 --- a/stegsolve/Updates.txt +++ b/stegsolve/Updates.txt @@ -1,3 +1,8 @@ +Version 1.5 +- 汉化部分内容 +- 美化界面为Jetbrians风格 +- 修复原来1.4版本的帧浏览器、合并图片等功能的不显示图片bug。 + Version 1.4 - Added zoom to image - Added drag&drop zone for files diff --git a/stegsolve/ZoomSlider.java b/stegsolve/ZoomSlider.java index 3445923..ec347a4 100644 --- a/stegsolve/ZoomSlider.java +++ b/stegsolve/ZoomSlider.java @@ -26,7 +26,7 @@ public class ZoomSlider extends JPanel { private List changeListeners = new ArrayList<>(); ZoomSlider(int min, int max, int defaultValue) { - JLabel tip = new JLabel("Zoom:"); + JLabel tip = new JLabel("缩放:"); add(tip);