Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / Java / Recortar partes de una imagen con el mouse

Recortar partes de una imagen con el mouse

Autor jc mouse martes, febrero 14, 2017

En este oportunidad comparto una pequeña aplicación hecha en java para recortar partes de una imagen seleccionado con el mouse (ratón) todo de una manera sencilla y con poco código.

himnos de bolivia

Desarrollado con:

  • IDE: Netbeans
  • Java 8

La clase principal se llama «PhotoPanel» y se extiende de un JPanel e implementa listener para el mouse. Para seleccionar el «área de recorte» se dibuja con el mouse con clic sostenido, y para guardar la imagen, clic derecho.

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.TimerTask;
import java.util.Timer;
import javax.imageio.ImageIO;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;

/**
 * @see https://www.jc-mouse.net/
 * @author mouse
 */
public class PhotoPanel extends JPanel implements MouseMotionListener, MouseListener {

    /**
     * <<MODIFICA DIRECCION EN TU PC>>
     * Directorio donde guardar los recortes
     */
    private final String DIR = "E:\\tmp\\default\\";
    
    /**
     * Imagen a recortar
     */
    private Image photo;
    private BufferedImage BufferedImage;
    
    /**
     * Nombre de archivo deimagen
     */
    private String nameFile;
    
    /**
     * Contador de recortes
     */
    private int count=0;
    
    /**
     * Colores para la mascara
     */
    private Color color1 = new Color(255, 255, 255);
    private Color color2 = new Color(0, 0, 0);
    
    /**
     * Para la imagen que se recortara
     */
    private BufferedImage tmp_Recorte;
    
    /**
     * coordenadas y tamaño del recorte
     */
    private float clipX = 0;
    private float clipY = 0;
    private float clipWidth;
    private float clipHeight;

    /**
     * Coordenadas x,y para el dibujo del recorte
     */ 
    private int x1 = 0;
    private int y1 = 0;
    private int dx1x2 = 0;
    private int dy1y2 = 0;
    private int x2 = 0;
    private int y2 = 0;

    /**
     * bandera para el cambio de color de la mascara de recorte
     */
    boolean band = true;

    /**
     * Menu emergente
     */
    private JPopupMenu popupMenu = new JPopupMenu();

    /**
     * Constructor de clase
     */
    public PhotoPanel() {
        super();
        
        PhotoPanel.this.setSize(new Dimension(0,0));
        PhotoPanel.this.setPreferredSize(new Dimension(0,0));
        
        //eventos del raton
        PhotoPanel.this.addMouseMotionListener(PhotoPanel.this);
        PhotoPanel.this.addMouseListener(PhotoPanel.this);

        /**
         * Crea menu emergente y listener
         */
        JMenuItem menuItem = new JMenuItem("Save image");        
        menuItem.addActionListener((ActionEvent e) -> {
            saveImage();            
        });
        popupMenu.add(menuItem);

        /**
         * Timer que va cambiando el color de linea de la
         * mascara de recorte cada X tiempo 
         */
        Timer timer = new Timer();
        TimerTask timerColor = new TimerTask() {
            @Override
            public void run() {                
                color1 = (band)?new Color(255, 255, 255):new Color(0, 0, 0);
                color2 = (band)?new Color(0,0,0):new Color(255,255,255);                
                band = !band;
                repaint();
            }
        };
        timer.schedule(timerColor, 1000, 350);
    }//PhotoPanel:constructor

    @Override
    protected void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;        
        g2.setColor(new Color(255, 255, 255));
        g2.fill(new Rectangle2D.Double(0, 0, getWidth(), getHeight()));
        
