为何通过((DataBufferInt) image.getRaster().getDataBuffer()).getData()获取的像素数组全为0?
为何通过((DataBufferInt) image.getRaster().getDataBuffer()).getData()获取的像素数组全为0?
嘿,我一眼就瞅出问题所在啦!你这段代码里的关键bug是:你只创建了一个和原图片同尺寸、同类型的空BufferedImage,但完全没把原图片的像素内容复制进去!
来拆解下你的代码逻辑:
- 你成功读取了原图片
img,这部分没问题; - 你新建了
image = new BufferedImage(...),这个操作只是初始化了一个指定尺寸和类型的空白图片——所有像素默认都是0值; - 你直接去取这个空白图片的像素数组,那可不就是全0嘛!
至于你打印image看到的元数据(宽度1280、高度720这些),那只是这个BufferedImage对象的属性,空图片也会有这些属性,不代表里面有实际的像素内容哦。
给你两种解决思路:
- 思路一:把原图片绘制到新的ARGB图片上(最稳妥,因为JPG本身不带Alpha通道,转ARGB需要手动处理)
修改后的代码如下:
BufferedImage image = null; try { BufferedImage img = ImageIO.read(new File("src/img.jpg")); // 创建新的ARGB格式图片 image = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB); // 关键步骤:把原图片画到新图片上,复制像素内容 Graphics2D g2d = image.createGraphics(); g2d.drawImage(img, 0, 0, null); g2d.dispose(); // 记得释放图形资源,避免内存泄漏 } catch (IOException e) { System.out.println(e); } // 先判断image不为空再操作,避免空指针 if (image != null) { final int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData(); System.out.println(Arrays.toString(pixels)); }
- 思路二:如果不需要强制转ARGB格式,直接用原图片的像素数组(注意JPG是TYPE_INT_RGB类型,需要转成DataBufferInt的话要确认类型匹配)
比如可以改成:
BufferedImage img = ImageIO.read(new File("src/img.jpg")); // 先判断原图片的DataBuffer类型是不是Int,避免强转出错 if (img.getRaster().getDataBuffer() instanceof DataBufferInt) { final int[] pixels = ((DataBufferInt) img.getRaster().getDataBuffer()).getData(); System.out.println(Arrays.toString(pixels)); }
这样修改后,你就能获取到真实的像素数据啦!
备注:内容来源于stack exchange,提问作者pure21_h
相关产品推荐
相关产品推荐

