Image Manipulation Examples

Practical examples of resizing, cropping, compositing, and drawing operations.

Resizing Examples

Basic Resize

import { Image } from "@cross/image";

const data = await Deno.readFile("input.png");
const image = await Image.decode(data);

// Resize to exact dimensions
image.resize({ width: 800, height: 600 });

await Deno.writeFile("resized.png", await image.encode("png"));

Maintain Aspect Ratio

import { Image } from "@cross/image";

const data = await Deno.readFile("input.png");
const image = await Image.decode(data);

const aspectRatio = image.width / image.height;

// Resize to width, calculate height
const targetWidth = 800;
const targetHeight = Math.round(targetWidth / aspectRatio);
image.resize({ width: targetWidth, height: targetHeight });

await Deno.writeFile("aspect-ratio.png", await image.encode("png"));

Create Thumbnails

import { Image } from "@cross/image";

const data = await Deno.readFile("photo.jpg");
const image = await Image.decode(data);

// Small thumbnail
image.resize({ width: 150, height: 150 });

await Deno.writeFile("thumb.jpg", await image.encode("jpeg", { quality: 85 }));

Pixel Art Scaling

import { Image } from "@cross/image";

const data = await Deno.readFile("sprite.png");
const image = await Image.decode(data);

// Use nearest neighbor for sharp pixel art
image.resize({ width: 320, height: 240, method: "nearest" });

await Deno.writeFile("scaled-sprite.png", await image.encode("png"));

Responsive Image Sizes

import { Image } from "@cross/image";

const data = await Deno.readFile("original.jpg");

const sizes = [
  { name: "large", width: 1920 },
  { name: "medium", width: 1280 },
  { name: "small", width: 640 },
  { name: "thumb", width: 320 },
];

for (const size of sizes) {
  const image = await Image.decode(data);
  const aspectRatio = image.width / image.height;
  const height = Math.round(size.width / aspectRatio);

  image.resize({ width: size.width, height });

  await Deno.writeFile(
    `${size.name}.jpg`,
    await image.encode("jpeg", { quality: 85 }),
  );

  console.log(`Created ${size.name}: ${size.width}x${height}`);
}

Cropping Examples

Center Crop to Square

import { Image } from "@cross/image";

const data = await Deno.readFile("photo.jpg");
const image = await Image.decode(data);

// Crop to center square
const size = Math.min(image.width, image.height);
const x = (image.width - size) / 2;
const y = (image.height - size) / 2;
image.crop(x, y, size, size);

await Deno.writeFile("square.png", await image.encode("png"));

Extract Region

import { Image } from "@cross/image";

const data = await Deno.readFile("photo.jpg");
const image = await Image.decode(data);

// Extract top-left 400x400 region
image.crop(0, 0, 400, 400);

await Deno.writeFile("region.png", await image.encode("png"));

Crop and Resize

import { Image } from "@cross/image";

const data = await Deno.readFile("photo.jpg");
const image = await Image.decode(data);

// First crop to center square
const size = Math.min(image.width, image.height);
image.crop(
  (image.width - size) / 2,
  (image.height - size) / 2,
  size,
  size,
);

// Then resize to final dimensions
image.resize({ width: 512, height: 512 });

await Deno.writeFile("cropped-resized.png", await image.encode("png"));

Remove Borders

import { Image } from "@cross/image";

const data = await Deno.readFile("bordered.jpg");
const image = await Image.decode(data);

// Remove 20px border on all sides
const border = 20;
image.crop(
  border,
  border,
  image.width - border * 2,
  image.height - border * 2,
);

await Deno.writeFile("no-border.png", await image.encode("png"));

Compositing Examples

Add Watermark

import { Image } from "@cross/image";

// Load base image
const photoData = await Deno.readFile("photo.jpg");
const photo = await Image.decode(photoData);

// Load watermark
const watermarkData = await Deno.readFile("watermark.png");
const watermark = await Image.decode(watermarkData);

