【问题标题】:Create a bitmap file from random data从随机数据创建位图文件
【发布时间】:2015-01-27 01:48:43
【问题描述】:

如何将随机数据的二维数组转换为位图?我正在做的是使用菱形正方形算法创建一个高度图——效果很好——但我希望能够可视化结果以进行测试和调试。我认为最好的方法是将结果生成为灰度位图。

我见过很多读取和写入位图数据的示例(即,将图像读取到字节缓冲区并再次返回),但没有什么可以解释如何获取随机数据并使用它创建图像。我要做的就是获取数组的每个值并将其转换为灰度像素。

例如:

data[0][0] = 98, then pixel (0,0) would be RGB (98,98,98)
data[0][1] = 220, then pixel (0,1) would be RGB (220,220,220)

我的随机值已经在 0 到 255 之间。

【问题讨论】:

  • 是的,它很接近。在发布我自己的问题之前,我没有找到该帖子,但我认为就问题本身而言,我的帖子可能更清楚一些。另外,我不明白为什么将“Java”作为编辑删除?我认为这很重要,因为如其中一个答案所述,可能有 Java API 对此有用。

标签: java bitmap


【解决方案1】:

这是一种相当快的方法。您必须将数据展平为宽度 * 高度的 3 倍的一维数组才能使用此方法。我使用在每个位置填充了Math.random() 的二维数据数组对其进行了测试

int width = data.length;
int height = data[0].length;

int[] flattenedData = new int[width*height*3];
BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
int ind = 0;
for (int i = 0; i < width; i++)
{
    for (int j = 0; j < height; j++)
    {
        greyShade = data[i][j];
        flattenedData[ind + j*3] = greyShade;
        flattenedData[ind + j*3+1] = greyShade;
        flattenedData[ind + j*3+2] = greyShade;

      }
    ind += height*3;
}       

img.getRaster().setPixels(0, 0, 100, 100, flattenedData);

JLabel jLabel = new JLabel(new ImageIcon(img));

JPanel jPanel = new JPanel();
jPanel.add(jLabel);
JFrame r = new JFrame();
r.add(jPanel);
r.show();

【讨论】:

  • 好帖子 - 正是我一直在寻找的。​​span>
【解决方案2】:

使用 BufferedImage.setRGB(x, y, rgb) ,其中 rgb 是 int ,您可以通过使用像 Color(data[x][y],data[x][y],data[x][y]).getRGB() 这样的 Color 类来获得。当您结束填充像素时,只需使用 ImageIO.write(bufferedImage, "bmp", file) 保存即可。

【讨论】:

  • 谢谢,这看起来很简单!
【解决方案3】:

有几个 API 可以处理您可能想要查看的图像,其中至少包括一个属于标准扩展库 (javax.imageio) 的 API。

或者,如果你想手动滚动,BMP 文件格式并不复杂,文档是easy to find,示例代码是readily available

【讨论】:

  • 很容易找到,是的,但对我来说并不那么容易理解。您发布的“随时可用”链接正是我在发布问题之前一直在摸索的链接。该代码完全没有注释,我无法弄清楚如何对其进行按摩以符合我的目的。看起来作者期望的数组来自位图 - 所以它已经填充了正确排列的 rgb 值。
  • @eric_the_animal 不幸的是,这在 OP 中没有披露,所以我无法知道你一直在思考另一个问题。也许解决该问题的更好方法是参考另一个问题,并指出您正在寻找进一步的说明。当我们了解您已经尝试过的内容时,提供帮助会容易得多。如果您仍然对手动执行此操作感兴趣,而不是使用 java.awt API(这是一个很好的解决方案),请告诉我,我们可以查看链接示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 2020-10-26
相关资源
最近更新 更多