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