Java 如何使用IIOImage读取图像并获取光栅

Java 如何使用IIOImage读取图像并获取光栅,java,javax.imageio,raster,Java,Javax.imageio,Raster,我正在尝试用Java读取图像,并通过光栅访问像素。但是,我从光栅获取NPE,如何访问它 以下是我正在做的: public static void main(String[] args) throws Exception { IIOImage iioImage = Image.readImage(Main.class.getResourceAsStream("/annalisa-licciardi.png")); System.out.println(iioImage.getRas

我正在尝试用Java读取图像,并通过光栅访问像素。但是,我从光栅获取NPE,如何访问它

以下是我正在做的:

public static void main(String[] args) throws Exception
{
    IIOImage iioImage = Image.readImage(Main.class.getResourceAsStream("/annalisa-licciardi.png"));
    System.out.println(iioImage.getRaster().getHeight());
}    
readImage的实现如下所示:

public static IIOImage readImage(ImageInputStream stream) throws IOException
{
    if (stream == null)
        throw new IllegalArgumentException("stream == null!");

    Iterator iterator = ImageIO.getImageReaders(stream);

    if (!iterator.hasNext())
        return null;

    ImageReader imageReader = (ImageReader) iterator.next();
    ImageReadParam param = imageReader.getDefaultReadParam();
    imageReader.setInput(stream,true,true);
    IIOImage iioImage = imageReader.readAll(0,param);
    stream.close();
    imageReader.dispose();
    return iioImage;
}

public static IIOImage readImage(InputStream inputStream) throws IOException
{
    return readImage(ImageIO.createImageInputStream(inputStream));
}
如何获取光栅?

ImageReader.readAll(…)
不是这样工作的

形成JavaDoc:

读取由
imageIndex
索引的图像,并使用提供的
ImageReadParam
返回包含图像、缩略图和关联图像元数据的
IIOImage
。 返回的
IIOImage
引用的实际
buffereImage
将使用
getDestination
方法定义的算法进行选择

还请注意,
IIOImage
只能保存
buffereImage
光栅图像。不是两者都有
readAll(…)
将返回一个保存
buffereImage
IIOImage
。所以,基本上,你想要达到的目标是行不通的

但正如@Marco13在评论中所说,一旦加载了
BufferedImage
,就可以从
graster
中获取
光栅

BufferedImage image = ImageIO.read(input);
WritableRaster raster = image.getRaster();
要将像素获取为
int
ARGB值,您不需要
光栅
,始终可以直接从
缓冲图像
获取:

int[] pixels = new int[w * h];
image.getRGB(0, 0, w, h, pixels, 0, w);
这些值将在sRGB颜色空间中进行规格化和显示。不管图像中的实际样本格式如何,它都可以工作

但是,如果(且仅当)您的光栅(或其背面的
DataBuffer
)已经包含
int
ARGB(像素压缩)格式的像素,您可以通过这种方式访问它们,这会更快(因为它不需要转换):

但在许多情况下,图像将是3或4字节的RGB/BGR或RGBA/ABGR(像素交错)形式

然后,您可以像这样直接获取像素:

byte[] pixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();

如果您喜欢,您需要循环遍历这些值并将其转换为压缩格式

您不只是用
ImageIO
加载
buffereImage
,然后从中获取光栅,这有什么原因吗?(不确定是否有差异,只是为了澄清)我已经尝试过了,但我不知道如何获得int rgba值。你能帮我吗?我在这里做错了什么:同样,可能有一个简单的解决方案:您可以调用
bufferedImage.getRGB(x,y)
来获取ARGB值。(使用光栅可能更快,但您必须确切了解数据在内部的存储方式。
getRGB
方法在内部为您完成所有必要的转换)
byte[] pixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();