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

مشكلة فى عمل Save ل Image

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

ٍسلام للجميع

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

من قبل كنت اتحدث عن طريقة استعمال خوارزيمة ال LSB - least significant bit البت الأقل أهمية لتشفير نص داخل صورة (( تمكنت من استعماله و تشفير النص داخل الصورة دون أن تتشوه ))

الأن نحن امام مرحلة استخراج النص من الصورة الجديدة (( قبل عملية استخراج النص ، أريد ان احفظ الصورة فى مكان ما من خلال ال showSaveDialog )) كتبت الشفيرة الخاصة بذلك و لكن مواجه فيها مشاكل فى حفظ الصورة فى المكان المحدد .

(( الجزء - الذى به خلل فى الشفيرة - الخاص بحفظ الصورة الجديدة عليه comment ))

و هناك السطر

ImageIO.write(saveBufferedImage, str, saveFile);

str >>> هو formate الصورة لم أعرف كيف أحدده

الشفيرة :

-----------

ال class TestImage

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 javax.imageio.ImageIO;
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;
    private BufferedImage saveBufferedImage;

    public TestImage() {
        intializeingPanel();
        intializeingButtons();
        fileChooser = new JFileChooser();
        area = new JTextArea();
        JScrollPane scrollPane = new JScrollPane(area);
        scrollPane.setBounds(50, 500, 400, 200);
        mainPanel.add(scrollPane);
        getContentPane().add(mainPanel);
        actionListener = new MyActionListener();
    }

    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 class MyActionListener implements ActionListener {

        public void actionPerformed(ActionEvent e) {

            String str = area.getText();
            BufferedImage image = 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);
            //                File saveFile=fileChooser.getSelectedFile();
            //                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 {
            //                        ImageIO.write(saveBufferedImage, str, saveFile);
            //                    } 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;
    }
}

ال class DisplayPanel

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

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);
        }
    }

}

شكراً ,,,,,

تم تعديل هذه المشاركة بواسطة mr.beshoy في 5 يناير 2010 في 03:34

#2

يا بيشوي يمكنك أن تضع أي امتداد من الامتدادات المدعومة للصور في جافا

أظن منها jpeg و bmp و gif

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#3

أظن هنا الخطأ

ImageIO.write(saveBufferedImage, str, saveFile);

كما فهمت أن ال-str هي ال-text الذي تخزنه في الصورة، بينما هنا يجب أن تضع ال-format للصورة .

ImageIO.write(saveBufferedImage, "jpg", saveFile);
#4

ملاحظة كان هناك خطأ بسيط فى الكود الأول فى ال CONSTRUCTOR تعم تعديله

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

يا أخ علاء و NULLONE ما كده هكون مثبت نوع ال formate للأبد ...

و لكن المشكلة ليست فى هذه الآن .... المشكلة أن جزء ال SAVE مش شغال

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

الكود فى المرفقات

شكراً

stego_code v1.1(work).rar

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

#5
 /*
         now the image file is written properly but the quality is not good, you have to investigate
         where is the problem. I'm at work, don't have time to check what's wrong.
         The commented out part was a try to improve the quality of writing but it didn't help.
         seems the problem is somewhere else.
         */.
        public void actionPerformed(ActionEvent e) {

            String str = area.getText();
            BufferedImage image = 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();
//                                            iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
//                                            iwp.setCompressionQuality(1);
//                                            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));
                    saveBufferedImage = toImage(image.getWidth(), image.getHeight(), img);
                    repaint();
                } catch (UnsupportedEncodingException ex) {
                    ex.printStackTrace();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
                JOptionPane.showMessageDialog(null, "The message is hide");
            }
        }
#6

أنت تنادي على getSelectedFile، قبل المناداة على showSaveDialog، وغالبا ستحصل على NullPointerException لأنه لم يتم اختيار أي صورة، لأنك لم تظهر نافذة تخزين الملف بعد.

getSelectedFile يتم المناداة عليها بعد المناداة على showSaveDialog

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

مثال

File image = new File("/home/user/yourimage.png");
String imageName = image.getName();
String extension = imageName.substring(imageName.lastIndexOf(".")+1);
System.out.println(extension);

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

سبقني NullOne :P

تم تعديل هذه المشاركة بواسطة herch في 5 يناير 2010 في 14:07

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