apexify.js 5.1.1 → 5.2.1
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/CHANGELOG.md +240 -0
- package/README.md +244 -1101
- package/dist/cjs/Canvas/ApexPainter.d.ts +183 -204
- package/dist/cjs/Canvas/ApexPainter.d.ts.map +1 -1
- package/dist/cjs/Canvas/ApexPainter.js +524 -1282
- package/dist/cjs/Canvas/ApexPainter.js.map +1 -1
- package/dist/cjs/Canvas/extended/CanvasCreator.d.ts +33 -0
- package/dist/cjs/Canvas/extended/CanvasCreator.d.ts.map +1 -0
- package/dist/cjs/Canvas/extended/CanvasCreator.js +223 -0
- package/dist/cjs/Canvas/extended/CanvasCreator.js.map +1 -0
- package/dist/cjs/Canvas/extended/ChartCreator.d.ts +26 -0
- package/dist/cjs/Canvas/extended/ChartCreator.d.ts.map +1 -0
- package/dist/cjs/Canvas/extended/ChartCreator.js +50 -0
- package/dist/cjs/Canvas/extended/ChartCreator.js.map +1 -0
- package/dist/cjs/Canvas/extended/GIFCreator.d.ts +43 -0
- package/dist/cjs/Canvas/extended/GIFCreator.d.ts.map +1 -0
- package/dist/cjs/Canvas/extended/GIFCreator.js +157 -0
- package/dist/cjs/Canvas/extended/GIFCreator.js.map +1 -0
- package/dist/cjs/Canvas/extended/ImageCreator.d.ts +83 -0
- package/dist/cjs/Canvas/extended/ImageCreator.d.ts.map +1 -0
- package/dist/cjs/Canvas/extended/ImageCreator.js +479 -0
- package/dist/cjs/Canvas/extended/ImageCreator.js.map +1 -0
- package/dist/cjs/Canvas/extended/TextCreator.d.ts +35 -0
- package/dist/cjs/Canvas/extended/TextCreator.d.ts.map +1 -0
- package/dist/cjs/Canvas/extended/TextCreator.js +98 -0
- package/dist/cjs/Canvas/extended/TextCreator.js.map +1 -0
- package/dist/cjs/Canvas/extended/VideoCreator.d.ts +370 -0
- package/dist/cjs/Canvas/extended/VideoCreator.d.ts.map +1 -0
- package/dist/cjs/Canvas/extended/VideoCreator.js +478 -0
- package/dist/cjs/Canvas/extended/VideoCreator.js.map +1 -0
- package/dist/cjs/Canvas/utils/Background/bg.d.ts +1 -1
- package/dist/cjs/Canvas/utils/Background/bg.d.ts.map +1 -1
- package/dist/cjs/Canvas/utils/Background/bg.js +43 -7
- package/dist/cjs/Canvas/utils/Background/bg.js.map +1 -1
- package/dist/cjs/Canvas/utils/Charts/barchart.d.ts +230 -0
- package/dist/cjs/Canvas/utils/Charts/barchart.d.ts.map +1 -0
- package/dist/cjs/Canvas/utils/Charts/barchart.js +1891 -0
- package/dist/cjs/Canvas/utils/Charts/barchart.js.map +1 -0
- package/dist/cjs/Canvas/utils/Charts/comparisonchart.d.ts +103 -0
- package/dist/cjs/Canvas/utils/Charts/comparisonchart.d.ts.map +1 -0
- package/dist/cjs/Canvas/utils/Charts/comparisonchart.js +368 -0
- package/dist/cjs/Canvas/utils/Charts/comparisonchart.js.map +1 -0
- package/dist/cjs/Canvas/utils/Charts/horizontalbarchart.d.ts +181 -0
- package/dist/cjs/Canvas/utils/Charts/horizontalbarchart.d.ts.map +1 -0
- package/dist/cjs/Canvas/utils/Charts/horizontalbarchart.js +1389 -0
- package/dist/cjs/Canvas/utils/Charts/horizontalbarchart.js.map +1 -0
- package/dist/cjs/Canvas/utils/Charts/index.d.ts +45 -0
- package/dist/cjs/Canvas/utils/Charts/index.d.ts.map +1 -0
- package/dist/cjs/Canvas/utils/Charts/index.js +17 -0
- package/dist/cjs/Canvas/utils/Charts/index.js.map +1 -0
- package/dist/cjs/Canvas/utils/Charts/linechart.d.ts +216 -0
- package/dist/cjs/Canvas/utils/Charts/linechart.d.ts.map +1 -0
- package/dist/cjs/Canvas/utils/Charts/linechart.js +1761 -0
- package/dist/cjs/Canvas/utils/Charts/linechart.js.map +1 -0
- package/dist/cjs/Canvas/utils/Charts/piechart.d.ts +167 -0
- package/dist/cjs/Canvas/utils/Charts/piechart.d.ts.map +1 -0
- package/dist/cjs/Canvas/utils/Charts/piechart.js +794 -0
- package/dist/cjs/Canvas/utils/Charts/piechart.js.map +1 -0
- package/dist/cjs/Canvas/utils/General/batchOperations.d.ts.map +1 -1
- package/dist/cjs/Canvas/utils/General/batchOperations.js +3 -4
- package/dist/cjs/Canvas/utils/General/batchOperations.js.map +1 -1
- package/dist/cjs/Canvas/utils/General/general functions.d.ts.map +1 -1
- package/dist/cjs/Canvas/utils/General/general functions.js +62 -33
- package/dist/cjs/Canvas/utils/General/general functions.js.map +1 -1
- package/dist/cjs/Canvas/utils/General/imageStitching.d.ts.map +1 -1
- package/dist/cjs/Canvas/utils/General/imageStitching.js +3 -6
- package/dist/cjs/Canvas/utils/General/imageStitching.js.map +1 -1
- package/dist/cjs/Canvas/utils/Image/imageMasking.d.ts.map +1 -1
- package/dist/cjs/Canvas/utils/Image/imageMasking.js +5 -12
- package/dist/cjs/Canvas/utils/Image/imageMasking.js.map +1 -1
- package/dist/cjs/Canvas/utils/Image/imageProperties.d.ts +4 -4
- package/dist/cjs/Canvas/utils/Image/imageProperties.d.ts.map +1 -1
- package/dist/cjs/Canvas/utils/Image/imageProperties.js +44 -9
- package/dist/cjs/Canvas/utils/Image/imageProperties.js.map +1 -1
- package/dist/cjs/Canvas/utils/Texts/enhancedTextRenderer.d.ts +5 -0
- package/dist/cjs/Canvas/utils/Texts/enhancedTextRenderer.d.ts.map +1 -1
- package/dist/cjs/Canvas/utils/Texts/enhancedTextRenderer.js +48 -5
- package/dist/cjs/Canvas/utils/Texts/enhancedTextRenderer.js.map +1 -1
- package/dist/cjs/Canvas/utils/Texts/textProperties.d.ts +1 -1
- package/dist/cjs/Canvas/utils/Texts/textProperties.d.ts.map +1 -1
- package/dist/cjs/Canvas/utils/Texts/textProperties.js +48 -5
- package/dist/cjs/Canvas/utils/Texts/textProperties.js.map +1 -1
- package/dist/cjs/Canvas/utils/Video/videoHelpers.d.ts +489 -0
- package/dist/cjs/Canvas/utils/Video/videoHelpers.d.ts.map +1 -0
- package/dist/cjs/Canvas/utils/Video/videoHelpers.js +1835 -0
- package/dist/cjs/Canvas/utils/Video/videoHelpers.js.map +1 -0
- package/dist/cjs/Canvas/utils/errorUtils.d.ts +15 -0
- package/dist/cjs/Canvas/utils/errorUtils.d.ts.map +1 -0
- package/dist/cjs/Canvas/utils/errorUtils.js +26 -0
- package/dist/cjs/Canvas/utils/errorUtils.js.map +1 -0
- package/dist/cjs/Canvas/utils/types.d.ts +17 -178
- 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 +4 -3
- package/dist/cjs/Canvas/utils/utils.d.ts.map +1 -1
- package/dist/cjs/Canvas/utils/utils.js +40 -6
- package/dist/cjs/Canvas/utils/utils.js.map +1 -1
- package/dist/cjs/index.d.ts +1 -8
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +14 -45
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/esm/Canvas/ApexPainter.d.ts +183 -204
- package/dist/esm/Canvas/ApexPainter.d.ts.map +1 -1
- package/dist/esm/Canvas/ApexPainter.js +524 -1282
- package/dist/esm/Canvas/ApexPainter.js.map +1 -1
- package/dist/esm/Canvas/extended/CanvasCreator.d.ts +33 -0
- package/dist/esm/Canvas/extended/CanvasCreator.d.ts.map +1 -0
- package/dist/esm/Canvas/extended/CanvasCreator.js +223 -0
- package/dist/esm/Canvas/extended/CanvasCreator.js.map +1 -0
- package/dist/esm/Canvas/extended/ChartCreator.d.ts +26 -0
- package/dist/esm/Canvas/extended/ChartCreator.d.ts.map +1 -0
- package/dist/esm/Canvas/extended/ChartCreator.js +50 -0
- package/dist/esm/Canvas/extended/ChartCreator.js.map +1 -0
- package/dist/esm/Canvas/extended/GIFCreator.d.ts +43 -0
- package/dist/esm/Canvas/extended/GIFCreator.d.ts.map +1 -0
- package/dist/esm/Canvas/extended/GIFCreator.js +157 -0
- package/dist/esm/Canvas/extended/GIFCreator.js.map +1 -0
- package/dist/esm/Canvas/extended/ImageCreator.d.ts +83 -0
- package/dist/esm/Canvas/extended/ImageCreator.d.ts.map +1 -0
- package/dist/esm/Canvas/extended/ImageCreator.js +479 -0
- package/dist/esm/Canvas/extended/ImageCreator.js.map +1 -0
- package/dist/esm/Canvas/extended/TextCreator.d.ts +35 -0
- package/dist/esm/Canvas/extended/TextCreator.d.ts.map +1 -0
- package/dist/esm/Canvas/extended/TextCreator.js +98 -0
- package/dist/esm/Canvas/extended/TextCreator.js.map +1 -0
- package/dist/esm/Canvas/extended/VideoCreator.d.ts +370 -0
- package/dist/esm/Canvas/extended/VideoCreator.d.ts.map +1 -0
- package/dist/esm/Canvas/extended/VideoCreator.js +478 -0
- package/dist/esm/Canvas/extended/VideoCreator.js.map +1 -0
- package/dist/esm/Canvas/utils/Background/bg.d.ts +1 -1
- package/dist/esm/Canvas/utils/Background/bg.d.ts.map +1 -1
- package/dist/esm/Canvas/utils/Background/bg.js +43 -7
- package/dist/esm/Canvas/utils/Background/bg.js.map +1 -1
- package/dist/esm/Canvas/utils/Charts/barchart.d.ts +230 -0
- package/dist/esm/Canvas/utils/Charts/barchart.d.ts.map +1 -0
- package/dist/esm/Canvas/utils/Charts/barchart.js +1891 -0
- package/dist/esm/Canvas/utils/Charts/barchart.js.map +1 -0
- package/dist/esm/Canvas/utils/Charts/comparisonchart.d.ts +103 -0
- package/dist/esm/Canvas/utils/Charts/comparisonchart.d.ts.map +1 -0
- package/dist/esm/Canvas/utils/Charts/comparisonchart.js +368 -0
- package/dist/esm/Canvas/utils/Charts/comparisonchart.js.map +1 -0
- package/dist/esm/Canvas/utils/Charts/horizontalbarchart.d.ts +181 -0
- package/dist/esm/Canvas/utils/Charts/horizontalbarchart.d.ts.map +1 -0
- package/dist/esm/Canvas/utils/Charts/horizontalbarchart.js +1389 -0
- package/dist/esm/Canvas/utils/Charts/horizontalbarchart.js.map +1 -0
- package/dist/esm/Canvas/utils/Charts/index.d.ts +45 -0
- package/dist/esm/Canvas/utils/Charts/index.d.ts.map +1 -0
- package/dist/esm/Canvas/utils/Charts/index.js +17 -0
- package/dist/esm/Canvas/utils/Charts/index.js.map +1 -0
- package/dist/esm/Canvas/utils/Charts/linechart.d.ts +216 -0
- package/dist/esm/Canvas/utils/Charts/linechart.d.ts.map +1 -0
- package/dist/esm/Canvas/utils/Charts/linechart.js +1761 -0
- package/dist/esm/Canvas/utils/Charts/linechart.js.map +1 -0
- package/dist/esm/Canvas/utils/Charts/piechart.d.ts +167 -0
- package/dist/esm/Canvas/utils/Charts/piechart.d.ts.map +1 -0
- package/dist/esm/Canvas/utils/Charts/piechart.js +794 -0
- package/dist/esm/Canvas/utils/Charts/piechart.js.map +1 -0
- package/dist/esm/Canvas/utils/General/batchOperations.d.ts.map +1 -1
- package/dist/esm/Canvas/utils/General/batchOperations.js +3 -4
- package/dist/esm/Canvas/utils/General/batchOperations.js.map +1 -1
- package/dist/esm/Canvas/utils/General/general functions.d.ts.map +1 -1
- package/dist/esm/Canvas/utils/General/general functions.js +62 -33
- package/dist/esm/Canvas/utils/General/general functions.js.map +1 -1
- package/dist/esm/Canvas/utils/General/imageStitching.d.ts.map +1 -1
- package/dist/esm/Canvas/utils/General/imageStitching.js +3 -6
- package/dist/esm/Canvas/utils/General/imageStitching.js.map +1 -1
- package/dist/esm/Canvas/utils/Image/imageMasking.d.ts.map +1 -1
- package/dist/esm/Canvas/utils/Image/imageMasking.js +5 -12
- package/dist/esm/Canvas/utils/Image/imageMasking.js.map +1 -1
- package/dist/esm/Canvas/utils/Image/imageProperties.d.ts +4 -4
- package/dist/esm/Canvas/utils/Image/imageProperties.d.ts.map +1 -1
- package/dist/esm/Canvas/utils/Image/imageProperties.js +44 -9
- package/dist/esm/Canvas/utils/Image/imageProperties.js.map +1 -1
- package/dist/esm/Canvas/utils/Texts/enhancedTextRenderer.d.ts +5 -0
- package/dist/esm/Canvas/utils/Texts/enhancedTextRenderer.d.ts.map +1 -1
- package/dist/esm/Canvas/utils/Texts/enhancedTextRenderer.js +48 -5
- package/dist/esm/Canvas/utils/Texts/enhancedTextRenderer.js.map +1 -1
- package/dist/esm/Canvas/utils/Texts/textProperties.d.ts +1 -1
- package/dist/esm/Canvas/utils/Texts/textProperties.d.ts.map +1 -1
- package/dist/esm/Canvas/utils/Texts/textProperties.js +48 -5
- package/dist/esm/Canvas/utils/Texts/textProperties.js.map +1 -1
- package/dist/esm/Canvas/utils/Video/videoHelpers.d.ts +489 -0
- package/dist/esm/Canvas/utils/Video/videoHelpers.d.ts.map +1 -0
- package/dist/esm/Canvas/utils/Video/videoHelpers.js +1835 -0
- package/dist/esm/Canvas/utils/Video/videoHelpers.js.map +1 -0
- package/dist/esm/Canvas/utils/errorUtils.d.ts +15 -0
- package/dist/esm/Canvas/utils/errorUtils.d.ts.map +1 -0
- package/dist/esm/Canvas/utils/errorUtils.js +26 -0
- package/dist/esm/Canvas/utils/errorUtils.js.map +1 -0
- package/dist/esm/Canvas/utils/types.d.ts +17 -178
- 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 +4 -3
- package/dist/esm/Canvas/utils/utils.d.ts.map +1 -1
- package/dist/esm/Canvas/utils/utils.js +40 -6
- package/dist/esm/Canvas/utils/utils.js.map +1 -1
- package/dist/esm/index.d.ts +1 -8
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +14 -45
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/package.json +235 -198
- package/dist/cjs/Canvas/utils/Charts/charts.d.ts +0 -13
- package/dist/cjs/Canvas/utils/Charts/charts.d.ts.map +0 -1
- package/dist/cjs/Canvas/utils/Charts/charts.js +0 -466
- package/dist/cjs/Canvas/utils/Charts/charts.js.map +0 -1
- package/dist/esm/Canvas/utils/Charts/charts.d.ts +0 -13
- package/dist/esm/Canvas/utils/Charts/charts.d.ts.map +0 -1
- package/dist/esm/Canvas/utils/Charts/charts.js +0 -466
- package/dist/esm/Canvas/utils/Charts/charts.js.map +0 -1
- package/lib/Canvas/ApexPainter.ts +0 -5414
- package/lib/Canvas/utils/Background/bg.ts +0 -285
- package/lib/Canvas/utils/Charts/charts.ts +0 -548
- package/lib/Canvas/utils/Custom/advancedLines.ts +0 -387
- package/lib/Canvas/utils/Custom/customLines.ts +0 -206
- package/lib/Canvas/utils/General/batchOperations.ts +0 -103
- package/lib/Canvas/utils/General/conversion.ts +0 -34
- package/lib/Canvas/utils/General/general functions.ts +0 -726
- package/lib/Canvas/utils/General/imageCompression.ts +0 -316
- package/lib/Canvas/utils/General/imageStitching.ts +0 -252
- package/lib/Canvas/utils/Image/imageEffects.ts +0 -175
- package/lib/Canvas/utils/Image/imageFilters.ts +0 -356
- package/lib/Canvas/utils/Image/imageMasking.ts +0 -335
- package/lib/Canvas/utils/Image/imageProperties.ts +0 -587
- package/lib/Canvas/utils/Image/professionalImageFilters.ts +0 -391
- package/lib/Canvas/utils/Image/simpleProfessionalFilters.ts +0 -229
- package/lib/Canvas/utils/Patterns/enhancedPatternRenderer.ts +0 -455
- package/lib/Canvas/utils/Shapes/shapes.ts +0 -528
- package/lib/Canvas/utils/Texts/enhancedTextRenderer.ts +0 -716
- package/lib/Canvas/utils/Texts/textPathRenderer.ts +0 -320
- package/lib/Canvas/utils/Texts/textProperties.ts +0 -231
- package/lib/Canvas/utils/types.ts +0 -983
- package/lib/Canvas/utils/utils.ts +0 -135
- package/lib/index.ts +0 -81
- package/lib/utils.ts +0 -5
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
import { SKRSContext2D, Image } from '@napi-rs/canvas';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Applies vignette effect to the canvas
|
|
5
|
-
* @param ctx - Canvas 2D context
|
|
6
|
-
* @param intensity - Vignette intensity (0-1)
|
|
7
|
-
* @param size - Vignette size (0-1, where 1 = full canvas)
|
|
8
|
-
* @param width - Canvas width
|
|
9
|
-
* @param height - Canvas height
|
|
10
|
-
*/
|
|
11
|
-
export function applyVignette(
|
|
12
|
-
ctx: SKRSContext2D,
|
|
13
|
-
intensity: number,
|
|
14
|
-
size: number,
|
|
15
|
-
width: number,
|
|
16
|
-
height: number
|
|
17
|
-
): void {
|
|
18
|
-
const imageData = ctx.getImageData(0, 0, width, height);
|
|
19
|
-
const pixels = imageData.data;
|
|
20
|
-
const centerX = width / 2;
|
|
21
|
-
const centerY = height / 2;
|
|
22
|
-
const maxDistance = Math.sqrt(centerX * centerX + centerY * centerY);
|
|
23
|
-
const vignetteRadius = maxDistance * size;
|
|
24
|
-
|
|
25
|
-
for (let i = 0; i < pixels.length; i += 4) {
|
|
26
|
-
const x = (i / 4) % width;
|
|
27
|
-
const y = Math.floor((i / 4) / width);
|
|
28
|
-
const dx = x - centerX;
|
|
29
|
-
const dy = y - centerY;
|
|
30
|
-
const distance = Math.sqrt(dx * dx + dy * dy);
|
|
31
|
-
|
|
32
|
-
if (distance > vignetteRadius) {
|
|
33
|
-
const vignetteAmount = Math.min(1, (distance - vignetteRadius) / (maxDistance - vignetteRadius));
|
|
34
|
-
const darken = 1 - (vignetteAmount * intensity);
|
|
35
|
-
|
|
36
|
-
pixels[i] = Math.round(pixels[i] * darken); // R
|
|
37
|
-
pixels[i + 1] = Math.round(pixels[i + 1] * darken); // G
|
|
38
|
-
pixels[i + 2] = Math.round(pixels[i + 2] * darken); // B
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
ctx.putImageData(imageData, 0, 0);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Applies lens flare effect to the canvas
|
|
47
|
-
* @param ctx - Canvas 2D context
|
|
48
|
-
* @param flareX - Flare center X position
|
|
49
|
-
* @param flareY - Flare center Y position
|
|
50
|
-
* @param intensity - Flare intensity (0-1)
|
|
51
|
-
* @param width - Canvas width
|
|
52
|
-
* @param height - Canvas height
|
|
53
|
-
*/
|
|
54
|
-
export function applyLensFlare(
|
|
55
|
-
ctx: SKRSContext2D,
|
|
56
|
-
flareX: number,
|
|
57
|
-
flareY: number,
|
|
58
|
-
intensity: number,
|
|
59
|
-
width: number,
|
|
60
|
-
height: number
|
|
61
|
-
): void {
|
|
62
|
-
ctx.save();
|
|
63
|
-
|
|
64
|
-
// Create gradient for lens flare
|
|
65
|
-
const gradient = ctx.createRadialGradient(
|
|
66
|
-
flareX, flareY, 0,
|
|
67
|
-
flareX, flareY, Math.max(width, height) * 0.5
|
|
68
|
-
);
|
|
69
|
-
|
|
70
|
-
const flareColor = `rgba(255, 255, 255, ${intensity * 0.6})`;
|
|
71
|
-
gradient.addColorStop(0, flareColor);
|
|
72
|
-
gradient.addColorStop(0.3, `rgba(255, 255, 255, ${intensity * 0.3})`);
|
|
73
|
-
gradient.addColorStop(0.6, `rgba(255, 255, 200, ${intensity * 0.1})`);
|
|
74
|
-
gradient.addColorStop(1, 'rgba(255, 255, 255, 0)');
|
|
75
|
-
|
|
76
|
-
ctx.globalCompositeOperation = 'screen';
|
|
77
|
-
ctx.fillStyle = gradient;
|
|
78
|
-
ctx.fillRect(0, 0, width, height);
|
|
79
|
-
|
|
80
|
-
// Add additional flare elements
|
|
81
|
-
const flareElements = [
|
|
82
|
-
{ x: flareX * 0.7, y: flareY * 0.7, size: 30, opacity: intensity * 0.4 },
|
|
83
|
-
{ x: flareX * 1.3, y: flareY * 1.1, size: 20, opacity: intensity * 0.3 },
|
|
84
|
-
{ x: flareX * 0.9, y: flareY * 1.2, size: 15, opacity: intensity * 0.2 }
|
|
85
|
-
];
|
|
86
|
-
|
|
87
|
-
for (const element of flareElements) {
|
|
88
|
-
if (element.x >= 0 && element.x < width && element.y >= 0 && element.y < height) {
|
|
89
|
-
const elementGradient = ctx.createRadialGradient(
|
|
90
|
-
element.x, element.y, 0,
|
|
91
|
-
element.x, element.y, element.size
|
|
92
|
-
);
|
|
93
|
-
elementGradient.addColorStop(0, `rgba(255, 255, 255, ${element.opacity})`);
|
|
94
|
-
elementGradient.addColorStop(1, 'rgba(255, 255, 255, 0)');
|
|
95
|
-
ctx.fillStyle = elementGradient;
|
|
96
|
-
ctx.fillRect(element.x - element.size, element.y - element.size, element.size * 2, element.size * 2);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
ctx.restore();
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Applies chromatic aberration effect
|
|
105
|
-
* @param ctx - Canvas 2D context
|
|
106
|
-
* @param intensity - Aberration intensity (0-1)
|
|
107
|
-
* @param width - Canvas width
|
|
108
|
-
* @param height - Canvas height
|
|
109
|
-
*/
|
|
110
|
-
export function applyChromaticAberration(
|
|
111
|
-
ctx: SKRSContext2D,
|
|
112
|
-
intensity: number,
|
|
113
|
-
width: number,
|
|
114
|
-
height: number
|
|
115
|
-
): void {
|
|
116
|
-
const imageData = ctx.getImageData(0, 0, width, height);
|
|
117
|
-
const pixels = imageData.data;
|
|
118
|
-
const newPixels = new Uint8ClampedArray(pixels.length);
|
|
119
|
-
const offset = Math.round(intensity * 5); // Max 5 pixel offset
|
|
120
|
-
|
|
121
|
-
for (let y = 0; y < height; y++) {
|
|
122
|
-
for (let x = 0; x < width; x++) {
|
|
123
|
-
const idx = (y * width + x) * 4;
|
|
124
|
-
|
|
125
|
-
// Red channel - shift left
|
|
126
|
-
const redX = Math.max(0, Math.min(width - 1, x - offset));
|
|
127
|
-
const redIdx = (y * width + redX) * 4;
|
|
128
|
-
newPixels[idx] = pixels[redIdx];
|
|
129
|
-
|
|
130
|
-
// Green channel - no shift
|
|
131
|
-
newPixels[idx + 1] = pixels[idx + 1];
|
|
132
|
-
|
|
133
|
-
// Blue channel - shift right
|
|
134
|
-
const blueX = Math.max(0, Math.min(width - 1, x + offset));
|
|
135
|
-
const blueIdx = (y * width + blueX) * 4;
|
|
136
|
-
newPixels[idx + 2] = pixels[blueIdx];
|
|
137
|
-
|
|
138
|
-
// Alpha channel - no change
|
|
139
|
-
newPixels[idx + 3] = pixels[idx + 3];
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
ctx.putImageData(new ImageData(newPixels, width, height), 0, 0);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Applies film grain effect
|
|
148
|
-
* @param ctx - Canvas 2D context
|
|
149
|
-
* @param intensity - Grain intensity (0-1)
|
|
150
|
-
* @param width - Canvas width
|
|
151
|
-
* @param height - Canvas height
|
|
152
|
-
*/
|
|
153
|
-
export function applyFilmGrain(
|
|
154
|
-
ctx: SKRSContext2D,
|
|
155
|
-
intensity: number,
|
|
156
|
-
width: number,
|
|
157
|
-
height: number
|
|
158
|
-
): void {
|
|
159
|
-
const imageData = ctx.getImageData(0, 0, width, height);
|
|
160
|
-
const pixels = imageData.data;
|
|
161
|
-
const grainAmount = intensity * 30; // Max 30 pixel variation
|
|
162
|
-
|
|
163
|
-
for (let i = 0; i < pixels.length; i += 4) {
|
|
164
|
-
// Generate random grain
|
|
165
|
-
const grain = (Math.random() - 0.5) * grainAmount;
|
|
166
|
-
|
|
167
|
-
pixels[i] = Math.max(0, Math.min(255, pixels[i] + grain)); // R
|
|
168
|
-
pixels[i + 1] = Math.max(0, Math.min(255, pixels[i + 1] + grain)); // G
|
|
169
|
-
pixels[i + 2] = Math.max(0, Math.min(255, pixels[i + 2] + grain)); // B
|
|
170
|
-
// Alpha unchanged
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
ctx.putImageData(imageData, 0, 0);
|
|
174
|
-
}
|
|
175
|
-
|
|
@@ -1,356 +0,0 @@
|
|
|
1
|
-
import { SKRSContext2D } from '@napi-rs/canvas';
|
|
2
|
-
import { ImageFilter } from '../types';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Applies image filters to a canvas context
|
|
6
|
-
* @param ctx Canvas 2D context
|
|
7
|
-
* @param filters Array of filters to apply
|
|
8
|
-
* @param width Canvas width
|
|
9
|
-
* @param height Canvas height
|
|
10
|
-
*/
|
|
11
|
-
export function applyImageFilters(
|
|
12
|
-
ctx: SKRSContext2D,
|
|
13
|
-
filters: ImageFilter[],
|
|
14
|
-
width: number,
|
|
15
|
-
height: number
|
|
16
|
-
): void {
|
|
17
|
-
if (!filters || filters.length === 0) return;
|
|
18
|
-
|
|
19
|
-
ctx.save();
|
|
20
|
-
|
|
21
|
-
for (const filter of filters) {
|
|
22
|
-
switch (filter.type) {
|
|
23
|
-
case 'gaussianBlur':
|
|
24
|
-
applyGaussianBlur(ctx, filter.intensity || 0);
|
|
25
|
-
break;
|
|
26
|
-
case 'motionBlur':
|
|
27
|
-
applyMotionBlur(ctx, filter.intensity || 0, filter.angle || 0);
|
|
28
|
-
break;
|
|
29
|
-
case 'radialBlur':
|
|
30
|
-
applyRadialBlur(ctx, filter.intensity || 0, filter.centerX || width/2, filter.centerY || height/2);
|
|
31
|
-
break;
|
|
32
|
-
case 'sharpen':
|
|
33
|
-
applySharpen(ctx, filter.intensity || 0);
|
|
34
|
-
break;
|
|
35
|
-
case 'noise':
|
|
36
|
-
applyNoise(ctx, filter.intensity || 0.1);
|
|
37
|
-
break;
|
|
38
|
-
case 'grain':
|
|
39
|
-
applyGrain(ctx, filter.intensity || 0.05);
|
|
40
|
-
break;
|
|
41
|
-
case 'edgeDetection':
|
|
42
|
-
applyEdgeDetection(ctx, filter.intensity || 1);
|
|
43
|
-
break;
|
|
44
|
-
case 'emboss':
|
|
45
|
-
applyEmboss(ctx, filter.intensity || 1);
|
|
46
|
-
break;
|
|
47
|
-
case 'invert':
|
|
48
|
-
applyInvert(ctx);
|
|
49
|
-
break;
|
|
50
|
-
case 'grayscale':
|
|
51
|
-
applyGrayscale(ctx);
|
|
52
|
-
break;
|
|
53
|
-
case 'sepia':
|
|
54
|
-
applySepia(ctx);
|
|
55
|
-
break;
|
|
56
|
-
case 'pixelate':
|
|
57
|
-
applyPixelate(ctx, filter.size || 10);
|
|
58
|
-
break;
|
|
59
|
-
case 'brightness':
|
|
60
|
-
applyBrightness(ctx, filter.value || 0);
|
|
61
|
-
break;
|
|
62
|
-
case 'contrast':
|
|
63
|
-
applyContrast(ctx, filter.value || 0);
|
|
64
|
-
break;
|
|
65
|
-
case 'saturation':
|
|
66
|
-
applySaturation(ctx, filter.value || 0);
|
|
67
|
-
break;
|
|
68
|
-
case 'hueShift':
|
|
69
|
-
applyHueShift(ctx, filter.value || 0);
|
|
70
|
-
break;
|
|
71
|
-
case 'posterize':
|
|
72
|
-
applyPosterize(ctx, filter.levels || 4);
|
|
73
|
-
break;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
ctx.restore();
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// Individual filter implementations
|
|
81
|
-
function applyGaussianBlur(ctx: SKRSContext2D, intensity: number): void {
|
|
82
|
-
if (intensity > 0) {
|
|
83
|
-
ctx.filter = `blur(${intensity}px)`;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
function applyMotionBlur(ctx: SKRSContext2D, intensity: number, angle: number): void {
|
|
88
|
-
if (intensity > 0) {
|
|
89
|
-
// Motion blur is approximated with directional blur
|
|
90
|
-
const radians = (angle * Math.PI) / 180;
|
|
91
|
-
const blurX = Math.cos(radians) * intensity;
|
|
92
|
-
const blurY = Math.sin(radians) * intensity;
|
|
93
|
-
ctx.filter = `blur(${Math.abs(blurX)}px ${Math.abs(blurY)}px)`;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
function applyRadialBlur(ctx: SKRSContext2D, intensity: number, centerX: number, centerY: number): void {
|
|
98
|
-
if (intensity > 0) {
|
|
99
|
-
// Radial blur is approximated with multiple directional blurs
|
|
100
|
-
ctx.filter = `blur(${intensity}px)`;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
function applySharpen(ctx: SKRSContext2D, intensity: number): void {
|
|
105
|
-
if (intensity > 0) {
|
|
106
|
-
const imageData = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);
|
|
107
|
-
const data = imageData.data;
|
|
108
|
-
const width = ctx.canvas.width;
|
|
109
|
-
const height = ctx.canvas.height;
|
|
110
|
-
|
|
111
|
-
// Create a copy for the sharpening kernel
|
|
112
|
-
const originalData = new Uint8ClampedArray(data);
|
|
113
|
-
|
|
114
|
-
// Apply sharpening kernel
|
|
115
|
-
for (let y = 1; y < height - 1; y++) {
|
|
116
|
-
for (let x = 1; x < width - 1; x++) {
|
|
117
|
-
const idx = (y * width + x) * 4;
|
|
118
|
-
|
|
119
|
-
// Sharpening kernel: [[0,-1,0],[-1,5,-1],[0,-1,0]]
|
|
120
|
-
let r = 0, g = 0, b = 0;
|
|
121
|
-
|
|
122
|
-
for (let ky = -1; ky <= 1; ky++) {
|
|
123
|
-
for (let kx = -1; kx <= 1; kx++) {
|
|
124
|
-
const kidx = ((y + ky) * width + (x + kx)) * 4;
|
|
125
|
-
const kernelValue = (ky === 0 && kx === 0) ? 5 : -1;
|
|
126
|
-
|
|
127
|
-
r += originalData[kidx] * kernelValue;
|
|
128
|
-
g += originalData[kidx + 1] * kernelValue;
|
|
129
|
-
b += originalData[kidx + 2] * kernelValue;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
// Apply intensity
|
|
134
|
-
data[idx] = Math.max(0, Math.min(255, originalData[idx] + (r - originalData[idx]) * intensity));
|
|
135
|
-
data[idx + 1] = Math.max(0, Math.min(255, originalData[idx + 1] + (g - originalData[idx + 1]) * intensity));
|
|
136
|
-
data[idx + 2] = Math.max(0, Math.min(255, originalData[idx + 2] + (b - originalData[idx + 2]) * intensity));
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
ctx.putImageData(imageData, 0, 0);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
function applyNoise(ctx: SKRSContext2D, intensity: number): void {
|
|
145
|
-
if (intensity > 0) {
|
|
146
|
-
const imageData = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);
|
|
147
|
-
const data = imageData.data;
|
|
148
|
-
|
|
149
|
-
for (let i = 0; i < data.length; i += 4) {
|
|
150
|
-
const noise = (Math.random() - 0.5) * intensity * 255;
|
|
151
|
-
data[i] = Math.max(0, Math.min(255, data[i] + noise)); // R
|
|
152
|
-
data[i + 1] = Math.max(0, Math.min(255, data[i + 1] + noise)); // G
|
|
153
|
-
data[i + 2] = Math.max(0, Math.min(255, data[i + 2] + noise)); // B
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
ctx.putImageData(imageData, 0, 0);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
function applyGrain(ctx: SKRSContext2D, intensity: number): void {
|
|
161
|
-
if (intensity > 0) {
|
|
162
|
-
const imageData = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);
|
|
163
|
-
const data = imageData.data;
|
|
164
|
-
|
|
165
|
-
for (let i = 0; i < data.length; i += 4) {
|
|
166
|
-
const grain = (Math.random() - 0.5) * intensity * 100;
|
|
167
|
-
data[i] = Math.max(0, Math.min(255, data[i] + grain)); // R
|
|
168
|
-
data[i + 1] = Math.max(0, Math.min(255, data[i + 1] + grain)); // G
|
|
169
|
-
data[i + 2] = Math.max(0, Math.min(255, data[i + 2] + grain)); // B
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
ctx.putImageData(imageData, 0, 0);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
function applyEdgeDetection(ctx: SKRSContext2D, intensity: number): void {
|
|
177
|
-
if (intensity > 0) {
|
|
178
|
-
const imageData = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);
|
|
179
|
-
const data = imageData.data;
|
|
180
|
-
const width = ctx.canvas.width;
|
|
181
|
-
const height = ctx.canvas.height;
|
|
182
|
-
|
|
183
|
-
// Create a copy for the edge detection kernel
|
|
184
|
-
const originalData = new Uint8ClampedArray(data);
|
|
185
|
-
|
|
186
|
-
// Apply Sobel edge detection kernel
|
|
187
|
-
for (let y = 1; y < height - 1; y++) {
|
|
188
|
-
for (let x = 1; x < width - 1; x++) {
|
|
189
|
-
const idx = (y * width + x) * 4;
|
|
190
|
-
|
|
191
|
-
// Sobel X kernel: [[-1,0,1],[-2,0,2],[-1,0,1]]
|
|
192
|
-
// Sobel Y kernel: [[-1,-2,-1],[0,0,0],[1,2,1]]
|
|
193
|
-
let gx = 0, gy = 0;
|
|
194
|
-
|
|
195
|
-
for (let ky = -1; ky <= 1; ky++) {
|
|
196
|
-
for (let kx = -1; kx <= 1; kx++) {
|
|
197
|
-
const kidx = ((y + ky) * width + (x + kx)) * 4;
|
|
198
|
-
const gray = (originalData[kidx] + originalData[kidx + 1] + originalData[kidx + 2]) / 3;
|
|
199
|
-
|
|
200
|
-
const sobelX = (kx === -1) ? -1 : (kx === 0) ? 0 : 1;
|
|
201
|
-
const sobelY = (ky === -1) ? -1 : (ky === 0) ? 0 : 1;
|
|
202
|
-
|
|
203
|
-
gx += gray * sobelX;
|
|
204
|
-
gy += gray * sobelY;
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
const magnitude = Math.sqrt(gx * gx + gy * gy) * intensity;
|
|
209
|
-
const edgeValue = Math.min(255, magnitude);
|
|
210
|
-
|
|
211
|
-
data[idx] = edgeValue; // R
|
|
212
|
-
data[idx + 1] = edgeValue; // G
|
|
213
|
-
data[idx + 2] = edgeValue; // B
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
ctx.putImageData(imageData, 0, 0);
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
function applyEmboss(ctx: SKRSContext2D, intensity: number): void {
|
|
222
|
-
if (intensity > 0) {
|
|
223
|
-
const imageData = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);
|
|
224
|
-
const data = imageData.data;
|
|
225
|
-
const width = ctx.canvas.width;
|
|
226
|
-
const height = ctx.canvas.height;
|
|
227
|
-
|
|
228
|
-
// Create a copy for the emboss kernel
|
|
229
|
-
const originalData = new Uint8ClampedArray(data);
|
|
230
|
-
|
|
231
|
-
// Apply emboss kernel
|
|
232
|
-
for (let y = 1; y < height - 1; y++) {
|
|
233
|
-
for (let x = 1; x < width - 1; x++) {
|
|
234
|
-
const idx = (y * width + x) * 4;
|
|
235
|
-
|
|
236
|
-
// Emboss kernel: [[-2,-1,0],[-1,1,1],[0,1,2]]
|
|
237
|
-
let r = 0, g = 0, b = 0;
|
|
238
|
-
|
|
239
|
-
for (let ky = -1; ky <= 1; ky++) {
|
|
240
|
-
for (let kx = -1; kx <= 1; kx++) {
|
|
241
|
-
const kidx = ((y + ky) * width + (x + kx)) * 4;
|
|
242
|
-
let kernelValue = 0;
|
|
243
|
-
|
|
244
|
-
if (ky === -1 && kx === -1) kernelValue = -2;
|
|
245
|
-
else if (ky === -1 && kx === 0) kernelValue = -1;
|
|
246
|
-
else if (ky === -1 && kx === 1) kernelValue = 0;
|
|
247
|
-
else if (ky === 0 && kx === -1) kernelValue = -1;
|
|
248
|
-
else if (ky === 0 && kx === 0) kernelValue = 1;
|
|
249
|
-
else if (ky === 0 && kx === 1) kernelValue = 1;
|
|
250
|
-
else if (ky === 1 && kx === -1) kernelValue = 0;
|
|
251
|
-
else if (ky === 1 && kx === 0) kernelValue = 1;
|
|
252
|
-
else if (ky === 1 && kx === 1) kernelValue = 2;
|
|
253
|
-
|
|
254
|
-
r += originalData[kidx] * kernelValue;
|
|
255
|
-
g += originalData[kidx + 1] * kernelValue;
|
|
256
|
-
b += originalData[kidx + 2] * kernelValue;
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
// Apply intensity and add 128 for emboss effect
|
|
261
|
-
data[idx] = Math.max(0, Math.min(255, 128 + r * intensity));
|
|
262
|
-
data[idx + 1] = Math.max(0, Math.min(255, 128 + g * intensity));
|
|
263
|
-
data[idx + 2] = Math.max(0, Math.min(255, 128 + b * intensity));
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
ctx.putImageData(imageData, 0, 0);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
function applyInvert(ctx: SKRSContext2D): void {
|
|
272
|
-
ctx.filter = 'invert(100%)';
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
function applyGrayscale(ctx: SKRSContext2D): void {
|
|
276
|
-
ctx.filter = 'grayscale(100%)';
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
function applySepia(ctx: SKRSContext2D): void {
|
|
280
|
-
ctx.filter = 'sepia(100%)';
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
function applyPixelate(ctx: SKRSContext2D, size: number): void {
|
|
284
|
-
if (size > 1) {
|
|
285
|
-
const imageData = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);
|
|
286
|
-
const data = imageData.data;
|
|
287
|
-
const width = ctx.canvas.width;
|
|
288
|
-
const height = ctx.canvas.height;
|
|
289
|
-
|
|
290
|
-
// Create pixelated version
|
|
291
|
-
for (let y = 0; y < height; y += size) {
|
|
292
|
-
for (let x = 0; x < width; x += size) {
|
|
293
|
-
// Get average color of the block
|
|
294
|
-
let r = 0, g = 0, b = 0, count = 0;
|
|
295
|
-
|
|
296
|
-
for (let dy = 0; dy < size && y + dy < height; dy++) {
|
|
297
|
-
for (let dx = 0; dx < size && x + dx < width; dx++) {
|
|
298
|
-
const idx = ((y + dy) * width + (x + dx)) * 4;
|
|
299
|
-
r += data[idx];
|
|
300
|
-
g += data[idx + 1];
|
|
301
|
-
b += data[idx + 2];
|
|
302
|
-
count++;
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
r = Math.round(r / count);
|
|
307
|
-
g = Math.round(g / count);
|
|
308
|
-
b = Math.round(b / count);
|
|
309
|
-
|
|
310
|
-
// Apply the average color to the entire block
|
|
311
|
-
for (let dy = 0; dy < size && y + dy < height; dy++) {
|
|
312
|
-
for (let dx = 0; dx < size && x + dx < width; dx++) {
|
|
313
|
-
const idx = ((y + dy) * width + (x + dx)) * 4;
|
|
314
|
-
data[idx] = r;
|
|
315
|
-
data[idx + 1] = g;
|
|
316
|
-
data[idx + 2] = b;
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
ctx.putImageData(imageData, 0, 0);
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
function applyBrightness(ctx: SKRSContext2D, value: number): void {
|
|
327
|
-
ctx.filter = `brightness(${100 + value}%)`;
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
function applyContrast(ctx: SKRSContext2D, value: number): void {
|
|
331
|
-
ctx.filter = `contrast(${100 + value}%)`;
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
function applySaturation(ctx: SKRSContext2D, value: number): void {
|
|
335
|
-
ctx.filter = `saturate(${100 + value}%)`;
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
function applyHueShift(ctx: SKRSContext2D, value: number): void {
|
|
339
|
-
ctx.filter = `hue-rotate(${value}deg)`;
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
function applyPosterize(ctx: SKRSContext2D, levels: number): void {
|
|
343
|
-
if (levels > 1) {
|
|
344
|
-
const imageData = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);
|
|
345
|
-
const data = imageData.data;
|
|
346
|
-
const step = 255 / (levels - 1);
|
|
347
|
-
|
|
348
|
-
for (let i = 0; i < data.length; i += 4) {
|
|
349
|
-
data[i] = Math.round(data[i] / step) * step; // R
|
|
350
|
-
data[i + 1] = Math.round(data[i + 1] / step) * step; // G
|
|
351
|
-
data[i + 2] = Math.round(data[i + 2] / step) * step; // B
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
ctx.putImageData(imageData, 0, 0);
|
|
355
|
-
}
|
|
356
|
-
}
|