3

私の要件は次のとおりです。

ウェブカメラを使用して写真を撮り、サイズ変更可能な長方形を使用して画像を切り抜いて保存するための編集ボタンを提供します。

ウェブカメラのコーディングを行い、アプレットを使用して写真を撮り、画像を正常に保存しました。ただし、サイズ変更可能な長方形を使用して編集機能を有効にすることは困難です。Jcrop、jqueryを使用してトリミングできますが、問題は、アプレットからJSPに取得した画像を取得する方法です。

または、アプレット自体を使用して長方形を使用して画像をトリミングする方法はありますか。

4

3 に答える 3

4

何かのようなもの...

ここに画像の説明を入力してください

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ますが、ダブルクリックなど、他の何かを使用するまで長方形を保持できます...

于 2012-10-16T19:36:54.013 に答える
1

次のようにして、既存の画像から長方形の画像を切り抜くことができますBufferedImage

BufferedImage newImage = image.getSubimage(x, y, width, height);
于 2012-10-16T15:26:18.633 に答える
0

画像を切り抜く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);
            }

        }

    }
于 2014-03-21T05:40:37.600 に答える