Java - get pixel array from image

后端 未结 7 1056
面向向阳花
面向向阳花 2020-11-22 03:52

I\'m looking for the fastest way to get pixel data (int the form int[][]) from a BufferedImage. My goal is to be able to address pixel (x, y) from

7条回答
  •  清酒与你
    2020-11-22 04:17

    Here is another FastRGB implementation found here:

    public class FastRGB {
        public int width;
        public int height;
        private boolean hasAlphaChannel;
        private int pixelLength;
        private byte[] pixels;
    
        FastRGB(BufferedImage image) {
            pixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
            width = image.getWidth();
            height = image.getHeight();
            hasAlphaChannel = image.getAlphaRaster() != null;
            pixelLength = 3;
            if (hasAlphaChannel)
                pixelLength = 4;
        }
    
        short[] getRGB(int x, int y) {
            int pos = (y * pixelLength * width) + (x * pixelLength);
            short rgb[] = new short[4];
            if (hasAlphaChannel)
                rgb[3] = (short) (pixels[pos++] & 0xFF); // Alpha
            rgb[2] = (short) (pixels[pos++] & 0xFF); // Blue
            rgb[1] = (short) (pixels[pos++] & 0xFF); // Green
            rgb[0] = (short) (pixels[pos++] & 0xFF); // Red
            return rgb;
        }
    }
    

    What is this?

    Reading an image pixel by pixel through BufferedImage's getRGB method is quite slow, this class is the solution for this.

    The idea is that you construct the object by feeding it a BufferedImage instance, and it reads all the data at once and stores them in an array. Once you want to get pixels, you call getRGB

    Dependencies

    import java.awt.image.BufferedImage;
    import java.awt.image.DataBufferByte;
    

    Considerations

    Although FastRGB makes reading pixels much faster, it could lead to high memory usage, as it simply stores a copy of the image. So if you have a 4MB BufferedImage in the memory, once you create the FastRGB instance, the memory usage would become 8MB. You can however, recycle the BufferedImage instance after you create the FastRGB.

    Be careful to not fall into OutOfMemoryException when using it on devices such as Android phones, where RAM is a bottleneck

提交回复
热议问题