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

تضمين نص داخل صورة

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

هنا طبقت دالة إخفاء النص داخل صورة

لكن مواجهانى مشكلة و هى عندما أقوم بإدخال النص ثم أضغط على الزر hide لاأعرف كيف أضع الصورة الجديدة داخل ال panel التى تُسمى stegoPanel

حيث ان الصورة الجديدة من نوع byte

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

المشكلة فى الكلاس الذى يسمى TestImage

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

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

بالمناسبة المشاكل الى فى الموضوع "معالجة الصورة" انتهت

شكراً جزيلاً

stego_image_code v1.0.rar

#2

عدلت فى هيئة الكود السابق و مع ذلك المشكلة قائمة .....

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

انا هدفى أنى اكتب نص و اول ما اضغط على زر hide تظهر رسالة تقول "you hide message " ثم الصورة المحتوية على الرسالة تظهر على ال stegoPanel حتى نرى شكلها بعد عملية اخفاء نص داخلها .....

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

الكود

-----------

mport java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.awt.image.WritableRaster;
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.UIManager;
import javax.swing.border.TitledBorder;

public class TestImage extends JFrame {

    private JPanel mainPanel;
    private DisplayPanel displayPanel, stegoPanel;
    private JButton openButton, empededButton, extractButton;
    private JFileChooser fileChooser;
    private JScrollPane normalScrollPane, stegoScrollPane;
    private JTextArea area;

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

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
        }
        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);
        mainPanel.add(openButton);

        empededButton = new JButton("Hide message");
        empededButton.setBounds(150, 10, 100, 50);
        mainPanel.add(empededButton);

        extractButton = new JButton("Extract message");
        extractButton.setBounds(250, 10, 100, 50);
        mainPanel.add(extractButton);
    }

    private class MyActionListener implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            int returnValue = fileChooser.showOpenDialog(TestImage.this);
            String str = area.getText();
            BufferedImage image = null;
            byte[] imageData;
            byte[] img;
            int offset = 0;
            if (e.getSource() == openButton) {
                if (returnValue == JFileChooser.APPROVE_OPTION) {
                    File file = fileChooser.getSelectedFile();
                    try {
                        displayPanel.setBufferedImage(ImageIO.read(file));
                        repaint();
                    } catch (Exception exception) {
                        exception.printStackTrace();
                    }
                }
            } else if (e.getSource() == empededButton) {
                try {
                    if (image != null) {
                        image = displayPanel.getBufferedImage();
                        imageData = getImageData(image);
                        img = hideing_text(imageData, str.getBytes("US-ASCII"), offset);
                        stegoPanel.SetImge(img);
                        repaint();
                    }
                } catch (UnsupportedEncodingException ex) {
                    ex.printStackTrace();
                }
                JOptionPane.showMessageDialog(null, "The message is hide");//
            }
        }

        private byte[] hideing_text(byte[] image, byte[] text, int offset) {
            try {
                if (text.length > image.length) {
                    throw new IOException();
                } else {
                    for (int i = 0; i < text.length; ++i) {
                        int textbyte = text;
                        for (int bit = 7; bit > 0; bit--) {
                            int b = (textbyte >> bit) & 1;
                            image[offset] = (byte) ((image[offset] & 0xFE) | b);
                        }
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return image;
        }

        private byte[] getImageData(BufferedImage image) {
            WritableRaster raster = image.getRaster();
            DataBufferByte data = (DataBufferByte) raster.getDataBuffer();
            return (data.getData());
        }
    }
}

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();
    private byte[] imge;

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

    public void SetImge(byte[] img) {
        this.imge = img;
    }
}

أتمنى تجاوبنى

شكراً

سلام

تم تعديل هذه المشاركة بواسطة mr.beshoy في 26 ديسمبر 2009 في 00:05

#3

جرب هذا التعديل يا بيشوي :

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Transparency;
import java.awt.color.ColorSpace;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.ComponentColorModel;
import java.awt.image.DataBuffer;
import java.awt.image.DataBufferByte;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageInputStream;
import javax.imageio.stream.ImageOutputStream;
import javax.imageio.stream.MemoryCacheImageInputStream;
import javax.imageio.stream.MemoryCacheImageOutputStream;
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.UIManager;
import javax.swing.border.TitledBorder;

