2012-10-16 3 views
3

Ma condition est la suivante.Recadrage d'une image provenant de la webcam à l'aide de l'applet Java

Prenez une photo à l'aide de la webcam et fournissez un bouton d'édition pour recadrer et enregistrer l'image à l'aide d'un rectangle redimensionnable.

J'ai fait le codage pour webcam et pris la photo en utilisant une applet et enregistré avec succès l'image. Mais il est difficile d'activer la fonctionnalité d'édition en utilisant un rectangle redimensionnable. Je peux recadrer en utilisant Jcrop, jquery mais le problème est comment obtenir l'image prise de l'applet à la JSP.

ou est-il possible d'utiliser l'applet elle-même pour recadrer l'image en utilisant un rectangle.

+0

Quel est le but ultime de l'image? Est-ce à l'utilisateur de télécharger, de décorer la page web ..? –

+0

Merci Andrew. Le but ultime est de sauvegarder l'image après recadrage par l'utilisateur. Je pense à mettre en Session Object en envoyant à partir de l'applet et en accédant à partir de JSP. –

+0

Merci d'avoir expliqué, je pense que @MadProgrammer l'a bien couvert. –

Répondre

3

Quelque chose comme ...

enter image description here

public class ResizeCrop { 

    public static void main(String[] args) { 
     new ResizeCrop(); 
    } 

    public ResizeCrop() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException ex) { 
       } catch (InstantiationException ex) { 
       } catch (IllegalAccessException ex) { 
       } catch (UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new CropPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class CropPane extends JPanel { 

     private BufferedImage background; 
     private Rectangle cropBounds; 

     public CropPane() { 
      try { 
       background = ImageIO.read(new File("/Users/swhitehead/Dropbox/MT008.gif")); 
      } catch (IOException exp) { 
       exp.printStackTrace(); 
      } 

      MouseHandler handler = new MouseHandler(); 

      addMouseListener(handler); 
      addMouseMotionListener(handler); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(background.getWidth(), background.getHeight()); 
     } 

     protected Rectangle getCropBounds() { 
      Rectangle actualBounds = null; 
      if (cropBounds != null) { 
       int x = cropBounds.x; 
       int y = cropBounds.y; 
       int width = cropBounds.width; 
       int height = cropBounds.height; 

       if (width < 0) { 
        x += width; 
        width -= (width * 2); 
       } 
       if (height < 0) { 
        y += height; 
        height -= (height * 2); 
       } 

       actualBounds = new Rectangle(x, y, width, height); 
       System.out.println(actualBounds); 
      } 
      return actualBounds; 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 

      super.paintComponent(g); 

      Graphics2D g2d = (Graphics2D) g.create(); 
      if (background != null) { 
       int x = (getWidth() - background.getWidth())/2; 
       int y = (getHeight() - background.getHeight())/2; 
       g2d.drawImage(background, x, y, this); 
      } 

      Rectangle drawCrop = getCropBounds(); 
      if (drawCrop != null) { 
       Color color = UIManager.getColor("List.selectionBackground"); 
       g2d.setColor(color); 
       Composite composite = g2d.getComposite(); 
       g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f)); 
       g2d.fill(drawCrop); 
       g2d.setComposite(composite); 
       g2d.draw(drawCrop); 
      } 
     } 

     public class MouseHandler extends MouseAdapter { 

      @Override 
      public void mouseReleased(MouseEvent e) { 
       cropBounds = null; 
       repaint(); 
      } 

      @Override 
      public void mousePressed(MouseEvent e) { 
       cropBounds = new Rectangle(); 
       cropBounds.setLocation(e.getPoint()); 
       repaint(); 
      } 

      @Override 
      public void mouseDragged(MouseEvent e) { 
       if (cropBounds != null) { 
        Point p = e.getPoint(); 
        int width = p.x - cropBounds.x; 
        int height = p.y - cropBounds.y; 
        cropBounds.setSize(width, height); 
        repaint(); 
       } 
      } 
     } 
    } 
} 

