converter uma imagem RGB em escala de cinza Imagem reduzindo a memory em java

Eu tenho um bImg bufferedImage RGB.
Eu quero converter bImg a imagem cinza.

BufferedImage grayIm=new BufferedImage(bImg.getWidth(null), bImg.getHeight(null), BufferedImage.TYPE_BYTE_GRAY); 

Eu tentei este grayIm mas eu não posso definir os valores de escala de cinza para este grayIm.

Uma maneira poderia ser converter o espaço de cor (desempenho ruim):

 ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY); ColorConvertOp op = new ColorConvertOp(cs, null); BufferedImage image = op.filter(bufferedImage, null); 

Outra seria usar um BufferedImage, como você faz (melhor desempenho):

 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY); Graphics g = image.getGraphics(); g.drawImage(colorImage, 0, 0, null); g.dispose(); 

Por último, mas não menos importante, o melhor desempenho é usar um GrayFilter:

 ImageFilter filter = new GrayFilter(true, 50); ImageProducer producer = new FilteredImageSource(colorImage.getSource(), filter); Image mage = Toolkit.getDefaultToolkit().createImage(producer); 

fonte: http://www.codebeach.com/2008/03/convert-color-image-to-gray-scale-image.html

edit: por comentário de Mark.

NOTA: Isto não é o que o OP pediu (já que não reduz o uso da memory), mas eu deixarei aqui, já que pessoas gostam dessa abordagem manual por pixel.


Isso é bem simples. A ideia é fazer uma iteração em cada pixel da imagem e alterá-la para o equivalente em escala de cinza.

 public static void makeGray(BufferedImage img) { for (int x = 0; x < img.getWidth(); ++x) for (int y = 0; y < img.getHeight(); ++y) { int rgb = img.getRGB(x, y); int r = (rgb >> 16) & 0xFF; int g = (rgb >> 8) & 0xFF; int b = (rgb & 0xFF); int grayLevel = (r + g + b) / 3; int gray = (grayLevel << 16) + (grayLevel << 8) + grayLevel; img.setRGB(x, y, gray); } } 

No entanto, isso não reduz a memory. Para reduzir efetivamente o uso da memory, faça o mesmo processo, mas use uma BufferedImage em escala de cinza como saída.

Eu tive o mesmo problema. A solução escolhida não depende apenas do nível de desempenho. Também é necessário entender a qualidade de imagem que você procura. Por favor, olhe estes exemplos. Todos eles mantêm o código fonte. http://codehustler.org/blog/java-to-create-grayscale-images-icons/