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
La comunidad 3D Buzz聽 era una de los lugares donde la gente curiosa de aprender a realizar videojuegos buscaba recursos[...]
Dando respuesta a una interrogante sobre el como crear objetos en tiempo de ejecuci贸n y como manipular estos, desarrolle[...]
MVC es un patr贸n de arquitectura de software que separa una aplicaci贸n en tres componentes l贸gicos principales.聽 Estos s[...]
En un post anterior vimos la forma de conectarnos a una base de datos Access con C#, pero de nada nos sirve solo conecta[...]
Tiempo atras me pidieron un ejemplo de como realizar un reporte con iReport tipo factura, recibo o como le llamen, compl[...]
Se define como Transacci贸n en base de datos a una 芦unidad l贸gica de trabajo禄 compuesta por un conjunto de operaciones qu[...]