将渐变应用于开放层中的图标
Apply a Gradient to an Icon in Open Layers
在我的项目中,我最初使用 CircleStyle
在地图上创建点,然后使用 fill: new Fill({
和 CanvasGradient
用两种颜色设置点的样式。
我现在想为这些点使用自定义图标(例如 'icon.png'),而不只是一个彩色圆点。
我已经尝试为此使用 image: new Icon
来显示图标,但我无法对此应用 CanvasGradient
。
我可以使用 color
将单一颜色应用到图标上,它用透明的颜色覆盖图标,理想情况下我希望它有 2 种颜色;图标的一半是一种颜色,图标的一半是另一种颜色。
我上传了一张图片,展示了我的观点目前在下方的样子。
circleStyle point with 2 colours applied using ColourGradient
文档表明 CanvasGradient
不能应用于图标所以我的问题是:如何在 OpenLayers 中将两个 colours/a 渐变应用于图标?
OpenLayers 图标样式可以采用 canvas 元素和图标 url。因此,您可以加载图标 url,将其绘制为 canvas,使用乘法运算应用渐变,最后使用 destination-in 运算恢复透明度:
const img = document.createElement('img');
img.onload = function () {
const width = img.width;
const height = img.height;
const canvas = document.createElement('canvas');
canvas.width = width;
canvas.height = height;
const context = canvas.getContext('2d');
const gradient = context.createLinearGradient(0, 0, width, 0);
gradient.addColorStop(0, 'red');
gradient.addColorStop(0.5, 'red');
gradient.addColorStop(0.5, 'green');
gradient.addColorStop(1, 'green');
context.drawImage(img, 0, 0);
context.globalCompositeOperation = 'multiply';
context.fillStyle = gradient;
context.fillRect(0, 0, width, height);
context.globalCompositeOperation = 'destination-in';
context.drawImage(img, 0, 0);
feature.setStyle(
new Style({
image: new Icon({
img: canvas,
imgSize: [width, height],
})
})
);
};
img.src = icon_url;
工作示例https://codesandbox.io/s/icon-color-forked-4b1e1?file=/main.js
在我的项目中,我最初使用 CircleStyle
在地图上创建点,然后使用 fill: new Fill({
和 CanvasGradient
用两种颜色设置点的样式。
我现在想为这些点使用自定义图标(例如 'icon.png'),而不只是一个彩色圆点。
我已经尝试为此使用 image: new Icon
来显示图标,但我无法对此应用 CanvasGradient
。
我可以使用 color
将单一颜色应用到图标上,它用透明的颜色覆盖图标,理想情况下我希望它有 2 种颜色;图标的一半是一种颜色,图标的一半是另一种颜色。
我上传了一张图片,展示了我的观点目前在下方的样子。 circleStyle point with 2 colours applied using ColourGradient
文档表明 CanvasGradient
不能应用于图标所以我的问题是:如何在 OpenLayers 中将两个 colours/a 渐变应用于图标?
OpenLayers 图标样式可以采用 canvas 元素和图标 url。因此,您可以加载图标 url,将其绘制为 canvas,使用乘法运算应用渐变,最后使用 destination-in 运算恢复透明度:
const img = document.createElement('img');
img.onload = function () {
const width = img.width;
const height = img.height;
const canvas = document.createElement('canvas');
canvas.width = width;
canvas.height = height;
const context = canvas.getContext('2d');
const gradient = context.createLinearGradient(0, 0, width, 0);
gradient.addColorStop(0, 'red');
gradient.addColorStop(0.5, 'red');
gradient.addColorStop(0.5, 'green');
gradient.addColorStop(1, 'green');
context.drawImage(img, 0, 0);
context.globalCompositeOperation = 'multiply';
context.fillStyle = gradient;
context.fillRect(0, 0, width, height);
context.globalCompositeOperation = 'destination-in';
context.drawImage(img, 0, 0);
feature.setStyle(
new Style({
image: new Icon({
img: canvas,
imgSize: [width, height],
})
})
);
};
img.src = icon_url;
工作示例https://codesandbox.io/s/icon-color-forked-4b1e1?file=/main.js