Java相当于JavaScript的Canvas getImageData

时间:2011-02-08 13:11:45

标签: java javascript html5 graphics canvas

我正在将一个HTML5的Canvas示例移植到Java,到目前为止一直很好,直到我进入这个函数调用:

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

我用Google搜索了一段时间,找到了画布规范的这一页

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上有没有内置此功能的类,或者我应该使用我创建的那个?

3 个答案:

答案 0 :(得分:1)

我认为您在标准Java API中最接近的是Raster类。您可以通过BufferedImage.getRaster获取WritableRaster(用于低级图像处理)。然后,Raster类会提供getSamples等方法,用int[]填充图片数据。

答案 1 :(得分: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;
}

答案 2 :(得分:0)

尝试

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

其中bi - BufferendImage