Mudar cores em Imagem

Você só quer “avermelhar” (por exemplo) a imagem toda?

Veja esse pdf, na página 54, o método drawRedderImage:

Julio: Então cara, eu nunca tentei fazer esse tipo de coisa antes Oo. Dexa eu ver se entendi, simplesmente mudando os valores de pixel[0], pixel [1] e pixel[2] vai mudar as cores vermelha, verde e azul de toda a imagem? Ou eu teria que varrer a imagem inteira como você falou pra mudar pixel por pixel? Essa parte eu não entendi muito bem como faz olhando os códigos postados aqui no topico :frowning:

Vini: Então cara, eu queria que fosse mais ou menos igual quando tem uma imagem no photoshop, ae ao apertar crtl+u aparece uma opção para mudar o Hue, a mudança que ocorre ao rolar a barra, é a mesma que eu queria fazer no meu aplicativo.
Já mecheu com JavaFX? Seria tipo a função HUE de lá, eu tentei até importar essa função para o Java normal mas não consegui :cry:
Mas vo dah uma olhada no arquivo pdf que você postou ^^

[quote=Sairon]Julio: Então cara, eu nunca tentei fazer esse tipo de coisa antes Oo. Dexa eu ver se entendi, simplesmente mudando os valores de pixel[0], pixel [1] e pixel[2] vai mudar as cores vermelha, verde e azul de toda a imagem? Ou eu teria que varrer a imagem inteira como você falou pra mudar pixel por pixel? Essa parte eu não entendi muito bem como faz olhando os códigos postados aqui no topico :frowning:

Vini: Então cara, eu queria que fosse mais ou menos igual quando tem uma imagem no photoshop, ae ao apertar crtl+u aparece uma opção para mudar o Hue, a mudança que ocorre ao rolar a barra, é a mesma que eu queria fazer no meu aplicativo.
Já mecheu com JavaFX? Seria tipo a função HUE de lá, eu tentei até importar essa função para o Java normal mas não consegui :cry:
Mas vo dah uma olhada no arquivo pdf que você postou ^^

[/quote]

É justamente isso… hue é o ajuste de matiz. Mudando os valores das bandas vermelha, verde e azul, você fará um ajuste de matiz.

Mas você tem que mapear toda a imagem conforme o código acima. Se quiser mudar somente pixels de uma determinada cor, é simples identificá-lo:

Para vermelho:

if(pixels[0]==127 && pixels[1] = -127 && pixels[1] = -127)

Isso se refere a um pixel vermelho.

Lembre que a imagem que voc~e está processandop possui 3 bandas de cor, ou seja 3 bytes, 24bit color. Imagens com formato de pixel diferente serão processadas de maneira diferente.

Só verifique se pixels[] é um inteiro ou um byte. Se for inteiro use um intervalo de 0 - 255, se for byte faça como acima.

faça isso.:


  if (img.getRGB(x, y) == Color.red.getRGB()) {
                  
                }

Gente… agradeço muito por tentarem me ajudar ^^
mas to com um grande problema… a imagem que quero mudar a cor é um icone… como faço para converter ela e poder mudar a cor da imagem?

O setRGB é do BufferedImage … e soh consigo converter ela para Graphic
Então não sei como eu poderia usar o método de mudar o RGB da imagem sendo que não é da classe icon Oo … e não consigo converter ela para outro tipo de imagem sem ser Graphic

Alguém sabe como posso fazer isso?
Eu uso o netbeans… se alguém puder me mandar um exemplo de um aplicativo que faz isso… eu seria muito grato…
Mas acho que isso jah é pedir muito … se soh me falarem como resolver o problema do tipo de imagem acho que consigo solucionar o meu problema de mudar a cor da imagem

Como assim? Como você carregou a imagem?

Graphic não é uma imagem, Graphics representa um contexto gráfico.

[quote=Sairon]Gente… agradeço muito por tentarem me ajudar ^^
mas to com um grande problema… a imagem que quero mudar a cor é um icone… como faço para converter ela e poder mudar a cor da imagem?

O setRGB é do BufferedImage … e soh consigo converter ela para Graphic
Então não sei como eu poderia usar o método de mudar o RGB da imagem sendo que não é da classe icon Oo … e não consigo converter ela para outro tipo de imagem sem ser Graphic

