如何使用nodejs(gm)根据预定义的多边形拼接两张图片

时间:2019-06-05 20:45:35

标签: node.js gm

我要做什么?

我正在尝试使用nodejs(gm)根据预定义的多边形拼接相同大小的2张图像。我成功完成了此操作,但是这非常麻烦且耗时。寻找一种更短,更好的方法。

详细信息

我有2张图片,尺寸为256x256。 我也有预定义的多边形(例如-[0,255],[0,50],[100,100],[255,50],[255,255],[0,255])。

注意: 这些图像可以具有透明像素和常规像素

我的目标是将两幅图像缝合在一起,其中第一幅图像被裁剪为仅包含多边形中的图像,而另一幅图像仅包含多边形外的图像。 例如,如果图像1是完全红色的,图像2是完全黄色的,则此小程序的输出应为: output

当前解决方案

我使用以下代码设法做到了。但是,这很长,很麻烦而且很耗时。


function createMaskAccordingToPolygon(polygon, imageFileName) {
gm(256, 256, '#ffffff')
    .fill('#000000')
    .drawPolygon([polygon])
    .toBuffer('PNG',(err, buffer) => {copyOrigPicOpacityOnMask(err, buffer, imageFileName)});
}

function copyOrigPicOpacityOnMask(err, buffer, imageFileName) {
   if (err) {
        console.log(err);
        throw err;
    }

    //Copies the opacity if the original image over the mask
    gm(buffer)
        .composite(imageFileName)
        .compose('copyOpacity')
        .toBuffer('PNG', (err, buffer) => {removeBlackFromAdjustedMask(err, buffer, imageFileName)});
}

function removeBlackFromAdjustedMask(err, buffer, imageFileName) {
    if (err) {
        console.log(err);
        throw err;
    }

    // Clears the black parts from the mask
    gm(buffer)
        .transparent('#ffffff')
        .write('poly-mask-adjusted-transparent' + imageFileName, (err) => {cutOrigImage(err, imageFileName)});
}

function cutOrigImage(err, imageFileName) {
    if (err) {
        console.log(err);
        throw err;
    }

    gm(imageFileName)
        .composite('poly-mask-adjusted-transparent' + imageFileName)
        .compose('copyOpacity')
        .toBuffer('PNG', (err, buffer) => {endGame(err, buffer, imageFileName)});
}

function endGame(err, buffer, imageFileName) {
    if (err) {
        console.log(err);
        throw err;
    }

    console.log('success');

    gm(buffer)
        .write('end-' + imageFileName, () => {console.log('wrote')})

}

createMaskAccordingToPolygon([ [0,255],[0,50],[100,100], [255,50],[255,255],[0,255] ], 'image1.png');

createMaskAccordingToPolygon([[0,0],[0,50],[100,100],[255,50],[255,0],[0,0]], 'image2.png');

然后使用合成,以便将一个图像放置在另一个图像上。

有什么方法可以简化和优化它?

谢谢!

0 个答案:

没有答案