apexify.js 4.5.54 → 4.5.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/ai/ApexAI.d.ts +1 -164
- package/dist/cjs/ai/ApexAI.d.ts.map +1 -1
- package/dist/cjs/ai/ApexAI.js +190 -373
- package/dist/cjs/ai/ApexAI.js.map +1 -1
- package/dist/cjs/ai/ApexModules.d.ts +1 -1
- package/dist/cjs/ai/ApexModules.d.ts.map +1 -1
- package/dist/cjs/ai/ApexModules.js +6 -18
- package/dist/cjs/ai/ApexModules.js.map +1 -1
- package/dist/cjs/ai/functions/draw.d.ts.map +1 -1
- package/dist/cjs/ai/functions/draw.js +6 -6
- package/dist/cjs/ai/functions/draw.js.map +1 -1
- package/dist/cjs/ai/modals-chat/electronHub/imageModels.d.ts +1 -1
- package/dist/cjs/ai/modals-chat/electronHub/imageModels.d.ts.map +1 -1
- package/dist/cjs/ai/modals-chat/electronHub/imageModels.js +1 -4
- package/dist/cjs/ai/modals-chat/electronHub/imageModels.js.map +1 -1
- package/dist/cjs/ai/utils.d.ts +1 -4
- package/dist/cjs/ai/utils.d.ts.map +1 -1
- package/dist/cjs/ai/utils.js +1 -7
- package/dist/cjs/ai/utils.js.map +1 -1
- package/dist/cjs/canvas/ApexPainter.d.ts +17 -14
- package/dist/cjs/canvas/ApexPainter.d.ts.map +1 -1
- package/dist/cjs/canvas/ApexPainter.js +29 -11
- package/dist/cjs/canvas/ApexPainter.js.map +1 -1
- package/dist/cjs/canvas/utils/Background/bg.d.ts +24 -0
- package/dist/cjs/canvas/utils/Background/bg.d.ts.map +1 -0
- package/dist/{esm/canvas/utils → cjs/canvas/utils/Background}/bg.js +27 -52
- package/dist/cjs/canvas/utils/Background/bg.js.map +1 -0
- package/dist/cjs/canvas/utils/Background/circular.d.ts +3 -0
- package/dist/cjs/canvas/utils/Background/circular.d.ts.map +1 -0
- package/dist/{esm/canvas/utils → cjs/canvas/utils/Background}/circular.js +0 -8
- package/dist/cjs/canvas/utils/{circular.js.map → Background/circular.js.map} +1 -1
- package/dist/cjs/canvas/utils/Background/radius.d.ts +18 -0
- package/dist/cjs/canvas/utils/Background/radius.d.ts.map +1 -0
- package/dist/cjs/canvas/utils/Background/radius.js +115 -0
- package/dist/cjs/canvas/utils/Background/radius.js.map +1 -0
- package/dist/cjs/canvas/utils/{charts.d.ts → Charts/charts.d.ts} +1 -1
- package/dist/cjs/canvas/utils/Charts/charts.d.ts.map +1 -0
- package/dist/cjs/canvas/utils/Charts/charts.js.map +1 -0
- package/dist/cjs/canvas/utils/Custom/customLines.d.ts +3 -0
- package/dist/cjs/canvas/utils/Custom/customLines.d.ts.map +1 -0
- package/dist/cjs/canvas/utils/Custom/customLines.js.map +1 -0
- package/dist/cjs/canvas/utils/General/conversion.d.ts.map +1 -0
- package/dist/cjs/canvas/utils/General/conversion.js.map +1 -0
- package/dist/cjs/canvas/utils/{general functions.d.ts → General/general functions.d.ts } +18 -4
- package/dist/cjs/canvas/utils/General/general functions.d.ts.map +1 -0
- package/dist/{esm/canvas/utils → cjs/canvas/utils/General}/general functions.js +89 -58
- package/dist/cjs/canvas/utils/General/general functions.js.map +1 -0
- package/dist/cjs/canvas/utils/Image/imageProperties.d.ts +81 -0
- package/dist/cjs/canvas/utils/Image/imageProperties.d.ts.map +1 -0
- package/dist/{esm/canvas/utils → cjs/canvas/utils/Image}/imageProperties.js +224 -45
- package/dist/cjs/canvas/utils/Image/imageProperties.js.map +1 -0
- package/dist/{esm/canvas/utils → cjs/canvas/utils/Texts}/textProperties.d.ts +1 -1
- package/dist/cjs/canvas/utils/Texts/textProperties.d.ts.map +1 -0
- package/dist/cjs/canvas/utils/Texts/textProperties.js.map +1 -0
- package/dist/cjs/canvas/utils/types.d.ts +41 -1
- package/dist/cjs/canvas/utils/types.d.ts.map +1 -1
- package/dist/cjs/canvas/utils/types.js.map +1 -1
- package/dist/cjs/canvas/utils/utils.d.ts +11 -11
- package/dist/cjs/canvas/utils/utils.d.ts.map +1 -1
- package/dist/cjs/canvas/utils/utils.js +11 -10
- package/dist/cjs/canvas/utils/utils.js.map +1 -1
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/esm/ai/ApexAI.d.ts +1 -164
- package/dist/esm/ai/ApexAI.d.ts.map +1 -1
- package/dist/esm/ai/ApexAI.js +190 -373
- package/dist/esm/ai/ApexAI.js.map +1 -1
- package/dist/esm/ai/ApexModules.d.ts +1 -1
- package/dist/esm/ai/ApexModules.d.ts.map +1 -1
- package/dist/esm/ai/ApexModules.js +6 -18
- package/dist/esm/ai/ApexModules.js.map +1 -1
- package/dist/esm/ai/functions/draw.d.ts.map +1 -1
- package/dist/esm/ai/functions/draw.js +6 -6
- package/dist/esm/ai/functions/draw.js.map +1 -1
- package/dist/esm/ai/modals-chat/electronHub/imageModels.d.ts +1 -1
- package/dist/esm/ai/modals-chat/electronHub/imageModels.d.ts.map +1 -1
- package/dist/esm/ai/modals-chat/electronHub/imageModels.js +1 -4
- package/dist/esm/ai/modals-chat/electronHub/imageModels.js.map +1 -1
- package/dist/esm/ai/utils.d.ts +1 -4
- package/dist/esm/ai/utils.d.ts.map +1 -1
- package/dist/esm/ai/utils.js +1 -7
- package/dist/esm/ai/utils.js.map +1 -1
- package/dist/esm/canvas/ApexPainter.d.ts +17 -14
- package/dist/esm/canvas/ApexPainter.d.ts.map +1 -1
- package/dist/esm/canvas/ApexPainter.js +29 -11
- package/dist/esm/canvas/ApexPainter.js.map +1 -1
- package/dist/esm/canvas/utils/Background/bg.d.ts +24 -0
- package/dist/esm/canvas/utils/Background/bg.d.ts.map +1 -0
- package/dist/{cjs/canvas/utils → esm/canvas/utils/Background}/bg.js +27 -52
- package/dist/esm/canvas/utils/Background/bg.js.map +1 -0
- package/dist/esm/canvas/utils/Background/circular.d.ts +3 -0
- package/dist/esm/canvas/utils/Background/circular.d.ts.map +1 -0
- package/dist/{cjs/canvas/utils → esm/canvas/utils/Background}/circular.js +0 -8
- package/dist/esm/canvas/utils/{circular.js.map → Background/circular.js.map} +1 -1
- package/dist/esm/canvas/utils/Background/radius.d.ts +18 -0
- package/dist/esm/canvas/utils/Background/radius.d.ts.map +1 -0
- package/dist/esm/canvas/utils/Background/radius.js +115 -0
- package/dist/esm/canvas/utils/Background/radius.js.map +1 -0
- package/dist/esm/canvas/utils/{charts.d.ts → Charts/charts.d.ts} +1 -1
- package/dist/esm/canvas/utils/Charts/charts.d.ts.map +1 -0
- package/dist/esm/canvas/utils/Charts/charts.js.map +1 -0
- package/dist/esm/canvas/utils/Custom/customLines.d.ts +3 -0
- package/dist/esm/canvas/utils/Custom/customLines.d.ts.map +1 -0
- package/dist/esm/canvas/utils/Custom/customLines.js.map +1 -0
- package/dist/esm/canvas/utils/General/conversion.d.ts.map +1 -0
- package/dist/esm/canvas/utils/General/conversion.js.map +1 -0
- package/dist/esm/canvas/utils/{general functions.d.ts → General/general functions.d.ts } +18 -4
- package/dist/esm/canvas/utils/General/general functions.d.ts.map +1 -0
- package/dist/{cjs/canvas/utils → esm/canvas/utils/General}/general functions.js +89 -58
- package/dist/esm/canvas/utils/General/general functions.js.map +1 -0
- package/dist/esm/canvas/utils/Image/imageProperties.d.ts +81 -0
- package/dist/esm/canvas/utils/Image/imageProperties.d.ts.map +1 -0
- package/dist/{cjs/canvas/utils → esm/canvas/utils/Image}/imageProperties.js +224 -45
- package/dist/esm/canvas/utils/Image/imageProperties.js.map +1 -0
- package/dist/{cjs/canvas/utils → esm/canvas/utils/Texts}/textProperties.d.ts +1 -1
- package/dist/esm/canvas/utils/Texts/textProperties.d.ts.map +1 -0
- package/dist/esm/canvas/utils/Texts/textProperties.js.map +1 -0
- package/dist/esm/canvas/utils/types.d.ts +41 -1
- package/dist/esm/canvas/utils/types.d.ts.map +1 -1
- package/dist/esm/canvas/utils/types.js.map +1 -1
- package/dist/esm/canvas/utils/utils.d.ts +11 -11
- package/dist/esm/canvas/utils/utils.d.ts.map +1 -1
- package/dist/esm/canvas/utils/utils.js +11 -10
- package/dist/esm/canvas/utils/utils.js.map +1 -1
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/lib/ai/ApexAI.ts +195 -697
- package/lib/ai/ApexModules.ts +7 -17
- package/lib/ai/functions/draw.ts +6 -8
- package/lib/ai/modals-chat/electronHub/imageModels.ts +2 -5
- package/lib/ai/utils.ts +0 -6
- package/lib/canvas/ApexPainter.ts +73 -38
- package/lib/canvas/utils/Background/bg.ts +97 -0
- package/lib/canvas/utils/Background/circular.ts +17 -0
- package/lib/canvas/utils/Background/radius.ts +113 -0
- package/lib/canvas/utils/{charts.ts → Charts/charts.ts} +1 -1
- package/lib/canvas/utils/{customLines.ts → Custom/customLines.ts} +1 -1
- package/lib/canvas/utils/{conversion.ts → General/conversion.ts} +1 -1
- package/lib/canvas/utils/{general functions.ts → General/general functions.ts } +143 -121
- package/lib/canvas/utils/Image/imageProperties.ts +631 -0
- package/lib/canvas/utils/{textProperties.ts → Texts/textProperties.ts} +1 -1
- package/lib/canvas/utils/types.ts +45 -2
- package/lib/canvas/utils/utils.ts +14 -11
- package/package.json +1 -4
- package/dist/cjs/ai/functions/generateVoiceResponse.d.ts +0 -10
- package/dist/cjs/ai/functions/generateVoiceResponse.d.ts.map +0 -1
- package/dist/cjs/ai/functions/generateVoiceResponse.js +0 -161
- package/dist/cjs/ai/functions/generateVoiceResponse.js.map +0 -1
- package/dist/cjs/ai/modals-chat/gemini/Gemini-flash.d.ts +0 -13
- package/dist/cjs/ai/modals-chat/gemini/Gemini-flash.d.ts.map +0 -1
- package/dist/cjs/ai/modals-chat/gemini/Gemini-flash.js +0 -185
- package/dist/cjs/ai/modals-chat/gemini/Gemini-flash.js.map +0 -1
- package/dist/cjs/ai/modals-chat/gemini/Gemini-pro.d.ts +0 -13
- package/dist/cjs/ai/modals-chat/gemini/Gemini-pro.d.ts.map +0 -1
- package/dist/cjs/ai/modals-chat/gemini/Gemini-pro.js +0 -185
- package/dist/cjs/ai/modals-chat/gemini/Gemini-pro.js.map +0 -1
- package/dist/cjs/ai/modals-chat/gemini/config.d.ts +0 -5
- package/dist/cjs/ai/modals-chat/gemini/config.d.ts.map +0 -1
- package/dist/cjs/ai/modals-chat/gemini/config.js +0 -13
- package/dist/cjs/ai/modals-chat/gemini/config.js.map +0 -1
- package/dist/cjs/ai/modals-chat/gemini/geminiFast.d.ts +0 -15
- package/dist/cjs/ai/modals-chat/gemini/geminiFast.d.ts.map +0 -1
- package/dist/cjs/ai/modals-chat/gemini/geminiFast.js +0 -146
- package/dist/cjs/ai/modals-chat/gemini/geminiFast.js.map +0 -1
- package/dist/cjs/canvas/utils/bg.d.ts +0 -23
- package/dist/cjs/canvas/utils/bg.d.ts.map +0 -1
- package/dist/cjs/canvas/utils/bg.js.map +0 -1
- package/dist/cjs/canvas/utils/charts.d.ts.map +0 -1
- package/dist/cjs/canvas/utils/charts.js.map +0 -1
- package/dist/cjs/canvas/utils/circular.d.ts +0 -10
- package/dist/cjs/canvas/utils/circular.d.ts.map +0 -1
- package/dist/cjs/canvas/utils/conversion.d.ts.map +0 -1
- package/dist/cjs/canvas/utils/conversion.js.map +0 -1
- package/dist/cjs/canvas/utils/customLines.d.ts +0 -3
- package/dist/cjs/canvas/utils/customLines.d.ts.map +0 -1
- package/dist/cjs/canvas/utils/customLines.js.map +0 -1
- package/dist/cjs/canvas/utils/general functions.d.ts.map +0 -1
- package/dist/cjs/canvas/utils/general functions.js.map +0 -1
- package/dist/cjs/canvas/utils/imageProperties.d.ts +0 -62
- package/dist/cjs/canvas/utils/imageProperties.d.ts.map +0 -1
- package/dist/cjs/canvas/utils/imageProperties.js.map +0 -1
- package/dist/cjs/canvas/utils/radius.d.ts +0 -10
- package/dist/cjs/canvas/utils/radius.d.ts.map +0 -1
- package/dist/cjs/canvas/utils/radius.js +0 -30
- package/dist/cjs/canvas/utils/radius.js.map +0 -1
- package/dist/cjs/canvas/utils/textProperties.d.ts.map +0 -1
- package/dist/cjs/canvas/utils/textProperties.js.map +0 -1
- package/dist/esm/ai/functions/generateVoiceResponse.d.ts +0 -10
- package/dist/esm/ai/functions/generateVoiceResponse.d.ts.map +0 -1
- package/dist/esm/ai/functions/generateVoiceResponse.js +0 -161
- package/dist/esm/ai/functions/generateVoiceResponse.js.map +0 -1
- package/dist/esm/ai/modals-chat/gemini/Gemini-flash.d.ts +0 -13
- package/dist/esm/ai/modals-chat/gemini/Gemini-flash.d.ts.map +0 -1
- package/dist/esm/ai/modals-chat/gemini/Gemini-flash.js +0 -185
- package/dist/esm/ai/modals-chat/gemini/Gemini-flash.js.map +0 -1
- package/dist/esm/ai/modals-chat/gemini/Gemini-pro.d.ts +0 -13
- package/dist/esm/ai/modals-chat/gemini/Gemini-pro.d.ts.map +0 -1
- package/dist/esm/ai/modals-chat/gemini/Gemini-pro.js +0 -185
- package/dist/esm/ai/modals-chat/gemini/Gemini-pro.js.map +0 -1
- package/dist/esm/ai/modals-chat/gemini/config.d.ts +0 -5
- package/dist/esm/ai/modals-chat/gemini/config.d.ts.map +0 -1
- package/dist/esm/ai/modals-chat/gemini/config.js +0 -13
- package/dist/esm/ai/modals-chat/gemini/config.js.map +0 -1
- package/dist/esm/ai/modals-chat/gemini/geminiFast.d.ts +0 -15
- package/dist/esm/ai/modals-chat/gemini/geminiFast.d.ts.map +0 -1
- package/dist/esm/ai/modals-chat/gemini/geminiFast.js +0 -146
- package/dist/esm/ai/modals-chat/gemini/geminiFast.js.map +0 -1
- package/dist/esm/canvas/utils/bg.d.ts +0 -23
- package/dist/esm/canvas/utils/bg.d.ts.map +0 -1
- package/dist/esm/canvas/utils/bg.js.map +0 -1
- package/dist/esm/canvas/utils/charts.d.ts.map +0 -1
- package/dist/esm/canvas/utils/charts.js.map +0 -1
- package/dist/esm/canvas/utils/circular.d.ts +0 -10
- package/dist/esm/canvas/utils/circular.d.ts.map +0 -1
- package/dist/esm/canvas/utils/conversion.d.ts.map +0 -1
- package/dist/esm/canvas/utils/conversion.js.map +0 -1
- package/dist/esm/canvas/utils/customLines.d.ts +0 -3
- package/dist/esm/canvas/utils/customLines.d.ts.map +0 -1
- package/dist/esm/canvas/utils/customLines.js.map +0 -1
- package/dist/esm/canvas/utils/general functions.d.ts.map +0 -1
- package/dist/esm/canvas/utils/general functions.js.map +0 -1
- package/dist/esm/canvas/utils/imageProperties.d.ts +0 -62
- package/dist/esm/canvas/utils/imageProperties.d.ts.map +0 -1
- package/dist/esm/canvas/utils/imageProperties.js.map +0 -1
- package/dist/esm/canvas/utils/radius.d.ts +0 -10
- package/dist/esm/canvas/utils/radius.d.ts.map +0 -1
- package/dist/esm/canvas/utils/radius.js +0 -30
- package/dist/esm/canvas/utils/radius.js.map +0 -1
- package/dist/esm/canvas/utils/textProperties.d.ts.map +0 -1
- package/dist/esm/canvas/utils/textProperties.js.map +0 -1
- package/lib/ai/functions/generateVoiceResponse.ts +0 -186
- package/lib/ai/modals-chat/gemini/Gemini-flash.ts +0 -200
- package/lib/ai/modals-chat/gemini/Gemini-pro.ts +0 -203
- package/lib/ai/modals-chat/gemini/config.ts +0 -11
- package/lib/ai/modals-chat/gemini/geminiFast.ts +0 -169
- package/lib/canvas/utils/bg.ts +0 -120
- package/lib/canvas/utils/circular.ts +0 -17
- package/lib/canvas/utils/imageProperties.ts +0 -418
- package/lib/canvas/utils/radius.ts +0 -26
- /package/dist/cjs/canvas/utils/{charts.js → Charts/charts.js} +0 -0
- /package/dist/cjs/canvas/utils/{customLines.js → Custom/customLines.js} +0 -0
- /package/dist/cjs/canvas/utils/{conversion.d.ts → General/conversion.d.ts} +0 -0
- /package/dist/cjs/canvas/utils/{conversion.js → General/conversion.js} +0 -0
- /package/dist/cjs/canvas/utils/{textProperties.js → Texts/textProperties.js} +0 -0
- /package/dist/esm/canvas/utils/{charts.js → Charts/charts.js} +0 -0
- /package/dist/esm/canvas/utils/{customLines.js → Custom/customLines.js} +0 -0
- /package/dist/esm/canvas/utils/{conversion.d.ts → General/conversion.d.ts} +0 -0
- /package/dist/esm/canvas/utils/{conversion.js → General/conversion.js} +0 -0
- /package/dist/esm/canvas/utils/{textProperties.js → Texts/textProperties.js} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import path from 'path'
|
|
2
2
|
import sharp from 'sharp';
|
|
3
|
-
import { cropOptions } from '
|
|
4
|
-
import { createCanvas, loadImage } from '@napi-rs/canvas';
|
|
3
|
+
import { cropOptions, ResizeOptions } from '../types';
|
|
4
|
+
import { createCanvas, loadImage, SKRSContext2D } from '@napi-rs/canvas';
|
|
5
5
|
import fs from "fs";
|
|
6
6
|
import axios from "axios";
|
|
7
7
|
|
|
@@ -28,41 +28,53 @@ export async function loadImages(imagePath: string) {
|
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Resizes an image using Sharp with additional options for quality, kernel, and withoutEnlargement.
|
|
34
|
+
*
|
|
35
|
+
* @param resizeOptions - The options for resizing.
|
|
36
|
+
* @returns A Promise that resolves with the resized image as a Buffer.
|
|
37
|
+
*/
|
|
38
|
+
export async function resizingImg(resizeOptions: ResizeOptions): Promise<Buffer> {
|
|
32
39
|
try {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
40
|
+
if (!resizeOptions.imagePath) {
|
|
41
|
+
throw new Error("Image path is required for resizing.");
|
|
42
|
+
}
|
|
36
43
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
+
let absoluteImagePath: string;
|
|
45
|
+
if (resizeOptions.imagePath.startsWith("http")) {
|
|
46
|
+
absoluteImagePath = resizeOptions.imagePath;
|
|
47
|
+
} else {
|
|
48
|
+
absoluteImagePath = path.join(process.cwd(), resizeOptions.imagePath);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const image = sharp(absoluteImagePath);
|
|
44
52
|
|
|
45
|
-
|
|
53
|
+
const resizeOptionsForSharp: sharp.ResizeOptions = {
|
|
54
|
+
width: resizeOptions.size?.width || 500,
|
|
55
|
+
height: resizeOptions.size?.height || 500,
|
|
56
|
+
fit: resizeOptions.maintainAspectRatio ? sharp.fit.inside : sharp.fit.fill,
|
|
57
|
+
kernel: sharp.kernel.lanczos3,
|
|
58
|
+
withoutEnlargement: true,
|
|
59
|
+
};
|
|
46
60
|
|
|
47
|
-
|
|
48
|
-
width: resizeOptions.size?.width || 500,
|
|
49
|
-
height: resizeOptions.size?.height || 500,
|
|
50
|
-
fit: resizeOptions.maintainAspectRatio ? sharp.fit.inside : sharp.fit.fill
|
|
51
|
-
};
|
|
61
|
+
const quality = resizeOptions.quality ?? 90;
|
|
52
62
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
63
|
+
const resizedBuffer: Buffer = await image
|
|
64
|
+
.resize(resizeOptionsForSharp)
|
|
65
|
+
.png({ quality })
|
|
66
|
+
.toBuffer();
|
|
67
|
+
|
|
57
68
|
|
|
58
|
-
|
|
69
|
+
return resizedBuffer;
|
|
59
70
|
|
|
60
71
|
} catch (error) {
|
|
61
|
-
|
|
62
|
-
|
|
72
|
+
console.error("Error resizing image:", error);
|
|
73
|
+
throw new Error("Failed to resize image");
|
|
63
74
|
}
|
|
64
75
|
}
|
|
65
76
|
|
|
77
|
+
|
|
66
78
|
export async function converter(imagePath: string, newExtension: string) {
|
|
67
79
|
try {
|
|
68
80
|
const validExtensions: (keyof sharp.FormatEnum)[] = ['jpeg', 'png', 'webp', 'tiff', 'gif', 'avif', 'heif', 'raw', 'pdf', 'svg'];
|
|
@@ -249,114 +261,124 @@ export async function imgEffects(imagePath: string, filters: any[]) {
|
|
|
249
261
|
}
|
|
250
262
|
|
|
251
263
|
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
const canvas = createCanvas(width, height);
|
|
267
|
-
const ctx = canvas.getContext('2d');
|
|
268
|
-
|
|
269
|
-
if (options.radius === 'circular') {
|
|
270
|
-
const radius = Math.min(width, height) / 2;
|
|
271
|
-
ctx.arc(width / 2, height / 2, radius, 0, Math.PI * 2);
|
|
272
|
-
ctx.closePath();
|
|
273
|
-
ctx.clip();
|
|
274
|
-
} else if (typeof options.radius === 'number' && options.radius >= 0) {
|
|
275
|
-
ctx.beginPath();
|
|
276
|
-
ctx.moveTo(options.radius, 0);
|
|
277
|
-
ctx.lineTo(width - options.radius, 0);
|
|
278
|
-
ctx.quadraticCurveTo(width, 0, width, options.radius);
|
|
279
|
-
ctx.lineTo(width, height - options.radius);
|
|
280
|
-
ctx.quadraticCurveTo(width, height, width - options.radius, height);
|
|
281
|
-
ctx.lineTo(options.radius, height);
|
|
282
|
-
ctx.quadraticCurveTo(0, height, 0, height - options.radius);
|
|
283
|
-
ctx.lineTo(0, options.radius);
|
|
284
|
-
ctx.quadraticCurveTo(0, 0, options.radius, 0);
|
|
285
|
-
ctx.closePath();
|
|
286
|
-
ctx.clip();
|
|
287
|
-
// @ts-ignore
|
|
288
|
-
} else if (options.radius !== null && options.radius !== 'circular' && (typeof options.radius !== 'number' || options.radius < 0)) {
|
|
289
|
-
throw new Error('The "radius" option can only be "circular" or a non-negative number.');
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
ctx.drawImage(image, options.coordinates[0].from.x, options.coordinates[0].from.y, width, height, 0, 0, width, height);
|
|
264
|
+
/**
|
|
265
|
+
* Crops the inner portion of the image based on the bounding box of the provided coordinates.
|
|
266
|
+
* Optionally applies a clipping mask with a specified radius.
|
|
267
|
+
*/
|
|
268
|
+
export async function cropInner(options: cropOptions): Promise<Buffer> {
|
|
269
|
+
try {
|
|
270
|
+
// Load the image (from HTTP or local path)
|
|
271
|
+
let image;
|
|
272
|
+
if (options.imageSource.startsWith("http")) {
|
|
273
|
+
image = await loadImage(options.imageSource);
|
|
274
|
+
} else {
|
|
275
|
+
image = await loadImage(path.join(process.cwd(), options.imageSource));
|
|
276
|
+
}
|
|
294
277
|
|
|
278
|
+
// Compute the bounding box from all coordinate points.
|
|
279
|
+
const xs: number[] = [];
|
|
280
|
+
const ys: number[] = [];
|
|
281
|
+
for (const coord of options.coordinates) {
|
|
282
|
+
xs.push(coord.from.x, coord.to.x);
|
|
283
|
+
ys.push(coord.from.y, coord.to.y);
|
|
284
|
+
}
|
|
285
|
+
const minX = Math.min(...xs);
|
|
286
|
+
const maxX = Math.max(...xs);
|
|
287
|
+
const minY = Math.min(...ys);
|
|
288
|
+
const maxY = Math.max(...ys);
|
|
289
|
+
const cropWidth = maxX - minX;
|
|
290
|
+
const cropHeight = maxY - minY;
|
|
291
|
+
|
|
292
|
+
// Create a canvas with the crop dimensions.
|
|
293
|
+
const canvas = createCanvas(cropWidth, cropHeight);
|
|
294
|
+
const ctx = canvas.getContext('2d') as SKRSContext2D;
|
|
295
|
+
if (!ctx) throw new Error("Unable to get 2D context");
|
|
296
|
+
|
|
297
|
+
// Optionally, apply a clipping mask if a radius is provided.
|
|
298
|
+
if (options.radius !== undefined && options.radius !== null) {
|
|
299
|
+
if (options.radius === "circular") {
|
|
300
|
+
const radius = Math.min(cropWidth, cropHeight) / 2;
|
|
295
301
|
ctx.beginPath();
|
|
296
|
-
|
|
297
|
-
const coordinate = options.coordinates[i];
|
|
298
|
-
const nextCoordinate = options.coordinates[(i + 1) % options.coordinates.length];
|
|
299
|
-
const tension = coordinate.tension || 0;
|
|
300
|
-
const cp1x = coordinate.from.x + (nextCoordinate.from.x - coordinate.from.x) * tension;
|
|
301
|
-
const cp1y = coordinate.from.y + (nextCoordinate.from.y - coordinate.from.y) * tension;
|
|
302
|
-
const cp2x = coordinate.to.x - (nextCoordinate.to.x - coordinate.to.x) * tension;
|
|
303
|
-
const cp2y = coordinate.to.y - (nextCoordinate.to.y - coordinate.to.y) * tension;
|
|
304
|
-
ctx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, coordinate.to.x, coordinate.to.y);
|
|
305
|
-
}
|
|
302
|
+
ctx.arc(cropWidth / 2, cropHeight / 2, radius, 0, Math.PI * 2);
|
|
306
303
|
ctx.closePath();
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
let image;
|
|
322
|
-
|
|
323
|
-
if (options.imageSource.startsWith('http')) {
|
|
324
|
-
image = await loadImage(options.imageSource);
|
|
304
|
+
ctx.clip();
|
|
305
|
+
} else if (typeof options.radius === 'number' && options.radius >= 0) {
|
|
306
|
+
ctx.beginPath();
|
|
307
|
+
ctx.moveTo(options.radius, 0);
|
|
308
|
+
ctx.lineTo(cropWidth - options.radius, 0);
|
|
309
|
+
ctx.quadraticCurveTo(cropWidth, 0, cropWidth, options.radius);
|
|
310
|
+
ctx.lineTo(cropWidth, cropHeight - options.radius);
|
|
311
|
+
ctx.quadraticCurveTo(cropWidth, cropHeight, cropWidth - options.radius, cropHeight);
|
|
312
|
+
ctx.lineTo(options.radius, cropHeight);
|
|
313
|
+
ctx.quadraticCurveTo(0, cropHeight, 0, cropHeight - options.radius);
|
|
314
|
+
ctx.lineTo(0, options.radius);
|
|
315
|
+
ctx.quadraticCurveTo(0, 0, options.radius, 0);
|
|
316
|
+
ctx.closePath();
|
|
317
|
+
ctx.clip();
|
|
325
318
|
} else {
|
|
326
|
-
|
|
319
|
+
throw new Error('The "radius" option can only be "circular" or a non-negative number.');
|
|
327
320
|
}
|
|
321
|
+
}
|
|
328
322
|
|
|
329
|
-
|
|
330
|
-
|
|
323
|
+
// Draw the region from the original image corresponding to the bounding box.
|
|
324
|
+
// drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight)
|
|
325
|
+
ctx.drawImage(image, minX, minY, cropWidth, cropHeight, 0, 0, cropWidth, cropHeight);
|
|
331
326
|
|
|
332
|
-
|
|
327
|
+
return canvas.toBuffer('image/png');
|
|
328
|
+
} catch (error) {
|
|
329
|
+
console.error('An error occurred in cropInner:', error);
|
|
330
|
+
throw error;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
333
|
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
ctx.closePath();
|
|
334
|
+
/**
|
|
335
|
+
* Crops the outer portion of the image by removing the area defined by the provided polygon.
|
|
336
|
+
* The polygon is defined by the coordinates (with optional bezier smoothing using tension).
|
|
337
|
+
*/
|
|
338
|
+
export async function cropOuter(options: cropOptions): Promise<Buffer> {
|
|
339
|
+
try {
|
|
340
|
+
let image;
|
|
341
|
+
if (options.imageSource.startsWith("http")) {
|
|
342
|
+
image = await loadImage(options.imageSource);
|
|
343
|
+
} else {
|
|
344
|
+
image = await loadImage(path.join(process.cwd(), options.imageSource));
|
|
345
|
+
}
|
|
347
346
|
|
|
348
|
-
|
|
347
|
+
// Create a canvas matching the full image dimensions.
|
|
348
|
+
const canvas = createCanvas(image.width, image.height);
|
|
349
|
+
const ctx = canvas.getContext('2d') as SKRSContext2D;
|
|
350
|
+
if (!ctx) throw new Error("Unable to get 2D context");
|
|
349
351
|
|
|
350
|
-
|
|
352
|
+
// Draw the full image.
|
|
353
|
+
ctx.drawImage(image, 0, 0);
|
|
351
354
|
|
|
352
|
-
|
|
355
|
+
// Build the polygon path from the provided coordinates.
|
|
356
|
+
ctx.beginPath();
|
|
357
|
+
// Start at the first coordinate's "from" point.
|
|
358
|
+
ctx.moveTo(options.coordinates[0].from.x, options.coordinates[0].from.y);
|
|
359
|
+
for (let i = 0; i < options.coordinates.length; i++) {
|
|
360
|
+
const coord = options.coordinates[i];
|
|
361
|
+
const nextCoord = options.coordinates[(i + 1) % options.coordinates.length];
|
|
362
|
+
const tension = coord.tension || 0;
|
|
363
|
+
const cp1x = coord.from.x + (nextCoord.from.x - coord.from.x) * tension;
|
|
364
|
+
const cp1y = coord.from.y + (nextCoord.from.y - coord.from.y) * tension;
|
|
365
|
+
const cp2x = coord.to.x - (nextCoord.to.x - coord.to.x) * tension;
|
|
366
|
+
const cp2y = coord.to.y - (nextCoord.to.y - coord.to.y) * tension;
|
|
367
|
+
ctx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, coord.to.x, coord.to.y);
|
|
368
|
+
}
|
|
369
|
+
ctx.closePath();
|
|
353
370
|
|
|
354
|
-
|
|
371
|
+
// Set the clipping region to the polygon.
|
|
372
|
+
ctx.clip();
|
|
355
373
|
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
374
|
+
// Clear the inner region defined by the clipping path.
|
|
375
|
+
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
376
|
+
|
|
377
|
+
return canvas.toBuffer('image/png');
|
|
378
|
+
} catch (error) {
|
|
379
|
+
console.error('An error occurred in cropOuter:', error);
|
|
380
|
+
throw error;
|
|
381
|
+
}
|
|
360
382
|
}
|
|
361
383
|
|
|
362
384
|
|