【问题标题】:Java creating a BufferedImage from a BytearrayJava 从 Bytearray 创建 BufferedImage
【发布时间】:2015-12-16 17:27:57
【问题描述】:

我想要做的是从一个字节数组创建一个 BufferedImage。这是我现在正在做的事情:

    try {
        ByteArrayInputStream in = new ByteArrayInputStream(bytearray);
        BufferedImage bImageFromConvert = ImageIO.read(in);

        Color color = new Color(bImageFromConvert.getRGB((int) local_car.x, (int) local_car.z));
        System.out.println("R :: "+color.getRed() + " B :: "+color.getBlue() + " G :: "+color.getGreen());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

ImageIO.read 的文档说:

返回一个 BufferedImage 作为使用从当前注册的那些中自动选择的 ImageReader 解码提供的 URL 的结果。从 URL 中获取 InputStream,该 URL 包装在 ImageInputStream 中。如果没有注册的 ImageReader 声称能够读取结果流,则返回 null。

我收到来自 ImageIO.read() 的空指针异常,返回 null。我以 RGBA 的形式发送我的字节数组。为什么 ImageIO.read 返回 null?

【问题讨论】:

    标签: java


    【解决方案1】:

    ImageIO 函数用于读取文件并期望输入流采用 PNG 或 JPG 等文件格式之一,而不是用于读取简单的 rgba 数组。要读取一个简单的数组,请尝试以下操作:

    int width = 256;
    int height = 256;
    final int bytes_per_pixel = 4;
    byte[] raw = new byte[width * height * bytes_per_pixel];
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    IntBuffer intBuf
            = ByteBuffer.wrap(raw)
            .order(ByteOrder.LITTLE_ENDIAN)
            .asIntBuffer();
    int[] array = new int[intBuf.remaining()];
    intBuf.get(array);
    image.setRGB(0, 0, width, height, array, 0, width);
    

    【讨论】:

    • 我对这段代码有疑问,首先bufferedImage类型是RGBA,按照这个顺序,从查看文档中我似乎找不到RGBA。此外,当我尝试将数据输入到我的字节缓冲区时,我得到一个 BufferUnderFlow 异常。有什么想法吗?
    • 用一个希望对 RGBA 更好的替代方案编辑了答案。
    • 感谢您的帮助。如果可以的话,我会投票 10 次
    • 假设您知道图像的宽度和高度。不酷。
    • @AndroidDev 可以从同一个字节数组生成许多不同的图像,例如 400x100 或 200x200。计算机知道你想要哪一个的唯一方法是你告诉它。据推测,如果您从相机获取数据,您可以检查相机规格的尺寸,或者任何其他数据源也将包含用于获取尺寸的单独 API。
    猜你喜欢
    • 1970-01-01
    • 2016-12-10
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多