V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
tangshuaibo
V2EX  ›  JavaScript

大佬们,这种切割加拼图的功能该怎么实现啊

  •  
  •   tangshuaibo · 2020-12-14 14:13:11 +08:00 · 3111 次点击
    这是一个创建于 1470 天前的主题,其中的信息可能已经有所发展或是发生改变。

    类似这种:[https://www.jigsawexplorer.com/online-jigsaw-puzzle-player.html?puzzle_id=christmas-peace]

    图片该怎么按照拼图图块的形状切割?然后两个图块组合后是怎么变成一体的?

    fabricjs 能满足要求吗?求推荐下,能实现这类需求,简单好用的 canvas 库……

    我只做过些 h5 小程序这类的,完全没有 canvas 经验……

    12 条回复    2020-12-14 21:09:25 +08:00
    tangshuaibo
        1
    tangshuaibo  
    OP
       2020-12-14 14:31:14 +08:00
    大佬大佬求出现,给个思路就好🙏
    misdake
        2
    misdake  
       2020-12-14 14:55:14 +08:00
    ## 画每一片:

    参考链接:
    https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Compositing
    https://stackoverflow.com/a/18387192/2244973

    如果每一片形状的数量是有限的,或者形状是无规律的:
    1. drawImage 画 mask(即描述形状的图片)
    2. globalCompositeOperation = 'source-in'; 设置为只允许画在 mask 上
    3. drawImage 画图片本体
    注意调整画图的 src 位置和 dest 位置

    如果每一片形状的数量是非常多且有规律的:
    1. 画一个 path,作为形状
    2. context.clip(); 设置为只能在范围内画
    3. context.drawImage 画图片本体

    ## 变成一体
    这个没什么特别的吧,判断组合然后依次画上去就行了
    在松鼠标的时候,判断一下原图中周围的块是不是真的在旁边,如果在就用并查集连在一起。再拖动的时候,这个集合的块全部一起移动,松开的时候,全部判断新的组合
    tangshuaibo
        3
    tangshuaibo  
    OP
       2020-12-14 15:04:29 +08:00
    @misdake 好的,谢谢大佬
    jaxer
        4
    jaxer  
       2020-12-14 16:14:34 +08:00
    成功划水 17min,完成后下面的欢呼人,以为是丧尸
    fengmumu
        5
    fengmumu  
       2020-12-14 16:55:13 +08:00
    我想到的实现的话思路大概是这样
    每一个拼图都是由核心区域加四周的拼接的接口组成
    然后我把图片使用 cavas 分割成多个小块,每个小块之间是有位置关系的,
    然后我是不想用 canvas 的,我是想用图片或者 span 来做,毕竟有图片了,有关系了,剩下就是渲染了
    然后是否拼接的话 只需要判断 两个拼图的位置关系就行了,
    所谓组的关系,其实也就是移动的时候统一移动,给每一个元素都添加就行

    不知道说清楚没有,感觉重点在图片的切分,和是否拼好的判断这
    你要是要用 canvs 可以用 konva,他有幕布和组的概念。拼好的放到一个组就行了,这个其实你也可以自己做的

    ps: canvas 想要玩的好,线性代数跑不了
    yzqtdu
        6
    yzqtdu  
       2020-12-14 17:30:13 +08:00   ❤️ 1
    楼主可以看看这篇文章,基本能解决你的问题
    https://www.codeproject.com/Articles/395453/Html5-Jigsaw-Puzzle
    jorneyr
        7
    jorneyr  
       2020-12-14 18:29:33 +08:00
    图片都是矩形的,看到不规则的形状是因为颜色透明的原因。
    给每种图片一个类型,上下左右能衔接的图片的类型也是固定匹配的。
    tangshuaibo
        8
    tangshuaibo  
    OP
       2020-12-14 19:43:29 +08:00
    @jaxer 什么意思?
    tangshuaibo
        9
    tangshuaibo  
    OP
       2020-12-14 19:44:46 +08:00
    @fengmumu 谢谢大佬
    tangshuaibo
        10
    tangshuaibo  
    OP
       2020-12-14 19:45:44 +08:00
    @yzqtdu 谢谢大佬
    tangshuaibo
        11
    tangshuaibo  
    OP
       2020-12-14 19:47:15 +08:00
    @jorneyr 谢谢大佬
    M3oM3oBug
        12
    M3oM3oBug  
       2020-12-14 21:09:25 +08:00 via iPhone
    用 Canvas 完全可以做,楼上也说了 konva 和解决思路,我也有一套自己的解决方案有点类似 konva 也可以做,不过话说考虑外包给我吗哈哈
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1039 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 20:00 · PVG 04:00 · LAX 12:00 · JFK 15:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.