[color=red]// seleciona a imagem
BufferedImage img = ImageIO.read(fc.getSelectedFile());
// Altera os pixelsfor(inty=0;y<img.getHeight();y++)for(intx=0;x<img.getWidth();x++){Colorcolor=newColor(img.getRGB(x,y));if(color.equals(Color.BLACK)){img.setRGB(x,y,Color.WHITE.getRGB());}}// Grava a saída no arquivo output.pngImageIO.write(img,“png”,newFile(“output.png”));}}[/color]
vc precisa fazer o complemento subtraindo o valor do pixel pelo máximo valor dele;
por exemplo em um pixel de 8 bits = 255 - f(x,y)
*onde f(x,y) é a coordenada do pixel que você quer alterar.
Para imagens de apenas 1 bit por pixel(imagens binarizadas) é só alterar para 0 ou 1;
M
MauroHumberto
é o seguinte, eu carrego a imagem, ai faço o for para percorrer todos pixel certo?
ai eu quero fazer um if, para mim comparar se na coordenada ta preto ou branco, se tiver preto eu pinto para branco e vice-versa,
so q eu nao sei como fazer isso direito, poderia me dar uma ajuda?
J
juliocbq
MauroHumberto:
é o seguinte, eu carrego a imagem, ai faço o for para percorrer todos pixel certo?
ai eu quero fazer um if, para mim comparar se na coordenada ta preto ou branco, se tiver preto eu pinto para branco e vice-versa,
so q eu nao sei como fazer isso direito, poderia me dar uma ajuda?
Opa, este artigo vai sanar as suas dúvidas. Dá uma lida com calma.
packagebr.com.guj.imagem;importjava.awt.Color;importjava.awt.image.BufferedImage;importjava.io.File;importjavax.imageio.ImageIO;importjavax.swing.JFileChooser;importjavax.swing.JOptionPane;importjavax.swing.filechooser.FileNameExtensionFilter;publicclassNegativo{privatestaticJFileChooserchooser=newJFileChooser();static{chooser.setFileFilter(newFileNameExtensionFilter("Imagens","jpg","png","bmp"));chooser.setAcceptAllFileFilterUsed(false);}publicstaticvoidmain(String[]args){try{if(chooser.showOpenDialog(null)!=JFileChooser.APPROVE_OPTION)return;Filefile=chooser.getSelectedFile();BufferedImageimg=ImageIO.read(file);// Inverte a imagemfor(inty=0;y<img.getHeight();++y)for(intx=0;x<img.getWidth();++x){Colorpixel=newColor(img.getRGB(x,y));// Aplicamos a fórmula que o julio falouColorinverso=newColor(255-pixel.getRed(),255-pixel.getGreen(),255-pixel.getBlue());// Definimos novamente no pixelimg.setRGB(x,y,inverso.getRGB());}file=newFile(file.getParentFile(),"inverso.png");ImageIO.write(img,"png",file);JOptionPane.showMessageDialog(null,"<html><body>Imagem:<br>" + file.getAbsolutePath() + "<br>Geradacomsucesso!"); } catch (Exception e) { JOptionPane.showMessageDialog(null, "Nãofoipossívelinverteraimagem."); } }}
V
ViniGodoy
Só um detalhe o código que você postou ali em cima (e que demorei a ler pq vc não usou a tag code), está correto. Porém, ele só funciona para imagens binarizadas, ou seja, aquelas que ou o pixel é inteiramente preto (0) ou o pixel é inteiramente branco (255). Não funciona para escala de cinza ou para imagens coloridas.
Seria legar dar uma olhada nos rasters que o julio passou por questões de performance. Porém, se você realmente for trabalhar com imagens e processamento de vídeo, saia do Java e use a opencv com C++. A performance é incomparavelmente melhor. Outra API que pode te ajudar, se vc quiser se manter com o Java, é o binding de OpenCV para java, chamado JavaCV.
J
juliocbq
O exemplo do vini godoy acima é bem prático. Ele vai criar um efeito de “negativo” em imagens coloridas(as que possuem 3 bandas(verm, verd, azu).
Se você precisar de um resultado na escala de cinza você pode aplicar a “média” nas bandas :
ec(x,y) = (r(x,y)+g(x,y)+b(x,y))/3
ou mesmo pegar somente a luminância aplicando as constantes(a lumiância é somente a intensidade da luz)
Outra possibilidade é fazer limiarização, caso você tenha uma imagem colorida. Ou seja, transformar a imagem em binária (só com tons 0 ou 255).
Isso geralmente é feito através de uma constante, chamada de limiar (threshold).
Toda luminância abaixo dela, terá o pixel setado para 0, acima, para 255.
Basicamente, é só aplicar uma das fórmulas do post acima e tratar isso com um operador ternário: