الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكلة فى حفظ صورة بداخلها نص

بدأه mr.beshoy في 10 فبراير 2010 · 1 رد · 604 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

سلام للجميع

--------------------

هنا استعملت صورة و كتبت بداخلها نص و حفظت الصورة الجديدة و لكن عندما افتح الملف لا يكون به الصورة ذات النص

المشكلة فى الحدث الخاص بالزر 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);
        }
    }

}

الكود مرفق

شكراً

stego_code v1.1(work).rar

تم تعديل هذه المشاركة بواسطة mr.beshoy في 10 فبراير 2010 في 05:07

#2

حاولت و لكن المشكلة مازالت قائمة

-----------------------------------------

المشكلة كما قولت عندما أعمل حفظ للصورة التى بها النص يُحفظ الملف و لكن دون أن يكون به الصورة .

فكرت أنى أضيف هذا السطر

   ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(output);

بعد

       FileImageOutputStream output = new FileImageOutputStream(selectedFile);

أصبح الكود الخاص بالزرار save كالتالى :

 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();
                                FileImageOutputStream output = new FileImageOutputStream(selectedFile);
                                ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(output);
                                writer.setOutput(imageOutputStream);
                                                             writer.write(stegoPanel.getBufferedImage());
                            } else {
                                System.out.println(" format is not supported");
                            }
                        }
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                }
            }

الى بيحصل لو كان صورة امتداتها Jpg

بيعطينى هذا ال exception

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Output has not been set!

at com.sun.imageio.plugins.jpeg.JPEGImageWriter.write(JPEGImageWriter.java:312)

و الملف بيكون جواه الصورة بس بيكون لونها متغير شوية

و لو صورة لها امتداد آخر بيعطينى نفس ال exception السابق

و الملف لا يكون بداخله الصورة

أتمنى تساعدونى فى المشكلة هذه

شكراً جزيلاً

تم تعديل هذه المشاركة بواسطة mr.beshoy في 11 فبراير 2010 في 17:36

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…