V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xiyuesaves
V2EX  ›  Node.js

请教各位大神一个关于 sharp .composite 的问题

  •  
  •   xiyuesaves · 2020-09-03 15:34:18 +08:00 · 3614 次点击
    这是一个创建于 1561 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我想使用 sharp 来生成一个扫雷的地图,大小是由用户输入的,生成后这样:

    生成图

    我是先生成背景图再向上面合成数字和方块l_b.png 但是如果遇到用户输入的值过大(我测试是超过 12*12)就会报错

    Exception code=0xc00000fd flags=0x0 at 0x0000000067F19628
    

    在网上搜了下也没找到类似的错误,请问下还有更适合做这个操作的方式吗?下面是有问题的源码

    function create_map(x,y) {
        return new Promise((resolve, reject) => {
            var map_list = [],coordinate_list = [],buffer_svg = []
            var in_x = x * 15 + 15
            var in_y = y * 15 + 15
            var k_x = 15,k_y = 15
            var img_data = fs.readFileSync("static_img/l_b.png")
            var max_num = y
            //生成 svg 文本配置
            var attributes = {fill: 'black', stroke: ''};
            var options = {x: 0, y: 2,letterSpacing:0, fontSize: 12, anchor: 'left top', attributes: attributes};
            //按照最大边来生成 svg 数字
            if (x > y) {
                max_num = x
            }
    
    
    
            //生成 svg 文本图片并转换为 Buffer 格式
            for(var i = 0; i < max_num; i++){
                let svg = textToSVG.getSVG((" "+i).substr(-2), options);
                buffer_svg.push(Buffer.from(svg))
            }
            
            // x 轴定位数字
            for(var i = 0; i < x;i++){
                coordinate_list.push("{input:buffer_svg["+i+"],left:"+(i*15+15)+",top:0}")
            }
            
            // y 轴定位数字
            for(var i = 0; i < y;i++){
                coordinate_list.push("{input:buffer_svg["+i+"],left:0,top:"+(i*15+15)+"}")
            }
    
            for(var i = 0; i < y; i++){
                k_x = 15
                for(var k = 0; k < x; k++){
                    map_list.push("{input:img_data,left:"+k_x+",top:"+k_y+"}")
                    k_x += 15
                }
                k_y += 15
            }
            var temp_script = `function (sharp,img_data,resolve,buffer_svg) {
                sharp({
                     create: {
                        width: ${in_x},
                        height: ${in_y},
                        channels: 4,
                        background: { r: 192, g: 192, b: 192, alpha: 1 }
                     }
                })
                .composite(
                    [${map_list}]
                )
                .png()
                .toBuffer()
                .then(data => {
                    sharp(data)
                    .composite(
                        [${coordinate_list}]
                    )
                    .toFile('./temp_image/tp_.jpg', (err, info) => {
                        if (err) {
                            console.log(err)
                            resolve(false)
                        }else{
                            resolve(true)
                        }
                    })
                })
            }`
            return Function('"use strict";return (' + temp_script + ')')()(
                sharp,img_data,resolve,buffer_svg
            );
        })
    }
    
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3414 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 10:24 · PVG 18:24 · LAX 02:24 · JFK 05:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.