// Prof.java // Programme de generation d'autostereogrammes import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JFileChooser; public class MainPanel { private static final String MSG_ERR_MOTIF_TROP_ETROIT = "Le motif n'est pas assez large"; final static int MOTIF_LARGEUR_MIN = 10; // Tout se passe dans le main a la C, l'objet c'est de la merde. public static void main(String[] args) { // Fenetre principale //JFrame frame = new JFrame("Prof"); // On charge la depthmap (carte de profondeur : "qui est loin, qui est proche ?") BufferedImage depthmap = loadDepthMap(); // On charge le motif BufferedImage motif = loadMotif(depthmap); BufferedImage autostereogramme = makeItStereo(depthmap, motif); saveAutostereogram(autostereogramme); /* // Definition du Layout Container contentPane = frame.getContentPane(); contentPane.setLayout(new BorderLayout()); // Use a label to display the image JLabel label = new JLabel(new ImageIcon(autostereogramme)); frame.getContentPane().add(label, BorderLayout.CENTER); frame.setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE); // Je sais pas trop a quoi ca sert mais ca pete. frame.pack(); frame.setVisible(true);*/ } private static void saveAutostereogram(BufferedImage image) { JFileChooser fileChooser = new JFileChooser(); fileChooser.setSelectedFile(new File("stereo.jpg")); if (JFileChooser.APPROVE_OPTION==fileChooser.showSaveDialog(null)) { File selectedFile = fileChooser.getSelectedFile(); try { ImageIO.write(image, "jpg", selectedFile); } catch (IOException e) { System.out.printf("Erreur à l'enregistrement du fichier ["+e+"]"); } } } private static BufferedImage makeItStereo(BufferedImage depthmap, BufferedImage motif) { int largeurDepthMap = depthmap.getWidth(); int hauteurDepthMap = depthmap.getHeight(); int largeurMotif = motif.getWidth(); int hauteurMotif = motif.getHeight(); int [] link = new int [largeurDepthMap]; System.out.printf("\nlargeurDepthMap : "+largeurDepthMap); System.out.printf("\nhauteurDepthMap : "+hauteurDepthMap); System.out.printf("\nlargeurMotif : "+largeurMotif); System.out.printf("\nhauteurMotif : "+hauteurMotif); BufferedImage autostereogramme = new BufferedImage(largeurDepthMap, hauteurDepthMap, motif.getType()); // L'amplitude conseillée est de 25% de la largeur du motif double amplitudeDefault = largeurMotif*.25; System.out.printf("\n\n amplitudeDefault : ["+amplitudeDefault+"]"); for(int y = 0; y=0; x--) { int motifPixel = 0; if(x == link[x]) { motifPixel = motif.getRGB((int)(Math.random()*largeurMotif), y%hauteurMotif); } else { motifPixel = motif.getRGB(link[x]%largeurMotif, y%hauteurMotif); } autostereogramme.setRGB(x, y, motifPixel); } } return autostereogramme; } private static BufferedImage loadDepthMap() { BufferedImage image = null; // Image que l'on va charger JFileChooser fileChooser = new JFileChooser(); boolean ok = false; // booleen pour gerer la sortie de la boucle d'ouverture du fichier while(!ok) { // Si l'utilisateur valide son fichier, on regarde si il est compatible if(JFileChooser.APPROVE_OPTION == fileChooser.showOpenDialog(null)) { File fichierImage = fileChooser.getSelectedFile(); if(null != (image=getImage(fichierImage))) { ok = true; } } // Si l'utilisateur annule ou qu'on rencontre un problème on n'insiste pas else { ok = true; } } return image; } // Et oue, j'ai pas mis loadPattern, je fais ce que je veux private static BufferedImage loadMotif(BufferedImage depthmap) { BufferedImage image = null; // Image que l'on va charger JFileChooser fileChooser = new JFileChooser(); boolean ok = false; // booleen pour gerer la sortie de la boucle d'ouverture du fichier while(!ok) { // Si l'utilisateur valide son fichier, on regarde si il est compatible if(JFileChooser.APPROVE_OPTION == fileChooser.showOpenDialog(null)) { File fichierImage = fileChooser.getSelectedFile(); if(null != (image=getImage(fichierImage))) { // Remarque : Pour un confort de visualisation la largeur ne devrait pas être supérieure à 5 cm. // Pour disposer d'un espace suffisant de codage, une largeur de 1 cm est un minimum. // On décide arbitrairement d'une largeur minimale if(MOTIF_LARGEUR_MIN > depthmap.getWidth()) { System.out.printf("\n["+fichierImage+"] "+MSG_ERR_MOTIF_TROP_ETROIT); image = null; } ok = true; } } // Si l'utilisateur annule ou qu'on rencontre un problème on n'insiste pas else { ok = true; } } return image; } private static BufferedImage getImage(File fichierImage) { String fileName = fichierImage.getName(); BufferedImage image = null; try { image = ImageIO.read(fichierImage); } catch (IOException e1) { System.out.printf("\nIOException : ["+e1+"]"); return null; } System.out.printf("\n["+fileName+"] Type : "+image.getType()); return image; } } /* // Bouton d'encodage avec son listener JButton encodeButton = new JButton("Encode"); encodeButton.setMnemonic(KeyEvent.VK_O); encodeButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if(0 < passwordField.getPassword().length) { char[] password=passwordExploder(passwordField.getPassword()); char[] text = new char[textArea.getText().length()]; for(int i=0; i