我正在将一个HTML5的Canvas示例移植到Java,到目前为止一直很好,直到我进入这个函数调用:
Canvas.getContext('2d').getImageData(0, 0, 100, 100).data
我用Google搜索了一段时间,找到了画布规范的这一页
阅读之后,我在下面创建了这个功能:
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上有没有内置此功能的类,或者我应该使用我创建的那个?
答案 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