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

2020-09-03 15:34:18 +08:00
 xiyuesaves

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

我是先生成背景图再向上面合成数字和方块 但是如果遇到用户输入的值过大(我测试是超过 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
        );
    })
}
3604 次点击
所在节点    Node.js
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/703900

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX