btr img
Browse files- src/lib/services/picletExport.ts +34 -24
src/lib/services/picletExport.ts
CHANGED
@@ -10,9 +10,9 @@ export async function generateShareableImage(piclet: PicletInstance): Promise<Bl
|
|
10 |
const ctx = canvas.getContext('2d');
|
11 |
if (!ctx) throw new Error('Could not create canvas context');
|
12 |
|
13 |
-
// Set canvas size -
|
14 |
-
const canvasWidth =
|
15 |
-
const canvasHeight =
|
16 |
canvas.width = canvasWidth;
|
17 |
canvas.height = canvasHeight;
|
18 |
|
@@ -35,37 +35,47 @@ export async function generateShareableImage(piclet: PicletInstance): Promise<Bl
|
|
35 |
|
36 |
// Load piclet image first
|
37 |
const picletImg = await loadImage(piclet.imageData || piclet.imageUrl);
|
38 |
-
const picletSize =
|
39 |
-
const picletX =
|
40 |
-
const picletY =
|
41 |
|
42 |
// Load and draw grass platform positioned under the piclet
|
43 |
const grassImg = await loadImage('/assets/grass.PNG');
|
44 |
-
const platformSize =
|
45 |
const platformX = (canvasWidth - platformSize) / 2;
|
46 |
-
const platformY = picletY +
|
47 |
ctx.drawImage(grassImg, platformX, platformY, platformSize, platformSize);
|
48 |
|
49 |
// Draw piclet on top of platform
|
50 |
ctx.drawImage(picletImg, picletX, picletY, picletSize, picletSize);
|
51 |
|
52 |
-
// Add
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
|
|
|
|
|
|
|
|
58 |
ctx.textAlign = 'center';
|
59 |
-
ctx.
|
60 |
-
ctx.shadowBlur = 10;
|
61 |
-
ctx.shadowOffsetX = 4;
|
62 |
-
ctx.shadowOffsetY = 4;
|
63 |
|
64 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
65 |
|
66 |
-
//
|
67 |
-
ctx.
|
68 |
-
ctx.fillText(nameText, canvasWidth / 2, 80);
|
69 |
|
70 |
// Reset shadow
|
71 |
ctx.shadowColor = 'transparent';
|
@@ -75,9 +85,9 @@ export async function generateShareableImage(piclet: PicletInstance): Promise<Bl
|
|
75 |
|
76 |
// Load and draw translucent watermark
|
77 |
const logoImg = await loadImage('/assets/snap_logo.png');
|
78 |
-
const logoSize =
|
79 |
ctx.globalAlpha = 0.3; // More translucent
|
80 |
-
ctx.drawImage(logoImg, canvasWidth - logoSize -
|
81 |
ctx.globalAlpha = 1.0;
|
82 |
|
83 |
// Get the image as blob
|
|
|
10 |
const ctx = canvas.getContext('2d');
|
11 |
if (!ctx) throw new Error('Could not create canvas context');
|
12 |
|
13 |
+
// Set canvas size - full piclet size plus padding for name
|
14 |
+
const canvasWidth = 1024;
|
15 |
+
const canvasHeight = 1200; // Extra height for name
|
16 |
canvas.width = canvasWidth;
|
17 |
canvas.height = canvasHeight;
|
18 |
|
|
|
35 |
|
36 |
// Load piclet image first
|
37 |
const picletImg = await loadImage(piclet.imageData || piclet.imageUrl);
|
38 |
+
const picletSize = 1024; // Full size!
|
39 |
+
const picletX = 0;
|
40 |
+
const picletY = 150; // Leave room for name at top
|
41 |
|
42 |
// Load and draw grass platform positioned under the piclet
|
43 |
const grassImg = await loadImage('/assets/grass.PNG');
|
44 |
+
const platformSize = 1200; // Larger than piclet for proper positioning
|
45 |
const platformX = (canvasWidth - platformSize) / 2;
|
46 |
+
const platformY = picletY + picletSize - 300; // Platform under piclet
|
47 |
ctx.drawImage(grassImg, platformX, platformY, platformSize, platformSize);
|
48 |
|
49 |
// Draw piclet on top of platform
|
50 |
ctx.drawImage(picletImg, picletX, picletY, picletSize, picletSize);
|
51 |
|
52 |
+
// Add sleek modern text styling
|
53 |
+
const nameText = piclet.nickname || piclet.typeId;
|
54 |
+
|
55 |
+
// Create gradient for text
|
56 |
+
const gradient = ctx.createLinearGradient(0, 50, 0, 120);
|
57 |
+
gradient.addColorStop(0, '#ffffff');
|
58 |
+
gradient.addColorStop(1, '#e0e0e0');
|
59 |
+
|
60 |
+
// Modern sleek font with gradient and subtle shadow
|
61 |
+
ctx.font = 'bold 72px -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Arial, sans-serif';
|
62 |
ctx.textAlign = 'center';
|
63 |
+
ctx.textBaseline = 'middle';
|
|
|
|
|
|
|
64 |
|
65 |
+
// Subtle shadow for depth
|
66 |
+
ctx.shadowColor = 'rgba(0, 0, 0, 0.3)';
|
67 |
+
ctx.shadowBlur = 15;
|
68 |
+
ctx.shadowOffsetX = 0;
|
69 |
+
ctx.shadowOffsetY = 3;
|
70 |
+
|
71 |
+
// Dark outline for contrast
|
72 |
+
ctx.strokeStyle = '#2c3e50';
|
73 |
+
ctx.lineWidth = 4;
|
74 |
+
ctx.strokeText(nameText.toUpperCase(), canvasWidth / 2, 80);
|
75 |
|
76 |
+
// Fill with gradient
|
77 |
+
ctx.fillStyle = gradient;
|
78 |
+
ctx.fillText(nameText.toUpperCase(), canvasWidth / 2, 80);
|
79 |
|
80 |
// Reset shadow
|
81 |
ctx.shadowColor = 'transparent';
|
|
|
85 |
|
86 |
// Load and draw translucent watermark
|
87 |
const logoImg = await loadImage('/assets/snap_logo.png');
|
88 |
+
const logoSize = 150;
|
89 |
ctx.globalAlpha = 0.3; // More translucent
|
90 |
+
ctx.drawImage(logoImg, canvasWidth - logoSize - 30, canvasHeight - logoSize - 30, logoSize, logoSize);
|
91 |
ctx.globalAlpha = 1.0;
|
92 |
|
93 |
// Get the image as blob
|