Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 24位RGB图像到8位灰度字节数组_Java_Image Processing - Fatal编程技术网

Java 24位RGB图像到8位灰度字节数组

Java 24位RGB图像到8位灰度字节数组,java,image-processing,Java,Image Processing,我正在寻找一些代码片段,用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")); Bu

我正在寻找一些代码片段,用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);
    }
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();
字节数组将包含实际的PNG图像,而不是原始像素数据,如图所示,这很重要

你也可以使用像

    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);
    }
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();
如图所示,将图像转换为灰度

如果你真的想要像素数据,你可以做一些像

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

我假设
字节
数组应该包含像素数据……对不起,我是图像处理新手。我只想做下面的1。将jpeg图像转换为原始rgb像素数据2。将原始rgb像素数据转换为灰度像素数据3。最终输出将是灰度像素数据。我想补充一点,R、G、B通道的平均值并不是转换为灰度的最佳公式。更多信息:@Blitzkr1eg太好了,你有Java的例子吗?@MadProgrammer-它会以以下方式工作吗?1.将jpeg图像转换为原始rgb像素数据2。将原始rgb像素数据转换为灰度像素数据3。最终输出将是灰度像素数据,如果你想走这条路,它应该是这样的。加载图像并使用最后一个示例获取原始字节/像素数据…@MadProgrammer-像这样?--BuffereImage source=ImageIO.read(新文件(“C:\\img\\facefind.jpg”);BuffereImage gray=新的BuffereImage(source.getWidth()、source.getHeight()、buffereImage.TYPE_BYTE_gray);ColorConvertOp=新的ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY)),null;op.filter(源,灰色);WritableRaster raster=gray.getRaster();DataBufferByte数据=(DataBufferByte)光栅。getDataBuffer();字节[]rawPixels=data.getData();System.out.println(“字节------------”+rawPixels.length+Arrays.toString(rawPixels));