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