【问题标题】:How do I create a BufferedImage from array containing pixels?如何从包含像素的数组创建 BufferedImage?
【发布时间】:2012-03-12 20:40:19
【问题描述】:

我使用getRGB() 方法从BufferedImage 获取像素。像素存储在名为data[] 的数组中。在对数据数组进行一些操作之后,我需要再次创建一个BufferedImage,以便我可以将它传递给一个模块,该模块将显示来自这个数据数组的修改后的图像,但我坚持下去。

【问题讨论】:

    标签: java image image-processing bufferedimage pixels


    【解决方案1】:

    我使用 getRGB() 方法从 BufferedImage 中获取像素。这 像素存储在名为 data[] 的数组中。

    请注意,这可能会非常慢。如果您的 BufferedImage 支持它,您可能希望改为访问底层 int[] 并直接从那里复制/读取像素。

    例如,将您的 data[] 快速复制到新 BufferedImage 的底层 int[] 中:

    BufferedImage bi = new BufferedImage( w, h, BufferedImage.TYPE_INT_ARGB );
    final int[] a = ( (DataBufferInt) res.getRaster().getDataBuffer() ).getData();
    System.arraycopy(data, 0, a, 0, data.length);
    

    当然,您要确保您的 data[] 包含与 BufferedImage(本例中为 ARGB)具有相同表示形式的像素。

    【讨论】:

    • 这是更好的答案。我想不出任何情况下 setRGB 是任何事情的最佳解决方案。
    • 我认为你的代码有错误:你的意思是bi.getRaster而不是res.getRaster
    • @manguy 我不认为他们的回答有效,我试过了。我认为这是因为他们使用 BufferedImage 数据创建了一个数组,但该数组实际上并不指向 BufferedImage。它只是一个新创建的参考。
    【解决方案2】:
    BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    

    然后重新设置像素。

    bufferedImage.setRGB(x, y, your_value);
    

    PS:如cmets中所述,请使用@TacticalCoder的答案

    【讨论】:

    • 您不应该遍历整个图像并一次设置一个位。您应该一次性复制整个缓冲区。
    • 这是一种在缓冲图像中设置所有像素的糟糕方法,不应成为公认的答案。
    【解决方案3】:

    您可以使用 setRGB 方法为新图像中的像素设置 RGB (int) 值。

    【讨论】:

    • 如何创建缓冲图像??
    猜你喜欢
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    相关资源
    最近更新 更多