我正在尝试用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));
}
如何获取光栅?
答案 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();
打包表单。