我正在寻找一些代码片段,用于将24位RGB图像转换为Java中的8位灰度字节数组。我已在网上进行过探索,但未能找到任何相关资料。
假设我们有一个24位RGB图像(“C:\ img \ face.jpg”),我们需要将其转换为8位灰度字节数组,如Java中的byte [] face。
提前致谢。
答案 0 :(得分:1)
以“非常”简单的方式,您可以做一些像......
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();