You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Canvas中实现OpenLayers地图BMP图像的图案重色处理

OpenLayers 图案叠加层颜色替换逻辑整合实现

我正在开发OpenLayers地图的特殊图案叠加层,现有代码可基于Base64编码的BMP图像创建重复图案。已知配置中存在白色替换白色的冗余颜色规则,但因该规则来自数据馈送需保留。需要将drawImage结合像素操作的图像重色逻辑整合到现有代码中。

整合后的完整代码

const symbol = {
  kind: 'Icon',
  image:'', // 填入Base64编码的BMP图像
  colors:[
    {
      "oldColor" : [ 0, 0, 0, 100 ],
      "newColor" : [ 64, 101, 235, 100 ]
    },
    {
      "oldColor" : [ 255, 255, 255, 100 ] ,
      "newColor" : [ 255, 255, 255, 100 ]
    }
  ]
};

if (symbol.kind === 'Icon') {
  const canvas = document.createElement('canvas');
  const ctx = canvas.getContext('2d');

  const img = new Image();
  // 处理跨域(若Base64图像来自外部源需添加)
  img.crossOrigin = 'anonymous';
  img.src = symbol.image;

  img.onload = () => {
    // 让画布尺寸和图像一致
    canvas.width = img.width;
    canvas.height = img.height;

    // 1. 将原始图像绘制到画布
    ctx.drawImage(img, 0, 0);

    // 2. 获取像素数据并执行颜色替换
    const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
    const data = imageData.data;

    for (let i = 0; i < data.length; i += 4) {
      symbol.colors.forEach(colorRule => {
        const [oldR, oldG, oldB] = colorRule.oldColor;
        // 匹配RGB通道(如需处理Alpha可拓展)
        if (data[i] === oldR && data[i+1] === oldG && data[i+2] === oldB) {
          const [newR, newG, newB] = colorRule.newColor;
          data[i] = newR;
          data[i+1] = newG;
          data[i+2] = newB;
          // 如需替换Alpha通道,取消下面注释:
          // data[i+3] = colorRule.newColor[3];
        }
      });
    }

    // 3. 将修改后的像素放回画布
    ctx.putImageData(imageData, 0, 0);

    // 4. 基于处理后的画布创建重复图案
    const pattern = ctx.createPattern(canvas, 'repeat');
    symbol.color = pattern;
    delete symbol.image;
  };
}

关键整合说明

  • 画布尺寸匹配:图像加载完成后,把canvas的宽高设置为图像实际尺寸,确保像素操作能覆盖完整图像
  • 像素处理顺序:先绘制原始图像到画布,再读取像素数据做颜色替换,最后将修改后的像素数据放回画布
  • 颜色规则应用:遍历预设的颜色规则,匹配像素的RGB通道后执行替换;如果需要处理Alpha通道,取消代码中对应注释行即可
  • 图案生成:基于处理后的画布而非原始图像创建重复图案,保证最终图案已经应用了颜色替换效果

内容的提问来源于stack exchange,提问作者James

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 08:02:48