Ou vous pouvez avoir une sélection inversée ...

enter image description here

Simplement en remplaçant le code de peinture de sélection (dans la méthode paintComponent) avec cette ...

Rectangle drawCrop = getCropBounds(); 
if (drawCrop != null) { 

    Area area = new Area(new Rectangle(0, 0, getWidth() - 1, getHeight() - 1)); 
    area.subtract(new Area(drawCrop)); 

    Color color = UIManager.getColor("List.selectionBackground"); 
    g2d.setColor(color); 
    Composite composite = g2d.getComposite(); 
    g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f)); 
    g2d.fill(area); 
    g2d.setComposite(composite); 
    g2d.draw(area); 
} 

L'important ici, est NE PAS utiliser le champ cropBounds, vous devez appeler getCropBounds comme il corrige pour un rectangle négatif;)

l'exemple de code efface la culture sur mouseRelease, mais vous pouvez garder le rectangle jusqu'à ce que l'utilisation fait quelque chose d'autre, comme un double-clic ...

+0

Merci Madprogrammer. Je pense que cela fonctionnera pour moi. Je vais juste tester et vous faire savoir. Merci encore –

+0

Merci MadProgrammer. Cela a fonctionné exactement sur mes besoins. –

+0

(Remarque d'autres commentaires) Je suis content que vous l'ayez trié. :) S'il vous plaît [accepter] (http://meta.stackexchange.com/a/65088/155831) la réponse lorsque vous avez une chance. –

1

Vous pouvez rogner une image rectangulaire d'une BufferedImage existante en faisant de cette façon:

BufferedImage newImage = image.getSubimage(x, y, width, height); 
+0

Merci Dan .. Le problème est avec le rectangle re-dimensionnable –

0

vous nee d à seulement 3 déclarations à l'appui qui recadrent l'image

/* Arpana */ 

import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.image.CropImageFilter; 
import java.awt.image.FilteredImageSource; 
import java.awt.image.ImageFilter; 
import java.awt.image.ImageProducer; 
import java.awt.*; 
import java.applet.*; 

/* 
<applet code="CropImg" width=1024 height=768> 
</applet> 
*/ 

public class CropImg extends Applet implements MouseListener 
{ 
     private static final long serialVersionUID = 1L; 
     Image img; 
     Image crop; 
     boolean cropped; 
     public void init() 
     { 
      //setSize(880, 660); 
      img = getImage(getCodeBase(), "Appu.jpg"); 
      addMouseListener(this); 

     } 

    public void mouseClicked(MouseEvent e) 
    { 
     int x = getX(); 
     int y = getY(); 

     if (cropped) 
     { 
      cropper(x, y); 
     } 
     else 
     { 
      cropped = false; 
     } 
     repaint(); 

    } 
    public void cropper(int x, int y) 
    { 

     if(x < 500) 
     { 
      x = 200; 
     } 
     if(x > 500) 
     { 
      x = 500; 
     } 
     if(y < 500) 
     { 
      y = 200; 
     } 
     if(y > 500) 
     { 
      y = 500; 
     } 
    //420,330 
     int cropX, cropY; 
     cropX = x; //-1024; 
     cropY = y; //- 768; 
     ImageFilter imgF = new CropImageFilter(500, 500, 120, 439); 
     ImageProducer imgP = new FilteredImageSource(img.getSource(), imgF); 
     crop = createImage(imgP); 
    } 
    public void mouseEntered(MouseEvent e) 
    { 

    } 

    public void mouseExited(MouseEvent e) 
      { 
      } 

    public void mousePressed(MouseEvent e) 
    { 

    } 

    public void mouseReleased(MouseEvent e) 
    {   
    } 
    public void paint(Graphics g) 
    { 
      //x = getX(); 
      //y = getY(); 

      if(cropped) 
      { 
       g.drawImage(crop,200,200, 100, 100, this); 

      } 
      else 
      { 
       g.drawImage(img,100,100, 880, 660, this); 
      } 

     } 

    }