我正在使用具有方法
的APIpublic void setImage(byte[][] newImage)
API参考中给出的唯一信息是
“此图片的格式是一个简单的原始2D array
字节。每个字节代表从black (0)
到white (255)
的灰色阴影。当索引2D array
时,{ {1}}先行,Y axis
成为第二,例如image [y] [x]。
内部未克隆参数值。为避免不必要的共享,请在调用此方法之前克隆图像数据。“
我应该将.gif图像传递给此方法,但无法弄清楚如何将.gif转换为X axis
。
任何帮助都会很棒!谢谢。
答案 0 :(得分:2)
有多种方法可以将颜色转换为灰度,但最简单的方法是将红色,灰色和蓝色值平均化为:
BufferedImage image = ImageIO.read(new File([your gif]));
int[][] imageBytes = new int[image.getHeight()][image.getWidth()];
for (int y = 0; y < image.getHeight(); y++)
{
for (int x = 0; x < image.getWidth(); x++)
{
Color color = new Color(image.getRGB(x, y));
imageBytes[y][x] = (color.getRed() + color.getGreen() + color.getBlue()) / 3;
}
}
注意,我使用了int
数组,因为(正如我之前评论的那样)API声明了setImage
方法存在基本问题。 Java中的byte
已签名,因此最小值为-128,最大值为127,因此不能用于值0 - 255.
答案 1 :(得分:1)
如果您使用的是标准图像io,则可以执行以下操作:
BufferedImage image = ImageIO.read( <your image file> );
ByteArrayOutputStream baos=new ByteArrayOutputStream();
int width=image.getWidth(null);
int height=image.getHeight(null);
BufferedImage bi=new BufferedImage(width,height,BufferedImage.TYPE_BYTE_GRAY);
bi.getGraphics().drawImage(image,0,0,null);
ImageIO.write(bi,"RAW",baos);
baos.flush();
byte[] resultImageAsRawBytes = baos.toByteArray();
baos.close();
这基本上是这样做的:它将图像读入BufferedImage
,将其渲染为灰度图像,并将结果写入ByteArrayOutputStream
,允许您访问原始字节。
但是有一些注意事项:
- 您需要自己添加异常处理
- 我不是100%确定"RAW"
格式(遗憾的是我自己无法测试),但它应该让你开始
作为替代方案,您可以获取图像的栅格,例如通过调用image.getRaster()
,自己迭代像素,将它们转换为无符号字节并将它们放入字节数组中。
答案 2 :(得分:0)
基本问题是.gif文件不像位图一样简单存储图像数据,gif的内容是定义的结构,图像数据用LZW编码。
这意味着读取gif文件并提取图像数据并非易事。
您可以尝试使用gif4j来阅读gif文件,然后您可以access each Pixel。使用简单的循环,您可以创建二维数组。