Olá! Eu preciso de um filtro de passa-baixa. Onde através de uma imagem de entrada eu devo retornar a mesma borrada. De acordo com o que pesquisei em alguns fóruns consegui este código, mas não compreendi muito bem o que o mesmo efetua dentro do laço for. Ele funciona bem com uma imagem de uma flor por exemplo, mas para borrar uma folha de planta tal como eu preciso não surte efeito, gostaria de saber como borrar ainda mais a imagem.
package passabaixa;
import java.awt.BorderLayout;
import java.awt.image.BufferedImage;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileNameExtensionFilter;
public class Principal {
public static void main(String[] args) throws IOException{
File arquivo = null;
JFileChooser chooser = new JFileChooser(); //Cria uma instância do JFileChooser
FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG, PNG & GIF Images", "jpg", "gif", "png"); //Cria um filtro
chooser.setFileFilter(filter); //Altera o filtro do JFileChooser
int returnVal = chooser.showOpenDialog(null);
if(returnVal == JFileChooser.APPROVE_OPTION) { //Verifica se o usuário clicou no botão OK
arquivo = chooser.getSelectedFile();
} else {
JOptionPane.showMessageDialog(null,"Abertura de arquivo cancelada!\n",""
+"Cancelar", JOptionPane.INFORMATION_MESSAGE);
return;//corrrige o erro dos gerados a não escolher um arquivo
}
BufferedImage image = ImageIO.read(arquivo);//Lendo a imagem (arquivo) que foi escolhida pelo usuário
//pega tamanho da imagem
int H = image.getHeight(null);//pega a altura
int W = image.getWidth(null);//pega a largura
//pega
int nb = image.getSampleModel().getNumBands();//pega as cores da imagem com getSample e com o getNunBands retorna o número total de bandas(divisão de imgs) de dados de imagem.
int[] pixel = new int[nb];
Raster inputRaster = image.getData();
//defenir um vetor para correr tudo
int[] pixels = new int[nb * W * H];
//vai buscar todos pixeis
inputRaster.getPixels(0, 0, W, H, pixels);
//Criar nova imagem com novas dimensoes!
BufferedImage ni = new BufferedImage(W, H, BufferedImage.TYPE_INT_RGB);
WritableRaster outputRaster = ni.getRaster();//percorrea a img (ni) pegando o valor de cada pixel,1 raster (caneta)
//Raster representa uma matriz retangular de pixels
for (int i = 1; i < W-1; i++) {
for (int j = 1; j < H-1; j++) {
int piexel1 = image.getRGB(i, j);
int blue1 = piexel1 & 0xFF;//blue1 recebe o piexel(com os valoes de RGB) que devem ser inteiros de 0 a 255(0xFF)
int green1 = (piexel1 >> 8) & 0xFF;
int red1 = (piexel1 >> 16) & 0xFF;
int pixel2 = image.getRGB(i - 1, j - 1);
int blue2 = pixel2 & 0xFF;
int green2 = (pixel2 >> 8) & 0xFF;
int red2 = (pixel2 >> 16) & 0xFF;
int pixel3 = image.getRGB(i - 1, j);
int blue3 = pixel3 & 0xFF;
int green3 = (pixel3 >> 8) & 0xFF;
int red3 = (pixel3 >> 16) & 0xFF;
//System.out.println(i + " " + j + " " + H + " " + W);
int pixel4 = image.getRGB(i - 1, j + 1);
int blue4 = pixel4 & 0xFF;
int green4 = (pixel4 >> 8) & 0xFF;
int red4 = (pixel4 >> 16) & 0xFF;
int pixel5 = image.getRGB(i, j - 1);
int blue5 = pixel5 & 0xFF;
int green5 = (pixel5 >> 8) & 0xFF;
int red5 = (pixel5 >> 16) & 0xFF;
int pixel6 = image.getRGB(i, j + 1);
int blue6 = pixel6 & 0xFF;
int green6 = (pixel6 >> 8) & 0xFF;
int red6 = (pixel6 >> 16) & 0xFF;
int pixel7 = image.getRGB(i + 1, j - 1);
int blue7 = pixel7 & 0xFF;
int green7 = (pixel7 >> 8) & 0xFF;
int red7 = (pixel7 >> 16) & 0xFF;
int pixel8 = image.getRGB(i + 1, j);
int blue8 = pixel8 & 0xFF;
int green8 = (pixel8 >> 8) & 0xFF;
int red8 = (pixel8 >> 16) & 0xFF;
int pixel9 = image.getRGB(i + 1, j - 1);
int blue9 = pixel9 & 0xFF;
int green9 = (pixel9 >> 8) & 0xFF;
int red9 = (pixel9 >> 16) & 0xFF;
int bluefinal = (blue1 + blue2 + blue3 + blue4 + blue5 + blue6 + blue7 + blue8 + blue9) / 9;
int redfinal = (red1 + red2 + red3 + red4 + red5 + red6 + red7 + red8 + red9) / 9;
int greenfinal = (green1 + green2 + green3 + green4 + green5 + green6 + green7 + green8 + green9) / 9;
int[] color = {redfinal, greenfinal, bluefinal};
outputRaster.setPixel(i, j, color);
}
}
ni.setData(outputRaster);
ImageIO.write(ni, "JPEG", new File("image1.jpg"));
}
}
Então… Como posso fazer com que a imagem seja ainda mais borrada? E se alguém entender o conteúdo de dentro do for e puder explicar fico grata! Espero que possam me ajudar!