使用缓冲图像获取图像的每个像素的颜色

2022-09-01 16:55:45

我试图获得图像的每个像素的每一种颜色。我的想法如下:

int[] pixels;
BufferedImage image;

image = ImageIO.read(this.getClass.getResources("image.png");
int[] pixels = ((DataBufferInt)image.getRaster().getDataBuffer()).getData();

是吗?我甚至无法检查“像素”数组包含的内容,因为我得到以下错误:

java.awt.image.DataBufferByte cannot be cast to java.awt.image.DataBufferInt

我只想接收数组中每个像素的颜色,如何实现?


答案 1
import java.io.*;
import java.awt.*;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;

public class GetPixelColor {
    public static void main(String args[]) throws IOException {
        File file = new File("your_file.jpg");
        BufferedImage image = ImageIO.read(file);
        // Getting pixel color by position x and y 
        int clr = image.getRGB(x, y);
        int red =   (clr & 0x00ff0000) >> 16;
        int green = (clr & 0x0000ff00) >> 8;
        int blue =   clr & 0x000000ff;
        System.out.println("Red Color value = " + red);
        System.out.println("Green Color value = " + green);
        System.out.println("Blue Color value = " + blue);
    }
}

当然,您必须为所有像素添加一个 for 循环


答案 2

问题(也是从第一个答案链接的答案)是,使用ImageIO读取缓冲图像后,您几乎不知道缓冲图像的确切类型。它可以包含 一个 或 一个 .在某些情况下,您可以通过 推导出它,但在最坏的情况下,它具有 类型 ,然后您只能回退到某些测试。DataBufferByteDataBufferIntBufferedImage#getType()TYPE_CUSTOMinstanceof

但是,您可以将图像转换为BufferedImage,该图像保证具有ARGB值 - 即具有类似DataBufferInt

public static BufferedImage convertToARGB(BufferedImage image)
{
    BufferedImage newImage = new BufferedImage(
        image.getWidth(), image.getHeight(),
        BufferedImage.TYPE_INT_ARGB);
    Graphics2D g = newImage.createGraphics();
    g.drawImage(image, 0, 0, null);
    g.dispose();
    return newImage;
}

否则,您可以调用 ,它可以动态执行所需的转换。image.getRGB(x,y)

顺便说一句:请注意,获取 BufferedImage 的数据缓冲区可能会降低绘画性能,因为图像无法再在内部“管理”和保存在 VRAM 中。


推荐