【问题标题】:2d double array to image二维双数组图像
【发布时间】:2021-11-12 12:49:18
【问题描述】:

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

【问题讨论】:

  • 二维双精度数组的取值范围是多少?您有红色、绿色和蓝色值,范围从 0 到 255。创建一个与 2D 数组具有相同维度的 BufferedImage,将 2D 双精度值转换为像素颜色,并将像素颜色写入 BufferedImage 中的相同位置作为二维数组。

标签: java arrays awt simulation


【解决方案1】:

基本上通过Gilbert Le Blanc创建一个BufferedImage,作为suggested,并使用其setRGB方法设置像素(或获取其Graphics在其上绘制)。

例如,假设值在0.01.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:发布到灰色的映射不一定是关于我们感知的最佳计算

【讨论】:

    猜你喜欢
    • 2012-11-10
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 2013-07-12
    • 2018-06-30
    相关资源
    最近更新 更多