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
|