// Place in bottom-right corner with padding
const padding = 20;
photo.composite(
  watermark,
  photo.width - watermark.width - padding,
  photo.height - watermark.height - padding,
  0.7, // 70% opacity
);

await Deno.writeFile("watermarked.jpg", await photo.encode("jpeg"));

Picture-in-Picture

import { Image } from "@cross/image";

const mainData = await Deno.readFile("main.jpg");
const main = await Image.decode(mainData);

const pipData = await Deno.readFile("pip.jpg");
const pip = await Image.decode(pipData);

// Resize PIP to 25% of main
pip.resize({
  width: Math.round(main.width * 0.25),
  height: Math.round(main.height * 0.25),
});

// Position in bottom-right
const padding = 20;
main.composite(
  pip,
  main.width - pip.width - padding,
  main.height - pip.height - padding,
  0.9,
);

await Deno.writeFile("pip-result.jpg", await main.encode("jpeg"));

Layer Multiple Images

import { Image } from "@cross/image";

// Create canvas
const canvas = Image.create(1920, 1080, 255, 255, 255);

// Load and composite layers
const layer1Data = await Deno.readFile("background.jpg");
const layer1 = await Image.decode(layer1Data);
canvas.composite(layer1, 0, 0);

const layer2Data = await Deno.readFile("middle.png");
const layer2 = await Image.decode(layer2Data);
canvas.composite(layer2, 100, 100, 0.8);

const layer3Data = await Deno.readFile("top.png");
const layer3 = await Image.decode(layer3Data);
canvas.composite(layer3, 200, 200, 0.9);

await Deno.writeFile("layered.png", await canvas.encode("png"));
import { Image } from "@cross/image";

const bgData = await Deno.readFile("background.jpg");
const bg = await Image.decode(bgData);

const logoData = await Deno.readFile("logo.png");
const logo = await Image.decode(logoData);

// Center the logo
const x = (bg.width - logo.width) / 2;
const y = (bg.height - logo.height) / 2;
bg.composite(logo, x, y);

await Deno.writeFile("centered-logo.png", await bg.encode("png"));

Drawing Examples

Draw Rectangles

import { Image } from "@cross/image";

// Create white canvas
const canvas = Image.create(800, 600, 255, 255, 255);

// Draw solid red rectangle
canvas.fillRect(100, 100, 200, 150, 255, 0, 0);

// Draw semi-transparent blue rectangle
canvas.fillRect(250, 200, 300, 200, 0, 0, 255, 128);

await Deno.writeFile("rectangles.png", await canvas.encode("png"));

Create Border

import { Image } from "@cross/image";

const data = await Deno.readFile("photo.jpg");
const image = await Image.decode(data);

// Create bordered canvas
const borderWidth = 20;
const bordered = Image.create(
  image.width + borderWidth * 2,
  image.height + borderWidth * 2,
  0,
  0,
  0, // Black border
);

// Composite image in center
bordered.composite(image, borderWidth, borderWidth);

await Deno.writeFile("bordered.png", await bordered.encode("png"));

Color Blocks

import { Image } from "@cross/image";

const canvas = Image.create(600, 400, 255, 255, 255);

// Draw color grid
const colors = [
  [255, 0, 0], // Red
  [0, 255, 0], // Green
  [0, 0, 255], // Blue
  [255, 255, 0], // Yellow
];

for (let i = 0; i < colors.length; i++) {
  const [r, g, b] = colors[i];
  canvas.fillRect(i * 150, 100, 150, 200, r, g, b);
}

await Deno.writeFile("color-blocks.png", await canvas.encode("png"));

Semi-Transparent Overlay

import { Image } from "@cross/image";

const data = await Deno.readFile("photo.jpg");
const image = await Image.decode(data);

// Add semi-transparent black overlay
image.fillRect(0, 0, image.width, image.height, 0, 0, 0, 100);

await Deno.writeFile("darkened.png", await image.encode("png"));

Complex Examples

Thumbnail with Border

import { Image } from "@cross/image";

const data = await Deno.readFile("photo.jpg");
const image = await Image.decode(data);

// Resize to thumbnail
image.resize({ width: 200, height: 200 });

