如何将.gif转换为byte [] []?

时间:2013-07-30 15:35:51

标签: java bytearray

我正在使用具有方法

的API
public void setImage(byte[][] newImage)

API参考中给出的唯一信息是

“此图片的格式是一个简单的原始2D array字节。每个字节代表从black (0)white (255)的灰色阴影。当索引2D array时,{ {1}}先行,Y axis成为第二,例如image [y] [x]。 内部未克隆参数值。为避免不必要的共享,请在调用此方法之前克隆图像数据。“

我应该将.gif图像传递给此方法,但无法弄清楚如何将.gif转换为X axis

任何帮助都会很棒!谢谢。

3 个答案:

答案 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。使用简单的循环,您可以创建二维数组。