首页 > 解决方案 > 二维双数组图像

问题描述

我目前正在使用连续代理进行模拟,它会在二维双数组上留下信息素轨迹。信息素轨迹需要在 2d 阵列上,因为需要执行带有均值滤波器的扩散。最终,我需要通过将双精度数组直接转换为awt.Image.

标签: javaarraysawtsimulation

解决方案


基本上按照Gilbert Le Blanc建议创建一个BufferedImage,并使用它的方法来设置像素(或让它在上面绘制)。setRGBGraphics

示例,假设值介于0.0和之间1.0,转换为灰色:

private static BufferedImage create(double[][] array) {
    var image = new BufferedImage(array.length, array[0].length, BufferedImage.TYPE_INT_RGB);
    for (var row = 0; row < array.length; row++) {
        for (var col = 0; col < array[row].length; col++) {
            image.setRGB(col, row, doubleToRGB(array[row][col]));
        }
    }
    return image;
}

private static int doubleToRGB(double d) {
    var gray = (int) (d * 256);
    if (gray < 0) gray = 0;
    if (gray > 255) gray = 255;
    return 0x010101 * gray;
}

doubleToRGB可以更改为使用从值到颜色的更复杂的映射。

例如红色表示较低的值,蓝色表示较高的值:

private static int doubleToRGB(double d) {
    float hue = (float) (d / 1.5);
    float saturation = 1;
    float brightness = 1;
    return Color.HSBtoRGB(hue, saturation, brightness);
}

注意:发布的代码只是为了展示这个想法 - 可以/必须优化 - 缺少错误检查

注 2:发布到灰色的映射不一定是关于我们感知的最佳计算


推荐阅读