1

我想做什么?

我正在尝试根据使用 nodejs(gm) 的预定义多边形缝合 2 个相同大小的图像。我成功地这样做了,但它非常麻烦和耗时。寻找一种更短更好的方法来做到这一点。

详细介绍

我有 2 张图片大小为 256x256。我还有一个预定义的多边形(例如 - [0,255],[0,50],[100,100], [255,50],[255,255],[0,255] )。

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

我的目标是将两张图像拼接在一起,其中第一张图像被裁剪为仅包含多边形中的内容,而另一张图像仅包含多边形外部的内容。比如图1是全红,图2是全黄,那么这个小程序的输出应该是

目前的解决方案

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


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');

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

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

谢谢!

4

0 回答 0