Processamento Digital de Imagens (subImage e divisão de imagem)

Há um tempo atrás, brincando um pouco com imagens em Java, precisei copiar um trecho de uma imagem. Acabei descobrindo que a próprio Java já dá suporte a isso, através do método “getSubImage(arg0, arg1, arg2, arg3)”  da classe BufferedImage. A descrição do método segundo a documentação oficial é a seguinte:

——————————————————————————————–

public BufferedImage getSubimage(int x,
                                 int y,
                                 int w,
                                 int h)
Returns a subimage defined by a specified rectangular region. The returned BufferedImage shares the same data array as the original image.
Parameters:
x, y – the coordinates of the upper-left corner of the specified rectangular region
w – the width of the specified rectangular region
h – the height of the specified rectangular region
Returns:
BufferedImage that is the subimage of this BufferedImage.
Throws:
RasterFormatException – if the specified area is not contained within this BufferedImage.
——————————————————————————————–

Dado as coordenadas (x,y), um valor de largura e outro para altura, o método retorna a subimagem a partir do ponto (x,y) com a largura e altura passadas como parâmetro. Mesmo assim resolvi criar um novo algoritmo (sei lá porque) pra fazer essa cópia da parte da imagem, afinal, é muito simples. Aproveitando o barco, criei um método que, dada uma imagem e um número N, ele divide a imagem em N linhas e N colunas, retornando a lista de imagens geradas. Exemplo: passando uma imagem qualquer (objeto BufferedImage) e o número 3, o método te retorna 9 imagens (9 pedaços da imagem original), conforme ilustrado abaixo:

A imagem é um GIF animado, se não visualizar dentro do post clique nela para ver a ilustração do funcionamento do algoritmo

Aí você pergunta: mas e para que eu quero uma imagem dividida em N pedaços? Resposta: não sei! xD

Eu fiz isso porque queria pegar uma foto minha e deixá-la “embaralhada”, e pra não usar o Photoshop, resolvi brincar um pouco com Java. Uma aplicação mais prática pra isso eu vejo depois! =D

</p>
<p style="text-align: justify;">import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;

/**
* Created by Thiago Paulino
* thiagopaulino2@gmail.com
* 2011-26-10
* Published on oxenteexception.wordpress.com
*/
public class ImageUtil {

/**
* @author         Thiago Paulino
*
* @param img    Imagem de entrada
* @param x1     Coordenada X inicial
* @param y1     Coordenada Y inicial
* @param x2    Coordenada X final
* @param y2     Coordenada Y final
*
* @return         Imagem BufferedImage que corresponde à área compreendida
*                 entre as coordenadas (x1, y1) e (x2, y2)
*/
public static BufferedImage subImage(BufferedImage img,
int x1, int y1,    int x2, int y2){

//Cria uma imagem em branco do tamanho da área entre (x1, y1), (x2, y2)
BufferedImage novaImagem = new BufferedImage(
x2-x1, y2-y1, BufferedImage.TYPE_INT_RGB);

try {
int xNew = 0;
int yNew = 0;

//varrer a matriz de pixels
for(int i = x1; i < x2; i++){
for(int j = y1; j < y2; j++){

//obtem o RGB do pixel da imagem de entrada...
int rgb = img.getRGB(i, j);
//e o insere na nova imagem
novaImagem.setRGB(xNew, yNew, rgb);
yNew++;
}
xNew++;
yNew = 0;
}

} catch(Exception e) {
e.printStackTrace();
}
return novaImagem;
}

/**
* Dada uma imagem e dado um número N, o método retorna N^2 imagens
* Exemplo: dado N = 3, é retornada uma lista com 9 imagens
*
*  | 1 , 2 , 3|
*  | 4 , 5 , 6|
*  | 7 , 8 , 9|
*
* @author         Thiago Paulino
*
* @param imagem    Imagem de entrada
* @param divisao    Razão da divisão da imagem
*
* @return         Lista de N^2 imagens
*/
public static List<BufferedImage> divideEquals(
BufferedImage imagem, int divisao){

List<BufferedImage> lista = new ArrayList<BufferedImage>();;
try{
int largura = imagem.getWidth();
int altura = imagem.getHeight();

int larguraQuadro = largura / divisao;
int alturaQuadro = altura / divisao;

BufferedImage sub = null;

int xInicial = 0;
int yInicial = 0;
int xLimite = larguraQuadro;
int yLimite = alturaQuadro;

for(int i = 0; i < divisao; i++){
for(int j = 0; j < divisao; j++) {
sub = subImage(imagem, xInicial, yInicial,
xInicial+xLimite, yLimite);
xInicial += larguraQuadro;
lista.add(sub);
}
xInicial = 0;
yInicial += alturaQuadro;
yLimite += alturaQuadro;
}

}catch(Exception e){
e.printStackTrace();
}
return lista;
}

}

</p>
<p style="text-align: justify;">

1 comment so far

  1. Glayson Junio on

    Republicou isso em Glayson Junio.


Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: