Transformar imagem pra preto e branco

Então, eu preciso transformar uma imagem pra efeito preto e branco, mas de fato meu código está deixando a imagem preta e não com o efeito preto e branco, entende?

Alguém sabe o que devo mudar?

Aqui o código:

public static void main(String[] args) throws IOException {
    int w,h;
       
	BufferedImage original = 
		ImageIO.read(new File("cidade.jpg"));
	
	w = original.getWidth();
	h = original.getHeight();
	
	BufferedImage processada = 
		new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
	
	int[] pixels = new int[h * w * 3];
	
	WritableRaster raster = processada.getRaster();
	original.getRaster().getPixels(0, 0, w, h, pixels);
	
	for (int i = 0; i < pixels.length; i+=3){
		
		if (i < (pixels.length/3))
			
		{
			pixels[i] = 0;
			pixels[i+1] = 0;
			pixels[i+2] = 0;
		}   
		
		else
			
		{
			pixels[i] = 255;
			pixels[i+1] = 255;
			pixels[i+2] = 255;
		}    
	}
		
	raster.setPixels(0, 0, w, h, pixels);
	ImageIO.write(processada, "jpg", 
			new File("pretobranco.jpg"));
}

Veja o que seu código está fazendo:

// aqui você está criando um array de pixels 3 vezes maior que o original, não precisa
int[] pixels = new int[h * w * 3];


for (int i = 0; i < pixels.length; i += 3) {
    if (i < (pixels.length / 3)) {
        // aqui você seta os pixels com a cor preta
        pixels[i] = 0;
        pixels[i + 1] = 0;
        pixels[i + 2] = 0;
    } else {
        // aqui você seta os pixels com a cor branca
        pixels[i] = 255;
        pixels[i + 1] = 255;
        pixels[i + 2] = 255;
    }
}

Isso está errado!

O que você precisa fazer é o seguinte:
Pegar cada pixel e transformar a cor dele em uma escala de cinza.

Faça assim que vai resolver:

import java.awt.image.BufferedImage;
import java.io.File;

import javax.imageio.ImageIO;

public class Exemplo {

    public static void main(String[] args) throws Throwable {
        BufferedImage original = ImageIO.read(new File("cidade.jpg"));

        int w = original.getWidth();
        int h = original.getHeight();

        BufferedImage processada = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);

        for (int y = 0; y < h; y++) {
            for (int x = 0; x < w; x++) {
                int colorido = original.getRGB(x, y);
                int cinza = escalaDeCinza(colorido);
                processada.setRGB(x, y, cinza);
            }
        }

        ImageIO.write(processada, "jpg", new File("pretobranco.jpg"));
    }

    public static int escalaDeCinza(int pixel) {
        int[] rgb = derivar(pixel);
        int r = rgb[0];
        int g = rgb[1];
        int b = rgb[2];
        int cinza = (r + g + b) / 3;
        rgb[0] = cinza;
        rgb[1] = cinza;
        rgb[2] = cinza;
        return integrar(rgb);
    }

    public static int[] derivar(int rgb) {
        int r = (rgb >> 16) & 0xFF;
        int g = (rgb >>  8) & 0xFF;
        int b = (rgb >>  0) & 0xFF;
        return new int[] { r, g, b };
    }

    public static int integrar(int[] rgb) {
        int r = (rgb[0] & 0xFF) << 16;
        int g = (rgb[1] & 0xFF) <<  8;
        int b = (rgb[2] & 0xFF) <<  0;
        return r | g | b;
    }
}
1 curtida