Skip to content

Commit 211de02

Browse files
author
wangdongman
committed
node sharp 合并图片
1 parent b2c5f1f commit 211de02

File tree

2 files changed

+98
-0
lines changed

2 files changed

+98
-0
lines changed

Diff for: sharp/demo.js

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
const f = require('./merge')
2+
const ptah = require('path')
3+
function mergePath (stringPathOrStringPathArray) {
4+
return ptah.join(__dirname, stringPathOrStringPathArray)
5+
}
6+
const outFilePath = mergePath('merge.png')
7+
console.log('outFilePath:',outFilePath)
8+
9+
f.mergeImages([
10+
'n1.png',
11+
'n2.png',
12+
'n3.png',
13+
'n4.png',
14+
'n5.png',
15+
'n6.png',
16+
'n7.png',
17+
'n8.png',
18+
'n9.png',
19+
'n10.png',
20+
'n11.png',
21+
'n12.png'
22+
],outFilePath)

Diff for: sharp/merge.js

+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
2+
const sharp = require('sharp')
3+
const path = require('path')
4+
async function mergeImages(stringArray, outFilePath) {
5+
6+
if (!Array.isArray(stringArray)) {
7+
throw console.error('请传入字符串图片路径数组')
8+
return
9+
}
10+
// 拷贝数组
11+
let mergeArray = stringArray.slice()
12+
13+
// 获取第一张
14+
let backgroudImages = mergeArray.shift()
15+
16+
// 第一张要转换为buffer数据
17+
let backgroudBuffer = getBuffer(backgroudImages)
18+
// 获取合并数据
19+
let mergeImagesBuffer = await mergeImagesForArray(mergeArray, backgroudBuffer)
20+
console.log('mergeImagesBuffer:',mergeImagesBuffer)
21+
// mergeImagesBuffer.then((data) => {
22+
// sharp(data.data).toFile(outFilePath);
23+
// }).catch(error => {
24+
// throw new Error('Generate Share Image Failed.');
25+
// });
26+
if(mergeImagesBuffer && mergeImagesBuffer.data){
27+
outMergeImages(mergeImagesBuffer.data, outFilePath)
28+
}else{
29+
throw console.error('合成数据出错!')
30+
}
31+
}
32+
33+
function outMergeImages (mergeImagesBuffer, outFilePath) {
34+
sharp(mergeImagesBuffer).toFile(outFilePath, function(err, info){})
35+
}
36+
37+
function getBuffer(stringImagePath) {
38+
if (typeof stringImagePath !== 'string') {
39+
return new Promise().reject({})
40+
}
41+
return sharp(stringImagePath).toBuffer({
42+
resolveWithObject: true
43+
})
44+
}
45+
46+
// 合并数组里面的全部图片
47+
function mergeImagesForArray(stringArray, backgroudBuffer) {
48+
return stringArray.reduce((input, next_overlay, index) => {
49+
50+
return input.then(input_result => {
51+
return sharp(input_result.data)
52+
/*
53+
sharp.gravity: {
54+
centre: 0, // 默认
55+
north: 1,
56+
east: 2,
57+
south: 3,
58+
west: 4,
59+
northeast: 5,
60+
southeast: 6,
61+
southwest: 7,
62+
northwest: 8 }
63+
*/
64+
// options.gravity(centre) 默认居中 { gravity: sharp.gravity.southeast }
65+
.overlayWith(next_overlay /* { gravity: sharp.gravity.southeast } */) // 全尺寸图片不支持top/left
66+
.toBuffer({ resolveWithObject: true });
67+
})
68+
69+
}, backgroudBuffer)
70+
}
71+
72+
73+
module.exports = {
74+
mergeImages,
75+
outMergeImages
76+
}

0 commit comments

Comments
 (0)