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

发布于 1周前 作者 gougou168 来自 nodejs/Nestjs

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

我想使用 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
    );
})

}


1 回复

当然,我很乐意帮你解决关于 Node.js 中 sharp 库的 .composite 方法的问题。sharp 是一个高性能的 Node.js 模块,用于图像处理,支持多种操作,包括图像的合成(.composite)。

以下是一个简单的例子,展示了如何使用 sharp.composite 方法将一个图像合成到另一个图像上:

const sharp = require('sharp');

// 读取背景图像
sharp('background.png')
  .composite([{ input: 'overlay.png', top: 10, left: 10 }]) // 合成 overlay.png 到背景图像上,位置为 (10, 10)
  .toFile('output.png') // 保存结果到 output.png
  .then(info => {
    console.log('Image composition completed:', info);
  })
  .catch(err => {
    console.error('Error during image composition:', err);
  });

在这个例子中,background.png 是背景图像,overlay.png 是将要合成的图像。我们通过 .composite 方法指定了 overlay.png 的位置(topleft),并将其合成到背景图像上。

请注意,.composite 方法接受一个数组,每个元素都是一个对象,这些对象包含有关要合成的图像的信息,如 input(输入图像路径)、top(顶部位置)、left(左侧位置)等。

确保你已经安装了 sharp 库,可以通过运行 npm install sharp 来安装。如果你遇到任何问题或需要更详细的帮助,请随时提问!

回到顶部