24位RGB图像到8位灰度级字节数组
我正在寻找一些代码片段来将24位RGB图像转换为Java中的8位灰度级字节数组。我在网上进行了探索,但无法找到任何相关材料。24位RGB图像到8位灰度级字节数组
假设我们有一个24位的RGB图像(“C:\ img \ face.jpg”),我们需要将它转换为8位灰度级字节数组,如byte [] face in Java。
在此先感谢。
在一个“非常”简单的方式,你可以这样做......
try {
BufferedImage source = ImageIO.read(new File("C:/img/face.jpg"));
BufferedImage gray = new BufferedImage(source.getWidth(), source.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
Graphics2D g2d = gray.createGraphics();
g2d.drawImage(source, 0, 0, null);
g2d.dispose();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageOutputStream ios = ImageIO.createImageOutputStream(baos);
ImageIO.write(gray, "png", ios);
ios.close();
byte[] array = baos.toByteArray();
} catch (IOException ex) {
Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
}
的字节数组将包含实际的PNG图像,而不是原始像素数据,这表现here,这是很重要的!
您还可以使用类似...
BufferedImage gray = new BufferedImage(source.getWidth(), source.getHeight(), BufferedImage.TYPE_INT_ARGB);
ColorConvertOp op = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
op.filter(source, gray);
的图像转换为灰度为证明here
如果你从字面上想要的像素数据,你也许能够做一些事情像...
WritableRaster raster = gray.getRaster();
DataBufferByte data = (DataBufferByte) raster.getDataBuffer();
byte[] rawPixels = data.getData();
我想补充一点,平均R,G, B通道不是转换为灰色的最佳公式。更多这里:http://www.johndcook.com/blog/2009/08/24/algorithms-convert-color-grayscale/ – Blitzkr1eg 2014-12-03 07:43:13
@ Blitzkr1eg这很好,你有在Java的例子吗? – MadProgrammer 2014-12-03 07:46:25
@MadProgrammer - 它会以下列方式工作吗? 1.将jpeg图像转换为raw rgb像素数据2.将原始rgb像素数据转换为灰度像素数据3.最终输出将为灰度像素数据 – Raman 2014-12-03 09:32:55
我假定'byte'阵列是假设包含的像素数据... – MadProgrammer 2014-12-03 07:26:02
[灰度converstion的实施例](HTTP:// stackoverflo w.com/questions/21899824/java-convert-a-greyscale-and-sepia-version-of-an-image-with-bufferedimage/21900125#21900125) – MadProgrammer 2014-12-03 07:26:29
对不起,我是图像处理新手。我只想做 1.将jpeg图像转换为raw rgb像素数据 2.将原始rgb像素数据转换为灰度像素数据 3.最终输出将是灰度像素数据 – Raman 2014-12-03 09:30:24