首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何从PNG创建SDF(在Mapbox中使用)?

如何从PNG创建SDF(在Mapbox中使用)?
EN

Stack Overflow用户
提问于 2020-08-07 10:32:39
回答 2查看 4.7K关注 0票数 10

我的任务是更改Mapbox中图标图像的图标颜色。mapbox允许这样做的唯一方法是使用sdf-图标(https://docs.mapbox.com/mapbox-gl-js/style-spec/layers/#paint-symbol-icon-color)。

经过几个小时的搜索,我找不到最简单的方法来实现这一点。我发现了一个npm模块是https://www.npmjs.com/package/image-sdf,但是在使用它在png上的命令将其转换为sdf之后,在地图上呈现并不能给出最好的结果。

我使用的命令

代码语言:javascript
代码运行次数:0
运行
复制
image-sdf cycle-initial.png --spread 5 --downscale 1 --color black > cycle.png

循环-initial.png(输入)如下:

Cycle.png(输出)如下:

但是,虽然使用cycle.png作为图像,src并没有给出最好的结果。

代码片段:

代码语言:javascript
代码运行次数:0
运行
复制
const img = new Image();
img.addEventListener('load', () => {
            this.mapInstance.addImage('circle-icon', img, { sdf: true });
        }, false);
img.src = cycle;

我请求如果有人,请帮助我,如果我在这里做任何错误,或有任何正确的方式来创建sdf-图标,以正确地呈现。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-08 11:09:40

经过几天的研究,我想我找到了解决办法。另外,我想总结SDF图标的创建步骤。

首先,首先,用简单的话说,什么是 SDF :SDF是一种栅格格式,用于显示调整大小、重新着色和旋转的光栅图像。它们是单色的。

用法:--这是我在MAPBOX中第一次与SDF交互。

原因是我们不能在符号层中更改图标的颜色(如果svg或普通光栅png),您必须提供SDF(专门化png)格式才能实现它。(https://docs.mapbox.com/mapbox-gl-js/style-spec/layers/#paint-symbol-icon-color)

如何创建?

  1. Npm模块:https://www.npmjs.com/package/image-sdf命令:
代码语言:javascript
代码运行次数:0
运行
复制
image-sdf input.png --spread 10 --downscale 1 --color black > output.png
  1. 想象:https://imagemagick.org/script/download.php。ImageMagick允许您使用一个命令执行此操作:
代码语言:javascript
代码运行次数:0
运行
复制
convert in.png -filter Jinc -resize 400% -threshold 30% \( +clone -negate -morphology Distance Euclidean -level 50%,-50% \) -morphology Distance Euclidean -compose Plus -composite -level 45%,55% -resize 25% out.png

更新

  1. 还有第三种方法可以通过使用Maki的旧标签来实现这一点,其中只有一个JS文件sdf-render.js可以将源svg转换为sdf图标。但是请注意,这个标记(v0.5.0)使用的是现在不支持的旧版本的JSDOM,要执行这个文件,您必须使用svgdom和@svgdotjs/svg.js模块来转换该文件的代码。

更多细节:方框出现在sdf = true的Mapbox中的图标周围

我做错什么了?

答:在png上执行image命令之前(请注意:它必须是黑白光栅路径)。调整大小(增加)到40%-50%左右.

就像在我的例子中,我调整了普通光栅png的大小,结果令人惊讶。看一看。(请注意:我没有在代码中更改一个单词,而是使用了相同的image命令)

票数 25
EN

Stack Overflow用户

发布于 2022-08-14 14:58:04

另一件要探索的事情是给你的形象一个大小。我想使用svg作为标记图像,并更改:

代码语言:javascript
代码运行次数:0
运行
复制
let img = new Image();
//to
let img = new Image(256, 256);

结果要好得多-

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63299999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档