Entrada destacada

Como usar enums en Android, kotlin

Cortar imágenes en Java (Recortar en n partes)

Para obtener n partes rectangulares de una imagen podemos hacer uso del método java.awt.image.CropImageFilter, éste acompañado de FilterImageSource para ir guardando cada uno de los segmentos como una imagen independiente.

Lo primero que realizaremos será una clase que herede de la clase JPanel. La variable imagenPrincipal almacenará la imagen original a recortar, las variables enteras para almacenar el ancho y alto de la imagen. Después inicializamos el panel desde su constructor, en el método initBoard() definiremos las dimensiones del panel.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
public class Lienzo extends JPanel {

    private BufferedImage imagenPrincipal;
    private int width, height;
    private Image imagePart1, imagePart2;

    public Lienzo() throws IOException {
        initBoard();
    }

    private void initBoard() throws IOException {
        loadImage();
        setPreferredSize(new Dimension(width, height + 2));
    }

El método loadIamge(), carga el archivo de imagen que se desea dividir una vez cargada la imagen se obtienen los valores de ancho y alto para ajustar las medidas del panel.
En CropImageFilter se especifican los puntos iniciales (x, y) de donde se desea iniciar el recorte y los dos siguientes parámetros son para especificar el ancho y alto del recorte. El ejemplo siguiente obtiene 2 partes de una imagen. 

private void loadImage() throws IOException {
    imagenPrincipal = ImageIO.read(new File("8312.png"));
    
    width = imagenPrincipal.getWidth(null);
    height = imagenPrincipal.getHeight(null);

    imagePart1 = createImage(new FilteredImageSource(imagenPrincipal.getSource(),
        new CropImageFilter(0, 0,width , height / 2)));        
    imagePart2 = createImage(new FilteredImageSource(imagenPrincipal.getSource(),
        new CropImageFilter(0, height / 2, width, height / 2)));
}


Una vez que se han obtenido las partes dibujamos la imágenes.

    @Override
    public void paintComponent(Graphics g) {
        g.drawImage(imagePart2, 0, 0, null);
        g.drawImage(imagePart1, 0, height / 2 + 2, null);
    }


Como se nota, hemos cambiado sus posiciones para que se pueda notar que la imagen a sido dividida en dos.


Utilizando bucles anidados para recortar múltiples veces la imagen.


Ahora utilizando bucles for podemos dividir la imagen en n piezas, suponiendo que queremos dividir la imagen en 25 piezas anidamos los bucles para recorrer la imagen 5 veces a lo ancho por 5 veces a lo alto. Cada una de la piezas obtenidas en cada ciclo debe irse guardando en un ArrayList que este disponible para toda la clase. Entonces debemos definirlo como propiedad de la clase.

1
2
3
4
5
6
7
public class Lienzo extends JPanel {

    private BufferedImage imagenPrincipal;
    private int width, height;
    private Image imagenPart1, imagenPart2;

    private ArrayList<Image> imagenPartes = new ArrayList<>();

El recorrido para obtener las partes de la imagen queda de la siguiente manera.

for(int i = 0; i < 5; i++){
    for (int j = 0; j  < 5; j++){
        Image imagen = createImage(new FilteredImageSource(imagenPrincipal.getSource(),
                new CropImageFilter(j * (width / 5), i * (height / 5) , width / 5, height / 5)));
        imagenPartes.add(imagen);
    }
}

Y de igual manera al dibujar cada una de las piezas de la imagen usaremos bucles anidados para recorrer el ArrayList.

int iter = 0;
long seed = System.nanoTime();
Collections.shuffle(imagenPartes, new Random(seed));
for (int i = 0; i < 5; i++){
    for (int j = 0; j < 5; j++){
        g.drawImage(imagenPartes.get(iter), i * (width / 5), j * (height / 5), null);
        iter++;
    }
}

Antes de comenzar a dibujar las piezas se han desordenado aleatoriamente.

Podemos expandir este ejemplo y crear un juego de rompecabezas o simplemente agaragar controles para ingresar el número de partes a lo ancho o a lo alto que necesitamos de la imagen. 

Código fuente completo del programa Enlace de archivos java




Imágenes obtenidas de:

burbuja-de-texto-wow Diseñado por Freepik


Comentarios