سلام للجميع
--------------------
هنا استعملت صورة و كتبت بداخلها نص و حفظت الصورة الجديدة و لكن عندما افتح الملف لا يكون به الصورة ذات النص
المشكلة فى الحدث الخاص بالزر saveButton
الكود
----------
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.FileImageOutputStream;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.border.TitledBorder;
public class TestImage extends JFrame {
private JPanel mainPanel;
private DisplayPanel displayPanel, stegoPanel;
private JButton openButton, saveButton, empededButton, extractButton;
private JFileChooser fileChooser;
private JScrollPane normalScrollPane, stegoScrollPane;
private JTextArea area;
private MyActionListener actionListener;
public TestImage() {
actionListener = new MyActionListener();
fileChooser = new JFileChooser();
intializeingPanel();
intializeingButtons();
intializeingArea();
getContentPane().add(mainPanel);
}
public static void main(String[] args) {
TestImage testImage = new TestImage();
testImage.setDefaultCloseOperation(TestImage.EXIT_ON_CLOSE);
testImage.setSize(new Dimension(600, 300));
testImage.setLocationRelativeTo(null);
testImage.setVisible(true);
testImage.setExtendedState(MAXIMIZED_BOTH);
}
private void intializeingPanel() {
mainPanel = new JPanel(null);
mainPanel.setBounds(100, 10, 600, 300);
displayPanel = new DisplayPanel();
TitledBorder normalImageBorder = new TitledBorder("Normal image");
displayPanel.setBorder(normalImageBorder);
displayPanel.setBackground(Color.WHITE);
normalScrollPane = new JScrollPane(displayPanel,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
normalScrollPane.setBounds(50, 150, 200, 300);
mainPanel.add(normalScrollPane);
stegoPanel = new DisplayPanel();
TitledBorder stegoImageBorder = new TitledBorder("Stego image");
stegoPanel.setBorder(stegoImageBorder);
stegoPanel.setBackground(Color.WHITE);
stegoScrollPane = new JScrollPane(stegoPanel,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
stegoScrollPane.setBounds(300, 150, 200, 300);
mainPanel.add(stegoScrollPane);
}
private void intializeingButtons() {
openButton = new JButton("Open");
openButton.setBounds(50, 10, 100, 50);
openButton.addActionListener(actionListener);
mainPanel.add(openButton);
////////////////////saveButton////////////////////////
saveButton = new JButton("Save as");
saveButton.setBounds(150, 10, 100, 50);
saveButton.addActionListener(actionListener);
mainPanel.add(saveButton);
////////////////////empedbitton///////////////////////
empededButton = new JButton("Hide message");
empededButton.setBounds(250, 10, 100, 50);
empededButton.addActionListener(actionListener);
mainPanel.add(empededButton);
////////////////////extractButton////////////////////
extractButton = new JButton("Extract message");
extractButton.setBounds(350, 10, 100, 50);
mainPanel.add(extractButton);
}
private void intializeingArea() {
area = new JTextArea();
JScrollPane scrollPane = new JScrollPane(area);
scrollPane.setBounds(50, 500, 400, 200);
mainPanel.add(scrollPane);
}
private class MyActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
String str = area.getText();
BufferedImage image = null;
BufferedImage saveBufferedImage = null;
int[] imageData;
int[] img;
int offset = 0;
if (e.getSource() == openButton) {
int returnValue = fileChooser.showOpenDialog(TestImage.this);
if (returnValue == JFileChooser.APPROVE_OPTION) {
File openFile = fileChooser.getSelectedFile();
try {
displayPanel.setBufferedImage(ImageIO.read(openFile));
repaint();
} catch (Exception exception) {
exception.printStackTrace();
}
}
} else if (e.getSource() == saveButton) {
image = stegoPanel.getBufferedImage();
imageData = getImageData(image);
try {
img = hideing_text(imageData, str.getBytes("US-ASCII"), offset);
try {
saveBufferedImage = toImage(image.getWidth(), image.getHeight(), img);
} catch (IOException ex) {
ex.printStackTrace();
}
} catch (UnsupportedEncodingException ex) {
ex.printStackTrace();
}
int returnValue = fileChooser.showSaveDialog(TestImage.this);
if (returnValue == JFileChooser.APPROVE_OPTION) {
try {
File selectedFile = fileChooser.getSelectedFile();
String fileName = selectedFile.getName();
String format = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length()).toLowerCase();
// stegoPanel.getBufferedImage().flush();
// stegoPanel.setBufferedImage(saveBufferedImage);
for (String name : ImageIO.getWriterFormatNames()) {
System.out.print("\nName: " + name + " format: " + format);
if (name.equals(format)) {
ImageIO.write(saveBufferedImage, format, selectedFile);
Iterator iter = ImageIO.getImageWritersByFormatName(format);
ImageWriter writer = (ImageWriter) iter.next();
ImageWriteParam iwp = writer.getDefaultWriteParam(); FileImageOutputStream output = new FileImageOutputStream(selectedFile);
writer.setOutput(output);
IIOImage ioImage = new IIOImage(stegoPanel.getBufferedImage(), null, null);
writer.write(null, ioImage, iwp);
writer.dispose();
} else {
System.out.println(" format is not supported");
}
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
} else if (e.getSource() == empededButton) {
try {
System.out.println("is not null");
image = displayPanel.getBufferedImage();
imageData = getImageData(image);
img = hideing_text(imageData, str.getBytes("US-ASCII"), offset);
stegoPanel.setBufferedImage(toImage(image.getWidth(), image.getHeight(), img));
repaint();
} catch (UnsupportedEncodingException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
JOptionPane.showMessageDialog(null, "The message is hide");
}
}
private int[] hideing_text(int[] image, byte[] text, int offset) {
try {
if (((text.length) * 8) + offset > image.length) {
throw new IOException();
} else {
for (int i = 0; i < text.length; ++i) {
int textbyte = text;
for (int bit = 7; bit >= 0; bit--, offset++) {
int b = (textbyte >> bit) & 1;
image[offset] = ((image[offset] & 0xFE) | b);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
return image;
}
private int[] getImageData(BufferedImage image) {
int size = image.getWidth() * image.getHeight();
int[] buffer = new int[size];
image.getRGB(0, 0, image.getWidth(), image.getHeight(), buffer, 0, image.getWidth());
return buffer;
}
}
public BufferedImage toImage(int w, int h, int[] data) throws IOException {
BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
image.setRGB(0, 0, w, h, data, 0, w);
return image;
}
}import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
public class DisplayPanel extends JPanel {
private BufferedImage bufferedImage;
private Dimension PanelDimension = new Dimension();
public void setBufferedImage(BufferedImage bufferedImage) {
this.bufferedImage = bufferedImage;
PanelDimension.setSize(bufferedImage.getWidth(), bufferedImage.getHeight());
setPreferredSize(PanelDimension);
revalidate();
}
public BufferedImage getBufferedImage() {
return bufferedImage;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (bufferedImage != null) {
g.drawImage(bufferedImage, 0, 0, this);
}
}
}الكود مرفق
شكراً