提取BufferedImage单列像素生成新图时数组越界问题排查
问题原因及修正方案
错误根源
你遇到的ArrayIndexOutOfBoundsException是因为像素数据格式不匹配:
originalImage.getRGB()返回的是打包格式的数组:每个int值包含单个像素的ARGB四个通道信息,数组长度等于像素总数(3600)。- 而
WritableRaster.setPixels()需要的是通道分离格式的数组:对于TYPE_INT_ARGB类型的图像,每个像素对应4个独立的样本值(Alpha、Red、Green、Blue),因此数组长度需要是宽度×高度×4(即1×3600×4=14400)。你的数组只有3600个元素,远小于所需长度,触发越界异常。
修正方案(两种可选)
方案一:直接使用BufferedImage.setRGB(最简便)
和getRGB方法配对使用,无需操作底层Raster,自动处理格式匹配:
BufferedImage originalImage = ImageUtilities.readImageFile("C:/someImage.png"); int[] columnData = new int[originalImage.getHeight()]; // 读取第一列像素 originalImage.getRGB(0, 0, 1, originalImage.getHeight(), columnData, 0, 1); // 创建目标图像 BufferedImage columnImage = new BufferedImage(1, originalImage.getHeight(), BufferedImage.TYPE_INT_ARGB); // 直接写入像素数据 columnImage.setRGB(0, 0, 1, originalImage.getHeight(), columnData, 0, 1);
方案二:手动转换为通道分离格式(如需操作Raster)
如果必须通过Raster写入数据,需要将打包的ARGB整数拆分为单个通道的样本值:
BufferedImage originalImage = ImageUtilities.readImageFile("C:/someImage.png"); int height = originalImage.getHeight(); int[] columnData = new int[height]; originalImage.getRGB(0, 0, 1, height, columnData, 0, 1); BufferedImage columnImage = new BufferedImage(1, height, BufferedImage.TYPE_INT_ARGB); WritableRaster raster = columnImage.getRaster(); // 每个像素对应4个通道,数组长度为height*4 int[] sampleData = new int[height * 4]; for (int i = 0; i < height; i++) { int pixel = columnData[i]; sampleData[i*4] = (pixel >> 24) & 0xFF; // 提取Alpha通道 sampleData[i*4+1] = (pixel >> 16) & 0xFF; // 提取Red通道 sampleData[i*4+2] = (pixel >> 8) & 0xFF; // 提取Green通道 sampleData[i*4+3] = pixel & 0xFF; // 提取Blue通道 } raster.setPixels(0, 0, 1, height, sampleData);
内容的提问来源于stack exchange,提问作者cdubbs
相关产品推荐
相关产品推荐

