The Canvas Module is a utility library for the Zumito ecosystem that provides enhanced canvas rendering capabilities for Discord bots. This module extends the native HTML5 Canvas API with additional drawing utilities, image processing functions, and GIF generation tools specifically designed for bot development.
This module is part of the Zumito ecosystem and serves as a dependency for other visual modules.
npm install @zumito-team/canvas-module
Import and use the Canvas Module in your Zumito bot zumito.config.ts:
import path from 'path';
import { ServiceContainer, type LauncherConfig } from 'zumito-framework';
const __dirname = process.cwd();
export const config: LauncherConfig = {
bundles: [{
path: path.join(__dirname, "node_modules", "@zumito-team", "canvas-module"),
}],
};
import { CanvasUtils } from "@zumito-team/canvas-module";
const canvasUtil = new CanvasUtils({
width: 500,
height: 300,
isGif: true,
delay: 100,
quality: 10,
repeat: 0,
});
const ctx = canvasUtil.getContext();
canvasUtil.startEncoder();
const avatar1 = await CanvasUtils.loadImage(user1.displayAvatarURL({ extension: 'png', size: 64 }));
const avatar2 = await CanvasUtils.loadImage(user2.displayAvatarURL({ extension: 'png', size: 64 }));
const drawBackground = () => {
canvasUtil.drawBackground('#87CEEB', '#90EE90');
canvasUtil.drawRect(0, 260, 500, 40, '#8B4513');
};
drawBackground();
ctx.drawImage(avatar1, 80, 110, 40, 40);
ctx.drawImage(avatar2, 380, 110, 40, 40);
canvasUtil.drawParticles(250, 150, '#FFD700');
canvasUtil.addFrame();
const attachment = await canvasUtil.toAttachment('stickmanfight.gif');
await interaction.reply({ files: [attachment] });
The CanvasUtils class provides a comprehensive set of static methods for enhanced canvas operations:
class CanvasUtils {
// Image processing
static async loadImage(source: string | Buffer): Promise<Image>
static resizeImage(image: Image, width: number, height: number): Canvas
// Drawing utilities
static drawRoundedRect(ctx: CanvasRenderingContext2D, x: number, y: number, width: number, height: number, radius: number): void
static drawCircle(ctx: CanvasRenderingContext2D, x: number, y: number, radius: number): void
// Text rendering
static drawText(ctx: CanvasRenderingContext2D, text: string, x: number, y: number, options?: TextOptions): void
static measureText(ctx: CanvasRenderingContext2D, text: string): TextMetrics
// Avatar processing
static async drawAvatar(ctx: CanvasRenderingContext2D, avatarUrl: string, x: number, y: number, size: number): Promise<void>
static createCircularAvatar(avatar: Image, size: number): Canvas
// GIF utilities
static createGifEncoder(width: number, height: number): GIFEncoder
static addFrameToGif(encoder: GIFEncoder, canvas: Canvas): void
}
canvas/
āāā index.ts # Module entry point and exports
āāā package.json # Package configuration and dependencies
āāā utils/
āāā CanvasUtils.ts # Main utility class with canvas functions
// Load image from URL or buffer
const image = await CanvasUtils.loadImage('https://example.com/image.png');
// Resize image maintaining aspect ratio
const resized = CanvasUtils.resizeImage(image, 200, 200);
// Draw rounded rectangle
CanvasUtils.drawRoundedRect(ctx, 10, 10, 100, 50, 10);
// Draw perfect circle
CanvasUtils.drawCircle(ctx, 150, 150, 75);
// Advanced text rendering
CanvasUtils.drawText(ctx, 'Hello World', 100, 100, {
font: '24px Arial',
fillStyle: '#ffffff',
textAlign: 'center'
});
// Draw user avatar at specified position
await CanvasUtils.drawAvatar(ctx, user.displayAvatarURL(), 50, 50, 64);
// Create circular avatar mask
const circularAvatar = CanvasUtils.createCircularAvatar(avatarImage, 128);
// Initialize GIF encoder
const encoder = CanvasUtils.createGifEncoder(500, 300);
encoder.start();
encoder.setRepeat(0);
encoder.setDelay(100);
// Add frames
for (let frame = 0; frame < frameCount; frame++) {
// Render frame to canvas
renderFrame(canvas, frame);
CanvasUtils.addFrameToGif(encoder, canvas);
}
encoder.finish();
const buffer = encoder.out.getData();
The module includes built-in error handling for:
This project is licensed under the GNU General Public License (GPL).
Perfect for: Any Zumito module that requires canvas operations, image processing, or GIF generation. Essential dependency for visual Discord bot commands and interactive graphics generation.