2

我正在使用具有方法的 API

public void setImage(byte[][] newImage)

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

“这个图像的格式是一个简单的原始字节。每个字节代表从到2D array的灰色阴影。在索引 时,先行,后行,例如 image[y][x]。参数值不会在内部克隆。为了避免不需要的共享,请在调用此方法之前克隆图像数据。”black (0)white (255)2D arrayY axisX axis

我应该将 .gif 图像传递给此方法,但我一生都无法弄清楚如何将 .gif 转换为 .gif 图像byte[][] array

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

4

3 回答 3

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数组,因为(正如我之前评论的)声明该setImage方法的 API 存在根本问题。Java 中的Abyte是有符号的,因此表示最小值 -128 和最大值 127,因此不能用于值 0 - 255。

于 2013-07-30T16:27:11.840 回答
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();

这基本上是:它将图像读入 a BufferedImage,将其渲染为灰度图像并将结果写入 a ByteArrayOutputStream,从而允许您访问原始字节。

不过有几点注意事项: - 你需要自己添加异常处理 - 我对"RAW"格式不是 100% 确定(不幸的是我自己无法测试),但它应该让你开始

作为替代方案,您可以获取图像的栅格,例如通过调用image.getRaster(),自己迭代像素,将它们转换为无符号字节并将它们放入字节数组中。

于 2013-07-30T15:50:40.530 回答
0

基本问题是 .gif 文件不像位图那样简单地存储图像数据,gif 的内容是定义的结构,并且图像数据是用 LZW 编码的。

这意味着读取 gif 文件并提取图像数据并非易事。

您可以尝试使用gif4j,它可以让您读取 gif 文件,然后您可以在其中访问每个 Pixel。然后,您可以使用简单的循环创建二维数组。

于 2013-07-30T15:52:04.950 回答