public class TestImage extends JFrame {

    private JPanel mainPanel;
    private DisplayPanel displayPanel, stegoPanel;
    private JButton openButton, empededButton, extractButton;
    private JFileChooser fileChooser;
    private JScrollPane normalScrollPane, stegoScrollPane;
    private JTextArea area;

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

    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
        }
        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);
        mainPanel.add(openButton);

        empededButton = new JButton("Hide message");
        empededButton.setBounds(150, 10, 100, 50);
        mainPanel.add(empededButton);

        extractButton = new JButton("Extract message");
        extractButton.setBounds(250, 10, 100, 50);
        mainPanel.add(extractButton);
    }

    private class MyActionListener implements ActionListener {

        public void actionPerformed(ActionEvent e) {

            String str = area.getText();
            BufferedImage image = null;
            byte[] imageData;
            byte[] img;
            int offset = 0;
            if (e.getSource() == openButton) {
                int returnValue = fileChooser.showOpenDialog(TestImage.this);
                if (returnValue == JFileChooser.APPROVE_OPTION) {
                    File file = fileChooser.getSelectedFile();
                    try {
                        displayPanel.setBufferedImage(ImageIO.read(file));
                        repaint();
                    } catch (Exception exception) {
                        exception.printStackTrace();
                    }
                }
            } else if (e.getSource() == empededButton) {
                try {
                //    if (image != null) {
                        System.out.println("is not null");
                        image = displayPanel.getBufferedImage();
                        imageData = getImageData(image);
                        img = hideing_text(imageData, str.getBytes("US-ASCII"), offset);


                        stegoPanel.setBufferedImage(toImage(200, 200, img));
                        repaint();
               //     }
                } catch (UnsupportedEncodingException ex) {
                    ex.printStackTrace();
                }
                catch (IOException ex) {
                    ex.printStackTrace();
                }
                JOptionPane.showMessageDialog(null, "The message is hide");
            }
        }

        private byte[] hideing_text(byte[] image, byte[] text, int offset) {
            try {
                if (text.length > image.length) {
                    throw new IOException();
                } else {
                    for (int i = 0; i < text.length; ++i) {
                        int textbyte = text;
                        for (int bit = 7; bit > 0; bit--) {
                            int b = (textbyte >> bit) & 1;
                            image[offset] = (byte) ((image[offset] & 0xFE) | b);
                        }
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return image;
        }

        private byte[] getImageData(BufferedImage image) {
            WritableRaster raster = image.getRaster();
            DataBufferByte data = (DataBufferByte) raster.getDataBuffer();
            return (data.getData());
        }


    }
    public static BufferedImage toImage(int w, int h, byte[] data)throws IOException {

           DataBuffer buffer = new DataBufferByte(data, w*h);

            int pixelStride = 4; //assuming r, g, b, skip, r, g, b, skip...
            int scanlineStride = 4*w; //no extra padding
            int[] bandOffsets = {0, 1, 2}; //r, g, b
            WritableRaster raster = Raster.createInterleavedRaster(buffer, w, h, scanlineStride, pixelStride, bandOffsets, null);

            ColorSpace colorSpace = ColorSpace.getInstance(ColorSpace.CS_sRGB);
            boolean hasAlpha = false;
            boolean isAlphaPremultiplied = false;
            int transparency = Transparency.OPAQUE;
            int transferType = DataBuffer.TYPE_BYTE;
            ColorModel colorModel = new ComponentColorModel(colorSpace, hasAlpha, isAlphaPremultiplied, transparency, transferType);

            return new BufferedImage(colorModel, raster, isAlphaPremultiplied, null);
        }
}
#4
/*

I am sorry to say that this code is garbage
so many mistakes, and full of none sense.
I fixed some things for you so you can open the image now.
Don't copy code without understanding it.

*/

stego_image_code v1.0.rar

#5

أولاً شكراص ل Mksoft و nullone

و شكراً للمساعدة و انا بفكر مازلت فى طريقة لتحسين الكود و مش هطبق كودك و خلاص يا مستر مش تقلق

أنا بحاول أفهم الأمر كويس

و لنا رجعة قريبة ....شكراً

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