24位RGB图像到8位灰度字节阵列



我正在寻找一些代码片段来在 Java 中将 24 位 RGB 图像转换为 8 位灰度字节数组。我在网上探索过,但找不到任何相关材料。

假设我们有一个 24 位 RGB 图像("C:\img\face.jpg"),我们需要将其转换为 8 位灰度字节数组,类似于 Java 中的 byte[] face。

提前谢谢。

以一种"非常"简单的方式,你可以做一些类似的事情......

    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 图像,而不是原始像素数据,如此处所示,这很重要!

您也可以使用类似...

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);

将图像转换为灰度,如此处所示

如果你真的想要像素数据,你也许可以做一些类似的事情......

WritableRaster raster = gray.getRaster();
DataBufferByte data = (DataBufferByte) raster.getDataBuffer();    
byte[] rawPixels = data.getData();

最新更新