Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / Java / Java2D / Recortar imagen

Recortar imagen

Autor jc mouse miércoles, julio 13, 2011

En esta oportunidad dejo a considerancion un codigo realizado en Java/Netbeans para recortar una imagen visualmente

Video


La imagen que utilizaremos para esta aplicacion es la de una linda japonesa cosplay 🙂

Y nuestro resultado

La clase utilizada para realizar el corte se llama jcRecorte.java, esta clase se extiende de un JPanel e implementa acciones del mouse, la clase al ser creada por su constructor, recibe como parametros un objeto del tipo BufferedImage, entonces el jpanel toma las dimensiones de esa imagen y pinta la misma en el componente.

Ademas se pinta un recuadro rojo de 160×160 pixeles (modificable) el cual nos sirve como referencia para seleccionar el lugar del corte.

La parte donde se corta la imagen es en el metodo recortar(), este metodo privado, toma la imagen original pintada en el componente y tomando las coordenadas del recuadro rojo (explicado mas arriba) utiliza el metodo «getSubimage», para extraer un pedazo de la imagen original y asignarla a un objeto tenporal BufferesImage. el resto del codigo como se puede ver más abajo, esta comentado y facilmente entendible.

package jcrecorte;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
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 javax.imageio.ImageIO;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
/**
 * @web https://www.jc-mouse.net/
 * @author Mouse
 */
public class jcPanelRecorte extends JPanel implements MouseMotionListener,MouseListener   {

    private Image FOTO_ORIGINAL;    
    private BufferedImage Imagen_en_memoria;
    private BufferedImage tmp_Recorte;

    private Graphics2D g2D;
    private boolean con_foto = false;

    //coordenadas y tamaño del recorte
    private float clipX=0;
    private float clipY=0;
    private float clipAncho=160;
    private float clipAlto=160;

    //variables para ek movimiento
    private int Pos_Marca_new_X = 0;
    private int Pos_Marca_new_Y = 0;
    private int Pos_Marca_X = 0;
    private int Pos_Marca_Y = 0;
    private int Dist_X=0;
    private int Dist_Y=0;

    private Color color_linea = new Color(200,0,0);
    private float grosor_linea = 2f;

    public jcPanelRecorte(BufferedImage f){
        this.FOTO_ORIGINAL = f;        
        this.setSize(f.getWidth(),f.getHeight());
        this.setVisible(true);
        this.con_foto=true;
          //eventos del raton
        addMouseMotionListener(this);
        addMouseListener(this);
    }