Alguém sabe como posso fazer isso?
Eu uso o netbeans… se alguém puder me mandar um exemplo de um aplicativo que faz isso… eu seria muito grato…
Mas acho que isso jah é pedir muito … se soh me falarem como resolver o problema do tipo de imagem acho que consigo solucionar o meu problema de mudar a cor da imagem[/quote]

Eu não entendi direito. A imagem que você carregou é uma classe Icon? Porque não carrega para uma BufferedImage?:

BufferedImage image = ImageIO.read(...);

 public String pintar(String color)
    {


        // obtenho uma BufferedImage de um arquivo de imagem...
        BufferedImage img = null;
        try {
             img = ImageIO.read(new File(url.getFile()));//seu arquivo
         
        } catch (IOException ex) {
          //  System.out.println("Erro 1.: "+ex);
            System.out.println("Erro 1.: "+ex);
        }

        // capturo o Raster da imagem num objeto do tipo WritableRaster (que permite alteração do Raster)...
        WritableRaster r = img.getRaster();

        //erro no (Degradê)
        Color color1 = new Color(253, 253, 253);
        Color color2 = new Color(254, 254, 254);
        Color color3 = new Color(244, 244, 244);
        Color color4 = new Color(228, 228, 228);
        Color color5 = new Color(208, 208, 208);
        Color color6 = new Color(227, 227, 227);
        Color color7 = new Color(232, 232, 232);
        Color color8 = new Color(234, 234, 234);
        Color color9 = new Color(214, 214, 214);

        Color color10 = new Color(223, 223, 223);

        Color color16 = new Color(198, 198, 198);
        Color color11 = new Color(243, 243, 243);
        Color color12 = new Color(209, 209, 209);
        Color color13 = new Color(187, 187, 187);
        Color color14 = new Color(211, 211, 211);
        Color color15 = new Color(200, 200, 200);
        //

        Color corAlvo = Color.decode("#"+color);

        // crio um vetor que conterá os pixels varridos pelo Raster...
        int pixels[] = new int[img.getWidth() * img.getHeight()];

        // calculo a matriz de pixels da imagem com base na largura x altura...
        for (int x = 0; x < img.getWidth(); x++) {
            for (int y = 0; y < img.getHeight(); y++) {
                // gravo os pixels do eixo x,y no vetor...
                r.getPixel(x, y, pixels);
                // se a imagem for branca e com erros
                if (img.getRGB(x, y) == Color.WHITE.getRGB() || img.getRGB(x, y) == color1.getRGB() ||
                   img.getRGB(x, y) == color2.getRGB() || img.getRGB(x, y) == color3.getRGB() ||
                   img.getRGB(x, y) == color4.getRGB() || img.getRGB(x, y) == color5.getRGB() ||
                   img.getRGB(x, y) == color6.getRGB() || img.getRGB(x, y) == color7.getRGB() ||
                   img.getRGB(x, y) == color8.getRGB() || img.getRGB(x, y) == color9.getRGB() ||
                   img.getRGB(x, y) == color10.getRGB()|| img.getRGB(x, y) == color11.getRGB() ||
                   img.getRGB(x, y) == color12.getRGB() ||
                   img.getRGB(x, y) == color13.getRGB() ||
                   img.getRGB(x, y) == color14.getRGB() || img.getRGB(x, y) == color15.getRGB() ||
                   img.getRGB(x, y) == color16.getRGB() ) {
                    // substituo os cores RGB da comparação por outras que eu quiser...
                    pixels[0] = corAlvo.getRed();
                    pixels[1] = corAlvo.getGreen();
                    pixels[2] = corAlvo.getBlue();
                    // escrevo no WritableRaster novamente a matriz de pixels desse eixo...
                    r.setPixel(x, y, pixels);
                }
            }
        }
        // e, por fim, atualizo a imagem com o Raster modificado...
        img.setData(r);
        String figuraModi= "nova figura";
        try {
              ImageIO.write(img, "png", new File(figuraModi+".png"));
         
        } catch (IOException ex) {
               System.out.println("Erro 2.:"+ex);
        } catch (Exception ex) {
               System.out.println("Erro 2.1.:"+ex);
        }

        return figuraModi;

    }


