Обрезка изображения, снятого с веб-камеры, с помощью Java-апплета

Мое требование заключается в следующем.

Сделайте снимок с помощью веб-камеры и предоставьте кнопку редактирования, чтобы обрезать и сохранить изображение, используя прямоугольник с изменяемым размером.

Я сделал кодирование для веб-камеры, сделал фотографию с помощью апплета и успешно сохранил изображение. Но трудно включить функцию редактирования, используя прямоугольник с изменяемым размером. Я могу обрезать с помощью Jcrop, jquery, но проблема в том, как передать изображение, взятое из апплета, в JSP.

или есть ли способ использовать сам апплет для обрезки изображения с помощью прямоугольника.


person Mark Beryl    schedule 16.10.2012    source источник
comment
Какова конечная цель образа? Это для загрузки пользователем, для украшения веб-страницы ..?   -  person Andrew Thompson    schedule 17.10.2012
comment
Спасибо, Эндрю. Конечной целью является сохранение изображения после кадрирования пользователем. Я думаю о том, чтобы добавить объект сеанса, отправив его из апплета и получив доступ из JSP.   -  person Mark Beryl    schedule 17.10.2012
comment
Спасибо за объяснение, я думаю, что @MadProgrammer хорошо это описал.   -  person Andrew Thompson    schedule 17.10.2012
comment
Да Андрей. Это сработало отлично. Спасибо   -  person Mark Beryl    schedule 17.10.2012


Ответы (3)


Что-то типа...

введите здесь описание изображения

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

Или у вас может быть инвертированный выбор...

введите здесь описание изображения

Просто заменив код выбора краски (в методе paintComponent) на этот...

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

Важная часть здесь: НЕ используйте поле cropBounds, вы должны вызывать getCropBounds, так как оно корректирует отрицательный прямоугольник;)

Пример кода очищает обрезку на mouseRelease, но вы можете сохранить прямоугольник, пока использование не сделает что-то еще, например, двойные щелчки...

person MadProgrammer    schedule 16.10.2012
comment
Спасибо Madprogrammer. Я думаю, что это сработает для меня. Я просто проверю и дам вам знать. Еще раз спасибо - person Mark Beryl; 17.10.2012
comment
(Замечено из других комментариев) Рад, что вы разобрались. :) Пожалуйста, примите ответ, когда у вас появится такая возможность. - person Andrew Thompson; 17.10.2012

Вы можете вырезать прямоугольное изображение из существующего BufferedImage следующим образом:

BufferedImage newImage = image.getSubimage(x, y, width, height);
person Dan D.    schedule 16.10.2012
comment
Спасибо, Дэн. Проблема в прямоугольнике с изменяемым размером. - person Mark Beryl; 16.10.2012

вам нужно всего 3 поддерживающих утверждения, которые обрезают изображение

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

        }

    }
person Arpana Shree    schedule 21.03.2014