// Create bordered canvas
const border = 5;
const bordered = Image.create(
  image.width + border * 2,
  image.height + border * 2,
  255,
  255,
  255,
);

// Composite thumbnail in center
bordered.composite(image, border, border);

await Deno.writeFile("thumb-bordered.png", await bordered.encode("png"));

Photo Collage

import { Image } from "@cross/image";

// Create canvas
const canvas = Image.create(1200, 800, 240, 240, 240);

// Load photos
const photo1 = await Image.decode(await Deno.readFile("photo1.jpg"));
const photo2 = await Image.decode(await Deno.readFile("photo2.jpg"));
const photo3 = await Image.decode(await Deno.readFile("photo3.jpg"));

// Resize all to same size
const size = { width: 380, height: 380 };
photo1.resize(size);
photo2.resize(size);
photo3.resize(size);

// Position in grid with spacing
const spacing = 20;
canvas.composite(photo1, spacing, spacing);
canvas.composite(photo2, spacing * 2 + 380, spacing);
canvas.composite(photo3, spacing * 3 + 760, spacing);

await Deno.writeFile("collage.png", await canvas.encode("png"));

Profile Picture Generator

import { Image } from "@cross/image";

const data = await Deno.readFile("face.jpg");
const image = await Image.decode(data);

// Center crop to square
const size = Math.min(image.width, image.height);
image.crop(
  (image.width - size) / 2,
  (image.height - size) / 2,
  size,
  size,
);

// Resize to profile size
image.resize({ width: 256, height: 256 });

// Add subtle border
const border = 2;
const bordered = Image.create(260, 260, 255, 255, 255);
bordered.composite(image, border, border);

await Deno.writeFile("profile.png", await bordered.encode("png"));

Batch Processing

Batch Resize

import { Image } from "@cross/image";

const files = ["photo1.jpg", "photo2.jpg", "photo3.jpg"];

for (const file of files) {
  const data = await Deno.readFile(file);
  const image = await Image.decode(data);

  image.resize({ width: 800, height: 600 });

  const output = file.replace(".jpg", "-resized.jpg");
  await Deno.writeFile(output, await image.encode("jpeg", { quality: 85 }));

  console.log(`Resized ${file}`);
}

Batch Watermark

import { Image } from "@cross/image";

const watermarkData = await Deno.readFile("watermark.png");
const watermark = await Image.decode(watermarkData);

const files = ["photo1.jpg", "photo2.jpg", "photo3.jpg"];

for (const file of files) {
  const data = await Deno.readFile(file);
  const image = await Image.decode(data);

  const padding = 20;
  image.composite(
    watermark,
    image.width - watermark.width - padding,
    image.height - watermark.height - padding,
    0.7,
  );

  const output = file.replace(".jpg", "-watermarked.jpg");
  await Deno.writeFile(output, await image.encode("jpeg", { quality: 90 }));

  console.log(`Watermarked ${file}`);
}

Node.js Examples

Resize in Node.js

import { readFile, writeFile } from "node:fs/promises";
import { Image } from "@cross/image";

const data = await readFile("photo.jpg");
const image = await Image.decode(data);

image.resize({ width: 800, height: 600 });

const output = await image.encode("jpeg", { quality: 85 });
await writeFile("resized.jpg", output);

Composite in Node.js

import { readFile, writeFile } from "node:fs/promises";
import { Image } from "@cross/image";

const baseData = await readFile("base.jpg");
const base = await Image.decode(baseData);

const logoData = await readFile("logo.png");
const logo = await Image.decode(logoData);

base.composite(logo, 50, 50, 0.8);

const output = await base.encode("png");
await writeFile("composited.png", output);

Bun Examples

Resize in Bun

import { Image } from "@cross/image";

const file = Bun.file("photo.jpg");
const data = new Uint8Array(await file.arrayBuffer());
const image = await Image.decode(data);

image.resize({ width: 800, height: 600 });

const output = await image.encode("jpeg", { quality: 85 });
await Bun.write("resized.jpg", output);