【问题标题】:Java BufferedImage to pixel arrayJava BufferedImage 到像素数组
【发布时间】:2015-01-22 09:31:20
【问题描述】:

我看到一个关于将 BufferedImage 转换为像素/字节数组的线程。直接在图像上使用getRGB 可以,但并不理想,因为收集所有像素太慢了。我尝试了简单地抓取像素数据的替代方法。

    //convert canvas to bufferedimage
    BufferedImage img = new BufferedImage(500, 500, BufferedImage.TYPE_3BYTE_BGR);
    Graphics2D g2 = img.createGraphics();
    canvas.printAll(g2);
    g2.dispose();

    System.out.println(img.getRGB(0, 0));    //-16777216 works but not ideal

    byte[] pixels = ((DataBufferByte) img.getRaster().getDataBuffer()).getData();
    for(byte b : pixels){
        System.out.println(b);    //all 0 doesnt work
    }

但是,整个字节数组似乎是空的(用 0 填充)。

【问题讨论】:

    标签: java arrays rgb bufferedimage pixels


    【解决方案1】:

    我不知道 canvas 在您的代码中是什么意思,但这非常有效:

    import java.awt.Color;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.awt.image.DataBufferByte;
    
    public class Px {
    
        public static void main(String[] args) {
            new Px().go();
        }
    
        private void go() {
            BufferedImage img = new BufferedImage(5, 5, BufferedImage.TYPE_3BYTE_BGR);
            Graphics2D g2 = img.createGraphics();
            g2.setColor(Color.red);
            g2.fillRect(0, 0, 2, 2);
            g2.dispose();
    
            byte[] pixels = ((DataBufferByte) img.getRaster().getDataBuffer()).getData();
            for (byte b : pixels) {
                System.out.print(b + ",");
            }
        }
    }
    

    结果是这样的:

    0,0,-1,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    

    颜色顺序是蓝绿红。所以我的红色矩形显示为 0,0,-1,0,0,-1 等中的字节。我假设 -1 与 255“相同”。

    您可以探索您的线路canvas.printAll()。也许画布只包含黑色像素。

    【讨论】:

    • 但这留下了一个问题:为什么getRGB 有效?
    • java 中的字节是有符号类型。使用它的 8 位,您可以显示从 -128 到 +127 的数字。然而,图像字节通常是无符号的。那么如果将无符号字节 255 = (11111111) 转换为有符号会发生什么?检查en.wikipedia.org/wiki/Two%27s_complement
    • getRGB 文档告诉我使用的模型是 TYPE_INT_ARGB。也许那里的 alpha 值是有价值的。我不想深究。我尝试了另一个名为 getPixel 的函数。所以 img.getData().getPixel(...) 用(在我的红色的情况下)255,0,0 填充一个 int 数组。这对我来说很明显是红色的:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    相关资源
    最近更新 更多