Deixar imagem (foto) em preto e branco [Resolvido]

Olá,
Nunca trabalhei com manipulação de imagens em Java, e agora acabei me interessando por isso. O que eu quero fazer é algo que não parece ser tão complicado, visto que as APIs da linguagem Java atendem várias demandas e necessidades do programador. Qual seria a melhor forma de transformar uma foto colorida em uma foto em preto-e-branco?

Obrigado!

Preto e branco ou escala de cinza?? Muita gente confunde, rsrsrs.

public static BufferedImage image2BlackWhite(BufferedImage image1) {

		int w = image1.getWidth();
		int h = image1.getHeight();
		byte[] comp = { 0, -1 };
		IndexColorModel cm = new IndexColorModel(2, 2, comp, comp, comp);
		BufferedImage image2 = new BufferedImage(w, h,
				BufferedImage.TYPE_BYTE_INDEXED, cm);
		Graphics2D g = image2.createGraphics();
		g.drawRenderedImage(image1, null);
		g.dispose();

		return image2;
	}
public static BufferedImage image2GrayScale(BufferedImage image) {
		BufferedImage imageGray = new BufferedImage(image.getWidth(), image.getHeight(),BufferedImage.TYPE_BYTE_GRAY);  
		Graphics g = imageGray.getGraphics();  
		g.drawImage(image, 0, 0, null);  
		g.dispose();
		return imageGray;
	}

abs,

Evandro

Obrigado! :smiley:

Eu havia conseguido este exemplo:

[code]package converteimagem;

import java.awt.image.;
import javax.imageio.ImageIO;
import java.io.
;
import java.awt.*;

public class Main
{
public static void main(String asr[])
{
try
{
/* imagem colorida */
BufferedImage image = ImageIO.read(new
File(“C:\Avatar.jpg”));

                         double image_width = image.getWidth();
                         double image_height = image.getHeight();

                         BufferedImage bimg = null;
                         BufferedImage img = image;

                        
                         bimg = new BufferedImage((int)image_width, (int)image_height,
                                                                BufferedImage.TYPE_BYTE_GRAY);
                         Graphics2D gg = bimg.createGraphics();
                         gg.drawImage(img, 0, 0, img.getWidth(null), img.getHeight(null), null);

                         /*  salvando */
                         String temp = "blackAndwhite.jpeg";
                         File fi = new File("C:\\" + temp);
                         ImageIO.write(bimg, "jpg", fi);
               }
               catch (Exception e)
               {
                         System.out.println(e);
               }
      }

}[/code]

Beleza Andre, :wink: precisando estamos ai,

abs,

Evandro

O código desse tópico está fazendo algumas coisas estranhas, como ler a altura e largura da imagem (que são int) em variáveis double, e depois fazer o cast novamente para int no construtor do bufferedimage.

Para um exemplo mais conciso e completo, dê uma olhada:

Também mostra como fazer binarização (ou seja, deixar a imagem realmente preta-e-branca).

ViniGodoy

Baseado em seu codigo onde eu tranformo a imagem ou converto em
compressão LZW com 300 dpi e se possivel for espelhado ?

[quote=ViniGodoy]O código desse tópico está fazendo algumas coisas estranhas, como ler a altura e largura da imagem (que são int) em variáveis double, e depois fazer o cast novamente para int no construtor do bufferedimage.

Para um exemplo mais conciso e completo, dê uma olhada:

Também mostra como fazer binarização (ou seja, deixar a imagem realmente preta-e-branca).[/quote]

Obrigado, ViniGodoy. Seu código me parece um pouco mais complicado, vou tentar entende-lo.

Obrigado.

[quote=Andre Rosa][quote=ViniGodoy]O código desse tópico está fazendo algumas coisas estranhas, como ler a altura e largura da imagem (que são int) em variáveis double, e depois fazer o cast novamente para int no construtor do bufferedimage.

Para um exemplo mais conciso e completo, dê uma olhada:

Também mostra como fazer binarização (ou seja, deixar a imagem realmente preta-e-branca).[/quote]

Obrigado, ViniGodoy. Seu código me parece um pouco mais complicado, vou tentar entende-lo.

Obrigado.[/quote]

Não se assuste, a função que faz a conversão da imagem para preto e branco é só essa aqui, quase idêntica a que o colega postou no exemplo:

    /** 
     * Converte a imagem para escala de cinza. 
     *  
     * @param image Imagem a ser convertida 
     * @return a Imagem convertida. 
     */  
    private static BufferedImage toGrayscale(BufferedImage image) {  
        BufferedImage output = new BufferedImage(image.getWidth(),  
                image.getHeight(), BufferedImage.TYPE_BYTE_GRAY);  
        Graphics2D g2d = output.createGraphics();  
        g2d.drawImage(image, 0, 0, null);  
        g2d.dispose();  
        return output;
    }  

Não é certo falar preto e branco. Isso são para imagens limiarizadas(binarizadas - imagens com 2 bits por pixel).

Imagem na escala de cinza ou luminância, com apenas 8 bits por pixel(uma banda de cor).

[quote=ViniGodoy][quote=Andre Rosa][quote=ViniGodoy]O código desse tópico está fazendo algumas coisas estranhas, como ler a altura e largura da imagem (que são int) em variáveis double, e depois fazer o cast novamente para int no construtor do bufferedimage.

Para um exemplo mais conciso e completo, dê uma olhada:

Também mostra como fazer binarização (ou seja, deixar a imagem realmente preta-e-branca).[/quote]

Obrigado, ViniGodoy. Seu código me parece um pouco mais complicado, vou tentar entende-lo.

Obrigado.[/quote]

Não se assuste, a função que faz a conversão da imagem para preto e branco é só essa aqui, quase idêntica a que o colega postou no exemplo:

/** * Converte a imagem para escala de cinza. * * @param image Imagem a ser convertida * @return a Imagem convertida. */ private static BufferedImage toGrayscale(BufferedImage image) { BufferedImage output = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_GRAY); Graphics2D g2d = output.createGraphics(); g2d.drawImage(image, 0, 0, null); g2d.dispose(); return output; } [/quote]

Obrigado, bem mais amigável, hehe.

[quote=juliocbq]Não é certo falar preto e branco. Isso são para imagens limiarizadas(binarizadas - imagens com 2 bits por pixel).

Imagem na escala de cinza ou luminância, com apenas 8 bits por pixel(uma banda de cor).

[/quote]

Puxa, eu não sabia a diferença. O que eu procurava, então, era imagens na escala de cinza ou luminância. Feito!

Muito obrigado a todos.

Cometi um erro lá em cima(estava pensando em 2 valores, preto ou branco e acabei passando isso pro texto).

1 bit por pixel = 2^1 para imagens monocromáticas(preto e branco)