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