TerraSkilll 25 de jan. de 2018
Um algoritmo meio bruto (fiz sem testar):
public static BufferedImage invertedBW ( BufferedImage source ){
int w = source . getWidth ();
int h = source . getHeight ();
BufferedImage result = new BufferedImage ( w , h , BufferedImage . TYPE_INT_ARGB );
int originalColor ;
Color newColor ;
for ( int i = 0 ; i < w ; i ++ ){
for ( int j = 0 ; j < h ; j ++ ){
originalColor = source . getRGB ( i , j );
newColor = originalColor > 0 ? Color . BLACK : Color . WHITE ;
result . setRGB ( i , j , newColor . getRed (), newColor . getGreen (), newColor . getBlue ());
}
}
return result ;
}
Abraço.
Dagson 25 de jan. de 2018
Obrigado @TerraSkilll fiz o teste aqui e encontrei um erro na linha abaixo:
result.setRGB(i, j, newColor.getRed(), newColor.getGreen(), newColor.getBlue());
devido a quantidade ou tipo de parametros passados ao metodo setRGB();
thanks very
ViniGodoy 25 de jan. de 2018 1 like
Aqui tem uma série de exemplos de exercícios que faço para as minhas aulas:
package br.pucpr.imagem ;
import javax.imageio.ImageIO ;
import java.awt.* ;
import java.awt.image.BufferedImage ;
import java.io.File ;
import java.io.IOException ;
/**
* Resolução dos exercícios. Cada exercício está em uma função.
*/
public class ExerciciosResolvidos {
/**
* Garante que o valor estará no intervalo de 0 até 255.
*/
private int clamp ( int value ) {
if ( value > 255 ) {
value = 255 ;
} else if ( value < 0 ) {
This file has been truncated. show original
Dê uma olhada nas funções:
grayscale: para conversão da imagem para tons de cinza
threshold: para fazer uma imagem com cores só pretas ou brancas.
Para inverter as cores de uma imagem, use a formula:
255 - r
255 - g
255 - b
Em cada pixel.
ViniGodoy 25 de jan. de 2018 1 like
Ah sim, aqui também tem a solução dos mesmos exercícios usando recursos do Java 8, como closures: https://github.com/progjogos3d/imagem01-ex02
ViniGodoy 25 de jan. de 2018 1 like
PS: Obviamente, estou partindo do pressuposto que se te pediram isso, querem que você faça no braço. E nesse caso, não faz tempo usar o getGraphics().
Dagson 26 de jan. de 2018
@ViniGodoy muito obrigado pela força!
só alterei a função threshold, mas ainda estou com dúvida em informar o paramentro (value) correto da função threshold .
a alteração foi em:
if ( p .getRed () <= value ) {
out .setRGB ( x , y , Color .WHITE .getRGB ()) ;
} else {
out .setRGB ( x , y , Color .BLACK .getRGB ()) ;
}
ViniGodoy 26 de jan. de 2018 1 like
Essa é a parte configurável da função. Quanto menor o threshold, mais clara ficará a imagem final.
Se a sua imagem de entrada é colorida, o ideal não seria usar só o getRed(), mas mudar para:
int avg = ( p .getRed () + p .getGreen () + p .getBlue ()) / 3 ;
if ( avg <= value ) {
out .setRGB ( x , y , Color .WHITE .getRGB ()) ;
} else {
out .setRGB ( x , y , Color .BLACK .getRGB ()) ;
}
Se vc quiser uma forma de estimar um bom valor de threshold para a imagem automaticamente, você poderá implementar o algoritmo de otsu, explicado aqui: http://www.labbookpages.co.uk/software/imgProc/otsuThreshold.html