        if (photo != null) {
            //se crea un lienzo del tamaño de la foto
            BufferedImage = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
            Graphics2D g2D = BufferedImage.createGraphics();
            g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            //se añade la foto grande original
            g2D.drawImage(photo, 0, 0, photo.getWidth(this), photo.getHeight(this), this);            
            
            //pinta rectangulo solido para delimitar la seccion de recorte 
            g2D.setStroke(new BasicStroke(1f));
            g2D.setColor(color1);
            drawRect(g2D);
            //pinta rectangulo segmentando  
            float dash1[] = {5.0f};
            g2D.setStroke(new BasicStroke(1.0f,
                    BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 5.0f, dash1, 0.0f));
            g2D.setColor(color2);
            drawRect(g2D);
            
            //se dibuja todo
            g2.drawImage(BufferedImage, 0, 0, this);
        }
    }

    /**
     * Pinta un rectangulo
     */
    private void drawRect(Graphics2D g2D) {
        g2D.drawLine(x1, y1, x1 + dx1x2, y1);
        g2D.drawLine(x1, y1, x1, y1 + dy1y2);
        g2D.drawLine(x1 + dx1x2, y1, x1 + dx1x2, y1 + dy1y2);
        g2D.drawLine(x1, y1 + dy1y2, x1 + dx1x2, y1 + dy1y2);
    }

    /**
     * despliega el popupmenu
     */
    private void showPopup(MouseEvent e) {
        if (e.getButton() == MouseEvent.BUTTON3) {//clic derecho
            if (e.isPopupTrigger()) {
                popupMenu.show(e.getComponent(), e.getX(), e.getY());
            }
        }
    }

    /**
     * Asigna objeto Image
     *
     * @param photo
     * @param nameFile nombre de archivo
     */
    public void setPhoto(Image photo, String nameFile) {
        if (photo != null) {
            this.photo = photo;
            this.nameFile= nameFile;
            this.setSize(new Dimension(photo.getWidth(null), photo.getHeight(null)));
            this.setPreferredSize(new Dimension(photo.getWidth(null), photo.getHeight(null)));
            //reinicia valores
            x1=0;
            y1=0;
            x2=0;
            y2=0;
            dx1x2=0;
            dy1y2=0;
            clipX=0;
            clipY=0;
            clipWidth=0;
            clipHeight=0;
            count=0;
            repaint();
        }
    }

    /**
     * Guarda imagen en disco del segmento seleccionado con el mouse
     */
    private void saveImage(){        
        tmp_Recorte = ((BufferedImage) photo).getSubimage((int) clipX, (int) clipY, (int) clipWidth, (int) clipHeight);
         try {            
            //se escribe en disco            
            count++;//contador
            ImageIO.write(tmp_Recorte, "jpg", new File( DIR + nameFile + "_" + count + ".jpg"));            
	} catch (IOException e) {
            JOptionPane.showMessageDialog(null, "Error: " + e.getMessage());
	}
    }
    
    /* ----------------------------------------------------------------
     * eventos del mouse
     ------------------------------------------------------------------ */
    @Override
    public void mouseDragged(MouseEvent e) {
        x2 = (int) e.getPoint().getX();
        y2 = (int) e.getPoint().getY();

        //evita que se salga fuera de los limites del panel
        if(x2<0)x2=0;
        if(y2<0)y2=0;
        
        //distancia recorrida
        dx1x2 = x2 - x1;
        dy1y2 = y2 - y1;
        
        //evita que se salga fuera de los limites del panel
        if( x1 + dx1x2> getWidth() ) dx1x2 = getWidth() - x1 - 1;
        if( y1 + dy1y2> getHeight( )) dy1y2 = getHeight() - y1 - 1;
               
        repaint();
    }

    @Override
    public void mouseMoved(MouseEvent e) {

    }

    @Override
    public void mouseClicked(MouseEvent e) {
        showPopup(e);
    }

    @Override
    public void mousePressed(MouseEvent e) {
        if (e.getButton() == MouseEvent.BUTTON1) {
            x1 = (int) e.getPoint().getX();
            y1 = (int) e.getPoint().getY();
        }
        showPopup(e);
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        //dimensiones del recorte
        clipX = x1;
        clipY = y1;
        clipWidth = Math.abs(dx1x2);
        clipHeight=Math.abs(dy1y2);
        
        if(dx1x2<0 & dy1y2<0){
            clipX = clipX - Math.abs(dx1x2);
            clipY = clipY - Math.abs(dy1y2);
        }else if(dy1y2<0){            
            clipY = clipY - Math.abs(dy1y2);
        }else if(dx1x2<0){
            clipX = clipX - Math.abs(dx1x2);
        }
        showPopup(e);
    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }

}//PhotoPanel:end

cut java

A continuación la aplicación en acción

Código Fuente: <<descargar desde este enlace pobre>>

enjoy!!!

Tags

Si te ha gustado podrías compartirlo o dejar un comentario. ¡Muchas gracias!
Autor: JC Mouse

Yo soy yo :) JC Mouse, Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.

Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye

Enjoy! :)

También Te Podría Interesar

OS.js: Un sistema Operativo en tu navegador

OS.js: Un sistema Operativo en tu navegador

OS.js a pesar de lo que sugiere su nombre, no es en si un Sistema Operativo, es más, en su web oficial no se nombra  por...

TextToSpeech: Convierte texto a voz

TextToSpeech: Convierte texto a voz

TextToSpeech o TTS, es el sintetizador de voz para android, en los celulares inteligentes viene un motor TTS por defecto...

Crear ayuda HTML para programa con JavaFX Swing

Crear ayuda HTML para programa con JavaFX Swing

En este post veremos como crear una aplicación de ayuda al usuario similar al extinto javahelp. Pero en esta oportunidad...

Primeros pasos con JavaFX

Primeros pasos con JavaFX

¿Qué es javaFX? JavaFX es una familia de productos y tecnologías de Sun Microsystems, adquirida por Oracle Corporation,...

Conviértete en un pintor digital con esta app

Conviértete en un pintor digital con esta app

Las aplicaciones con IA (Inteligencia Artificial) son cada vez más comunes y se encuentran en diferentes dispositivos de...

Tabla para inventarios de Entradas y Salidas

Tabla para inventarios de Entradas y Salidas

A veces navegando en la internet buscando novedades , investigando o simplemente perdiendo el tiempo 🙂 se encuentran cos...

Comparte lo que sabes

Categorias

Últimas entradas

Melody.ml  es un aplicación online que usa la I.A (Inteligencia Artificial) para procesar archivos MP3 y separar en pist...

Small Basic es un lenguaje de programación propiedad de Microsoft creado especialmente para ayudar a los estudiantes a p...

Lorca Editor es una aplicación online creada por el desarrollador español Domingo Martin el cual tiene como objetivo el...

Eratóstenes era un matemático griego del siglo  III a.C. el cual ideó una manera rápida de obtener todos los números pri...

Herramientas

Generador de Enlaces a Whatsapp