Olá! Eu preciso desenvolver um programa que receba 2 imagens e realize a subtração delas. Segue as imagens a seguir:
Foi indicado que pegasse os pixels da imagem, transformasse em uma matriz e subtraísse elas. Como posso fazer isso? Segue o código que possuo através de pesquisas aqui no próprio fórum (realizei algumas modificações e testes com System.out.println a fim de fazer ter resultado com minhas imagens, mas o resultado gerado é bem errôneo ainda [resultado final gera uma imagem completamente preta ]).
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileNameExtensionFilter;
/**
*
* @author Admin
*/
public class ExemploSubtracao {
public int subtract(int color1, int color2) {
System.out.println("---- entrei no subtract ----");
Color c1 = new Color(color1);
Color c2 = new Color(color2);
int r = Math.max(0, c1.getRed() - c2.getRed());
int g = Math.max(0, c1.getGreen() - c2.getGreen());
int b = Math.max(0, c1.getBlue() - c2.getBlue());
return new Color(r, g, b).getRGB();
}
public BufferedImage subtract(BufferedImage img1, BufferedImage img2) {
BufferedImage out = new BufferedImage(img1.getWidth(), img1.getHeight(), BufferedImage.TYPE_BYTE_BINARY);
System.out.println("entrei no subtract do buffered");
for (int y = 0; y < img1.getHeight(); y++)
for (int x = 0; x < img1.getWidth(); x++)
out.setRGB(x, y, subtract(img1.getRGB(x, y), img2.getRGB(x, y)));
return out;
}
void doIt() throws IOException {
File arquivo = null;
File arquivo2 = null;
JFileChooser chooser = new JFileChooser(); //Cria uma instância do JFileChooser
JFileChooser chooser2 = 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
chooser2.setFileFilter(filter); //Altera o filtro do JFileChooser
int returnVal = chooser.showOpenDialog(null); //Abre o diálogo JFileChooser
int returnVal2 = chooser.showOpenDialog(null); //Abre o diálogo JFileChooser
if(returnVal == JFileChooser.APPROVE_OPTION && returnVal2 == JFileChooser.APPROVE_OPTION) { //Verifica se o usuário clicou no botão OK
arquivo = chooser.getSelectedFile();
arquivo2 = chooser.getSelectedFile();
System.out.println("OK, selecionei 2 imagens");
}else {
JOptionPane.showMessageDialog(null,"Abertura de arquivo cancelada!\n",""
+"Cancelar", JOptionPane.INFORMATION_MESSAGE);
return;//corrrige o erro gerados a não escolher um arquivo
}
BufferedImage img1 = ImageIO.read(arquivo);
BufferedImage img2 = ImageIO.read(arquivo2);
System.out.println("dps dos buffered");
// Filtra o que existe na imagem2 mas não na imagem1.
ImageIO.write(subtract(img2, img1), "png", new File("Imagem_Subtracao1.png"));
JOptionPane.showMessageDialog(null, "Finalizado com sucesso!!!");
}
public static void main(String[] args) throws Exception {
new ExemploSubtracao().doIt();
}
}
Então… Como posso fazer com que pegue os pixels dessas imagens que recebo para uma matriz e depois subtrair? Desde já obrigada a todos que puderem ajudar!