veja se isso lhe serve

Vini: Então cara… eu to carrendo a imagem definindo ela como um icone de um Jlabel … e soh tem a opção de mudar essa imagem que é de tipo icone para java.awt.Image (eu falei graphic… mas falei errado foi mal) … mudar para bufferedimage eu não consigo :’(

Julio: Eu to exibindo várias imagens num painel definindo elas como icone de Jlabel … por isso elas estão no formato icone… e não consigo de jeito nenhum converter para bufferedimage

Elton: Então cara… ae entramos no problema que digo acima… a imagem que estou usando é do tipo icone não consigo converter ela para outro formato que não seja Image …

Se não tiverem entendendo o pq estou usando como icone de Jlabel as imagens… eu posso postar aqui como está o aplicativo que criei até agora para vcs verem o que estou fazendo ^^

[quote=Sairon]Vini: Então cara… eu to carrendo a imagem definindo ela como um icone de um Jlabel … e soh tem a opção de mudar essa imagem que é de tipo icone para java.awt.Image (eu falei graphic… mas falei errado foi mal) … mudar para bufferedimage eu não consigo :’(

Julio: Eu to exibindo várias imagens num painel definindo elas como icone de Jlabel … por isso elas estão no formato icone… e não consigo de jeito nenhum converter para bufferedimage

Elton: Então cara… ae entramos no problema que digo acima… a imagem que estou usando é do tipo icone não consigo converter ela para outro formato que não seja Image …

Se não tiverem entendendo o pq estou usando como icone de Jlabel as imagens… eu posso postar aqui como está o aplicativo que criei até agora para vcs verem o que estou fazendo ^^[/quote]

Mas porque você não carrega em um BufferedImage e depois cria o Icon a partir dele? Se o problema é ter a imagem como buffered image, isso resolve seu problema.

Mas como eu faria para o Bufferedimage receber uma imagem de tipo icone? E vice versa? O.o

Olá, sou iniciante em JAVA e estava precisando de um programa que troque os pixels de uma imagem jpeg de preto para branco, é o mesmo problema do Linkel, certo ?
Eu estou tentando rodar o programa dele, mas não estou conseguindo, deve ser conceitos básicos, mas não estou conseguindo, alguém poderia me ajudar ?

[code]
package trocarcorimagem;

import java.awt.image.BufferedImage;
import java.awt.image.WritableRaster;
import javax.imageio.ImageIO;

public class TrocarCor1
{
public static void main(String[] args)
{

    // obtenho uma BufferedImage de um arquivo de imagem...   
    BufferedImage img = ImageIO.read(new File(fc.getSelectedFile().getAbsolutePath()));
    
    // capturo o Raster da imagem num objeto do tipo WritableRaster (que permite alteração do Raster)...   
    WritableRaster r = img.getRaster();   
    // crio um vetor que conterá os pixels varridos pelo Raster...   
    int pixels[] = new int[img.getWidth * img.getHeight];   
    // calculo a matriz de pixels da imagem com base na largura x altura...   
        for (int x = 0; x < img.getWidth(); x++) 
        {   
            for (int y = 0; y < img.getHeight(); y++) 
            {   
            // gravo os pixels do eixo x,y no vetor...   
            r.getPixel(x, y, pixels);   
            // comparo os pixels desse eixo com as cores RGB que eu quiser substituir...   
                if (pixels[0] == 255 && pixels[1] == 0 && pixels[2] == 0) 
                {   
                // substituo os cores RGB da comparação por outras que eu quiser...   
                pixels[0] = 150; pixels[1] = 100; pixels[2] = 50;   
                // escrevo no WritableRaster novamente a matriz de pixels desse eixo...   
                r.setPixel(x, y, pixels);                      
                }   
            }   
        }   
    // e, por fim, atualizo a imagem com o Raster modificado...   
    img.setData(r);      
 }    

}[/code]

Na linha 14, o File e o fc ficam sublinhados de vermelho, o que eu devo fazer ? A imagem esta no caminho C:/Documents and Settings/XP/Desktop/a.jepg
Na linha 19, o getWidth e o getHeight ficam sublinhados também…

Alguém me ajude, por favor…
Abracos…

  1. Você precisa ter certeza que os pixels pretos são mesmo pretos. Isso é, tem o R, G e B iguais a 0.
  2. Basta usar os métodos getRGB e setRGB.

for (int y = 0; y &lt; img.getHeight(); y++) for (int x = 0; x &lt; img.getWidth(); x++) { Color pixel = new Color(img.getRGB(x, y)); if (pixel.getRed() == 0 && pixel.getGreen() == 0 && pixel.getBlue() == 0) img.setRgb(new Color(255, 255, 255).getRGB()); } }

Então ViniGodoy, mas eu não estou nem conseguindo rodar esse programa…

A linha 14 eu consegui arrumar, agora sõ falta 1 erro.
O erro esta em:
Na linha 22, o getWidth e o getHeight ficam sublinhados, porque ?

Desculpe se são problemas muito triviais, mas sou iniciante e não estou conseguindo.
Se me der umas dicas eu vou tentando…

[code]package trocarcorimagem;

import java.awt.image.BufferedImage;
import java.awt.image.WritableRaster;
import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;

public class TrocarCor1
{
public static void main(String[] args)
{

   try
   {
    // obtenho uma BufferedImage de um arquivo de imagem...       
    BufferedImage img = ImageIO.read(new File("C:/Documents and Settings/XP/Desktop/Teste OCR/a.jpg"));
    
    // capturo o Raster da imagem num objeto do tipo WritableRaster (que permite alteração do Raster)...   
    WritableRaster r = img.getRaster();   
    // crio um vetor que conterá os pixels varridos pelo Raster...   
    int pixels[] = new int[img.getWidth * img.getHeight];   
    // calculo a matriz de pixels da imagem com base na largura x altura...   
        for (int x = 0; x < img.getWidth(); x++) 
        {   
            for (int y = 0; y < img.getHeight(); y++) 
            {   
            // gravo os pixels do eixo x,y no vetor...   
            r.getPixel(x, y, pixels);   
            // comparo os pixels desse eixo com as cores RGB que eu quiser substituir...   
                if (pixels[0] == 255 && pixels[1] == 0 && pixels[2] == 0) 
                {   
                // substituo os cores RGB da comparação por outras que eu quiser...   
                pixels[0] = 150; pixels[1] = 100; pixels[2] = 50;   
                // escrevo no WritableRaster novamente a matriz de pixels desse eixo...   
                r.setPixel(x, y, pixels);                      
                }   
            }   
        }   
    // e, por fim, atualizo a imagem com o Raster modificado...   
    img.setData(r);   
    }
    catch (IOException e)
         {
         e.printStackTrace();
         }
 }    

}
[/code]

[code]import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFileChooser;

public class TrocarCor1 {
public static void main(String[] args) throws IOException {
// Abre a tela para escolher a imagem do disco
JFileChooser fc = new JFileChooser();
if (fc.showOpenDialog(null) != JFileChooser.APPROVE_OPTION)
return;

	// Lê a imagem
	BufferedImage img = ImageIO.read(fc.getSelectedFile());

	// Altera os pixels
	for (int y = 0; y < img.getHeight(); y++)
		for (int x = 0; x < img.getWidth(); x++) {
			Color color = new Color(img.getRGB(x, y));
			if (color.equals(Color.BLACK)) {
				img.setRGB(x, y, Color.WHITE.getRGB());
			}
		}
	// Grava a saída no arquivo output.png
	ImageIO.write(img, "png", new File("output.png"));
}

}[/code]

Valeu VinyGodoy, era isso que eu queria…
Muito obrigado…
Abracoss

Muito menos complexo e bem mais óbvio do que vc imaginava, não? :slight_smile:

Sim =)…
Mas a cor não é preta, o que eu pensava ser preto é formado por várias outras cores…
Estou mapeando as cores para tentar resolver, mas agora acho que já consigo…
Valeu…
Abraco…

É só fazer o getRed() getG() e getB() menores que um determinado valor pequeno (10, por exemplo).

Outra possibilidade é transformar em escala de cinza, e então testar por aí. Preferencialmente trabalhar com HSI no lugar de RGB.