Java中相当于JavaScript的Canvas getImageData方法

4

我正在将一个HTML5的Canvas示例移植到Java中,目前进展顺利,直到遇到这个函数调用:

Canvas.getContext('2d').getImageData(0, 0, 100, 100).data

我谷歌搜索了一会儿,找到了这个canvas规范页面:

http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#pixel-manipulation

阅读后,我创建了下面的函数:

public int[] getImageDataPort(BufferedImage image) {
    int width = image.getWidth();
    int height = image.getHeight();

    int[] ret = new int[width * height * 4];

    int idx = 0;
    for (int y = 0; y < height; y++) {
        for (int x = 0; x < width; x++) {
            int color = image.getRGB(x, y);

            ret[idx++] = getRed(color);
            ret[idx++] = getGreen(color);
            ret[idx++] = getBlue(color);
            ret[idx++] = getAlpha(color);
        }
    }
    return ret;
}

public int getRed(int color) {
    return (color >> 16) & 0xFF;
}

public int getGreen(int color) {
    return (color >> 8) & 0xFF;
}

public int getBlue(int color) {
    return (color >> 0) & 0xFF;
}

public int getAlpha(int color) {
    return (color >> 24) & 0xff;
}

Java Graphics API 中是否有内置此功能的任何类,还是我应该使用我已创建的类?


太好了!一个问题适用于Java和Javascript标签! - invisible bob
3个回答

1
感谢aioobe,我查看了WritableRaster类并找到了getPixels函数,它正好符合我的需求,最终结果如下:
public int[] getImageDataPort(BufferedImage image) {
    int width = image.getWidth();
    int height = image.getHeight();

    int[] ret = null;

    ret = image.getRaster().getPixels(0, 0, width, height, ret);

    return ret;
}

唯一可能出现的问题是当image.getType不支持alpha与问题代码进行比较时,会导致更小的int[] ret,但可以通过以下方式简单地转换图像类型:
public BufferedImage convertType(BufferedImage image,int type){
    BufferedImage ret = new BufferedImage(image.getWidth(), image.getHeight(), type);
    ColorConvertOp xformOp = new ColorConvertOp(null);
    xformOp.filter(image, ret);
    return ret;
}

请问您能否提供ColorConvertOp的定义? - Mehdi Karamosly

1

我认为在标准的Java API中,你能找到最接近的东西是Raster类。你可以通过BufferedImage.getRaster获取一个WritableRaster(用于低级图像操作)。然后,Raster类提供了一些方法,例如getSamples,它会将图像数据填充到一个int[]中。


0

尝试一下

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(bi, "jpg", baos);

其中 bi - 缓冲区结束图像


我以为他在追求原始位图。 - aioobe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接