    @Override
    protected void paintComponent(Graphics g) {
      Graphics2D g2 = (Graphics2D)g;
      if(this.con_foto){
        //se crea un lienzo del tamaño de la foto
        Imagen_en_memoria = new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_INT_RGB);
        g2D = Imagen_en_memoria.createGraphics();
        g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        //se añade la foto grande original
        g2D.drawImage(FOTO_ORIGINAL,0, 0, FOTO_ORIGINAL.getWidth(this), FOTO_ORIGINAL.getHeight(this), this);
        //se crea un recuadro que sirve de referencia para el recorte
        g2D.setStroke(new BasicStroke(this.grosor_linea));
        g2D.setColor(color_linea);
        Rectangle2D r2 = new Rectangle2D.Float( clipX, clipY, clipAncho, clipAlto );
        g2D.draw(r2);        
        //se dibuja todo
        g2.drawImage(Imagen_en_memoria, 0, 0, this);
      }
    }

    //se extrae una subimagen de la imagen original del tamaño der recuadro rojo
    private void recortar(){
        tmp_Recorte = ((BufferedImage) FOTO_ORIGINAL).getSubimage((int)clipX,(int) clipY,(int) clipAncho,(int) clipAlto) ;
    }

    //metodo que guarda la imagen en disco en formato JPG
    public void guardar_imagen(String f){
        recortar();
        try {            
            //se escribe en disco            
            ImageIO.write(tmp_Recorte, "jpg", new File(f));
            JOptionPane.showMessageDialog(null, "El recorte se guardo correctamente...");
 } catch (IOException e) {
            JOptionPane.showMessageDialog(null, "Error: no se pudo guardar la imagen");
 }
   }

    /* metodos del mouse para el cuadro de recorte */
    public void mouseDragged(MouseEvent e) {
        //nuevas coordenadas
        Pos_Marca_new_X = (int)e.getPoint().getX();
        Pos_Marca_new_Y = (int)e.getPoint().getY();

        //System.out.println("new_x=" + Pos_Marca_new_X + " new_Y=" + Pos_Marca_new_Y);
        //se obtiene distancia del movimiento
        Dist_X = Pos_Marca_new_X - Pos_Marca_X;
        Dist_Y = Pos_Marca_new_Y - Pos_Marca_Y;

        //System.out.println("Dist_x=" + Dist_X + " Dist_Y=" + Dist_Y);
        //se coloca la nueva posicion
        clipX = clipX + Dist_X;
        clipY = clipY + Dist_Y;
        //System.out.println("clipX=" + clipX + " clipY=" + clipY);

        //evita que se revace los limites de la imagen
        if(clipX<0) clipX=0;
        if(clipY<0) clipY=0;
        if((clipX + this.clipAncho) > this.getWidth()) clipX = this.getWidth() - this.clipAncho ;
        if((clipY + this.clipAlto) > this.getHeight()) clipY = this.getHeight() - this.clipAlto ;        

        Pos_Marca_X = Pos_Marca_X + Dist_X ;
        Pos_Marca_Y = Pos_Marca_Y + Dist_Y ;
        this.repaint();
    }

    public void mouseMoved(MouseEvent e) {

    }

    public void mouseClicked(MouseEvent e) {

    }

    public void mousePressed(MouseEvent e) {
        Pos_Marca_X = (int)e.getPoint().getX();
        Pos_Marca_Y = (int)e.getPoint().getY();
    }

    public void mouseReleased(MouseEvent e) {

    }

    public void mouseEntered(MouseEvent e) {

    }

    public void mouseExited(MouseEvent e) {

    }

}

El codigo del proyecto del proyecto

Click para descargar

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

Conversor decimal a binario

Conversor decimal a binario

Desde que Google anuncio de que dejara de dar soporte al plugin de Eclipse y se concentrara en Android Studio, quienes t...

Código de Control en PHP v7.0 Bolivia

Código de Control en PHP v7.0 Bolivia

NUEVA ESPECIFICACIÓN TÉCNICA DEL CÓDIGO DE CONTROL (Ver.7.0) En el marco del Nuevo Sistema de Facturación implementado p...

Métodos Numéricos: Sustitución Directa

Métodos Numéricos: Sustitución Directa

El Método de Sustitución Directa básicamente consiste en asumir un valor, reemplazar el mismo en la función despejada y...

Microservicio REST Java con Spark – Parte 1

Microservicio REST Java con Spark – Parte 1

En este y un segundo post desarrollaremos un microservicio java utilizando el framework Spark que implementara las funci...

Crea un servicio web REST con PHP y MYSQL

Crea un servicio web REST con PHP y MYSQL

Servicio Web Un servicio web (en inglés, Web Service o Web services) es una tecnología que utiliza un conjunto de protoc...

Yo quiero un mar para Bolivia

Yo quiero un mar para Bolivia

La Guerra del Pacífico, también denominada Guerra del Guano y el Salitre, fue un conflicto armado acontecido entre 1879...

1 comentario en “Recortar imagen”

  1. joe dice:

    Gracias por el post, ya eh revisado muchos otros mas y me parece muy interesante lo que haces y sobre todo que lo compartes con los demas 🙂
    Saludos

Los comentarios estan cerrados

Comparte lo que sabes

Categorias

Últimas entradas

WhatsApp anuncio a través de su blog que ya se encuentra disponible la función de envío de fotos y videos TEMPORALES, es...

Muchas de las innovaciones computacionales de la NASA se desarrollaron para ayudar a explorar el espacio, pero ahora la...

TikTok es una plataforma de microvideos muy popular entre los jóvenes el cual cuenta ya con millones de videos cortps de...

Una clase JTree permite mostrar datos de una forma jerárquica y en realidad este objeto no contiene sus datos; es decir,...

Herramientas

Generador de Enlaces a Whatsapp