如何使用IIOImage和Get Raster读取图像

时间:2014-12-17 22:02:54

标签: java javax.imageio raster

我正在尝试用Java读取图像并通过栅格访问像素。但是我从Raster获得了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));
}

如何获取光栅?

1 个答案:

答案 0 :(得分:1)

ImageReader.readAll(...)不起作用。

形成JavaDoc:

  

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

另请注意,IIOImage只能包含BufferedImage a Raster。不是都。 readAll(...)将返回包含IIOImage的{​​{1}}。所以,基本上,你想要实现的目标是行不通的。

但正如@ Marco13在评论中所说,一旦你加载了BufferedImage Raster,这是微不足道的。

BufferedImage

要将像素设为BufferedImage image = ImageIO.read(input); WritableRaster raster = image.getRaster(); ARGB值,您不需要int,您可以始终直接从Raster获取它:< / p>

BufferedImage

这些值将被标准化并在sRGB颜色空间中。无论图像中的实际样本格式如何,它都能正常工作。

但是,如果(并且仅当)您的栅格(或其支持int[] pixels = new int[w * h]; image.getRGB(0, 0, w, h, pixels, 0, w); ,实际上)已经包含DataBuffer ARGB(像素打包)格式的像素,您可以通过这种方式访问​​它们,这更快(因为它不需要转换):

int

在许多情况下,图像将采用3或4 int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData(); RGB / BGR或RGBA / ABGR(像素交错)形式。

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

byte

如果您愿意,则需要遍历这些值并转换为byte[] pixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData(); 打包表单。