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.
Desarrollado con:
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
A continuación la aplicación en acción
Código Fuente: <<descargar desde este enlace pobre>>
enjoy!!!
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! :)
Sourcetrail el explorador de código fuente de los lenguaje C, C ++, Java y Python se pasa al Software Libre y desde ahor...
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...
Espresso es un framework de testing propiedad de Google que está dirigido a desarrolladores que creen que las pruebas au...
Yachaywasi versión 3.1 es una aplicación para android que te permite crear, editar y realizar exámenes tipo test cómodam...
En este tutorial nos conectaremos a una base de datos de Firebird utilizando el lenguaje de Visual Basic, el proyecto se...
El cifrado francmasón es un cifrado por sustitución simple que cambia las letras por símbolos. Sin embargo, el uso de sí...
Si trabajas con redes sociales (RRSS) a continuación te muestro tres herramintas gratuitas que te ayudaran a la hora de...
Por lo general se usan transacciones a nivel base de datos y posteriormente se llaman estos a través de procedimientos a...
En este post, aprenderemos como conectar Visual Basic 6 con SQL Server, abrir una tabla, leer su contenido y mostrar est...
Lo que veremos en este post es la configuración del driver para PHP de SQL Server que ha creado Microsoft el cual permit...