我要做什么?
我正在尝试使用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');
然后使用合成,以便将一个图像放置在另一个图像上。
有什么方法可以简化和优化它?
谢谢!