Como dar zoom em imagens digitais ?

Olá pessoal,

Gostaria de saber como utilizar os métodos de vizinho mais próximo, interpolação bilinear e interpolação bicúbica em java ? ou seja, como carregar uma imagem em java e fazer com que ela passe por esse processo e seja mostrado para o usuário em algum tipo de janela ?

Se alguém tiver um exemplo disso ficaria agradecido se compartilhasse.

A+

Quer ajuda com esses métodos ou quer saber como exibir o resultado?

Em Java, você pode carregar uma imagem num BufferedImage e acessar cada pixel através do método getRGB(), então você pode realizar cálculos e operações sobre estes pixels, como mudança de cor, multiplicação e etc. Com isso, você consegue executar algoritmos de manipulação sobre estas imagens.

Abraço.

1 curtida

É como o amigo disse, o Java possui certos métodos para manipulação de pixels.

Uma BufferedImage possuí métodos getRGB, setRGB, etc…
E outros diversos métodos que tornam possível o processamento de imagens, como getWidth e getHeight, que permitem que você capture o tamanho das imagens.

Uma aplicação bacana de getWidth e getHeight, é que com esse tamanho, você consegue percorrer pixel a pixel de uma imagem (pode modifica-los se quiser) através de um for, por exemplo.

Dá um certo trabalho e requer certa prática com matrizes bidimensionais e tridimensionais (dependendo da aplicação).

Uma biblioteca que seria bacana você dar uma olhada, é a do JHLabs.
http://www.jhlabs.com/ip/filters/index.html

Você baixa, adiciona em seu projeto e consegue utilizar os filtros. Dê uma olhada na licença de uso antes de publicar seu projeto, caso deseje publica-lo.

"Quer ajuda com esses métodos ou quer saber como exibir o resultado? "

Quero saber ambos. Mas principalmente ajuda com esses métodos, apesar de vocês falarem que o Java possuir métodos para manipulação de pixels. Eu gostaria de implementar esses métodos(sobretudo o bicúbico) mas não sei como pois tem que transformar a imagem em uma matriz e ai vai depender de quanto zoom a pessoa vai querer dar pra redimensionar a matriz e aplicar os métodos.

Carregada para um BufferedImage e acessada através de getRGB(), com ajuda de getWidth() e getHeight(), uma imagem é basicamente uma matriz de cores. Você deve estar tendo problemas para visualizar isso, mas você já tem o que precisa para criar seu algoritmo que aplica uma transformação nesses pixels.

Com os pixels de cor da imagem, você pode fazer o que quiser: multiplicar cores, duplicá-los em outra matriz, subtrair cores, tirar a média das cores, aumentar a quantidade de pixels, etc. O algoritmo que fará isso depende de você (que são esses que você quer implementar), mas você já tem a base para o que quer.

Exemplo de carregamento de imagem e pegar cor do pixel:

BufferedImage img = ImageIO.read(new File("C:\\teste\\image.png")); // o path da imagem pode variar, obviamente
			
int w = img.getWidth();
int h = img.getHeight();

for(int i = 0; i < w; i++){
  for(int j = 0; j < h; j++){
    Color original = new Color(img.getRGB(i, j)); // agora "original" contém a cor do pixel
    // aplique o algoritmo que quiser sobre esse pixel
  }
}

Você també pode criar um BufferedImage vazio. Para criar uma imagem 2 vezes maior que a original, você só precisa multiplicar:

BufferedImage newImage = new BufferedImage(w * 2, h * 2, BufferedImage.TYPE_INT_ARGB); // o type, último parâmetro pode variar

e fazer o que quiser com newImage.

Para salvar:

ImageIO.write(newImage, "png", new File("C:\\teste\\newimage.png")); // o tipo e o path de destino podem variar

Abraço.

1 curtida

Ok, obrigado pela ajuda.

Vou usar essa base para implementar os algoritmos .

A+