Skip to content

Replace jimp with sharp #45

@burnhamrobertp

Description

@burnhamrobertp

Summary

Replace Jimp with sharp as the image processing library in spring-map-parser.

Why

Capability Jimp sharp
Resampling Bilinear only Lanczos3, Mitchell, cubic, etc.
Large images Crashes on 10240×10240 JPEG (jpeg-js RangeError) Handles any size via libvips streaming
Performance Pure JS — slow encode/decode Native libvips — 10-50× faster
Format support JPEG, PNG, BMP, TIFF, GIF + WebP, AVIF, HEIF
Memory usage Full RGBA buffer in JS heap Streams tiles, constant memory
Alpha handling Manual pixel manipulation Built-in .removeAlpha(), .ensureAlpha()

Current Jimp usage in the parser

  • 10×
    ew Jimp(width, height) — buffer construction
  • 1× Jimp.read() — skybox DDS decode
  • 2× Jimp.intToRGBA /
    gbaToInt — pixel color helpers
  • All returned images are Jimp instances with .bitmap.data (raw RGBA Buffer)

All of these have direct sharp equivalents. The main API change is that sharp uses a pipeline pattern (sharp(input).resize().png().toBuffer()) rather than mutable bitmap objects.

Migration considerations

  • Breaking change: Consumers currently receive Jimp objects. The return type would become sharp.Sharp or raw Buffer with metadata.
  • Incremental path: Could first expose .bitmap.data raw buffers (already available on Jimp objects) as the public API, then swap internals to sharp. Downstream consumers like maps-metadata already bridge to sharp via raw buffers.
  • Native dependency: sharp requires a native binary (pre-built for all major platforms via prebuild). This is standard for Node.js image processing but differs from Jimp's pure-JS approach.
  • DDS decoding: Jimp.read() is used for skybox DDS files — would need a DDS decoder that outputs raw RGBA for sharp to consume (or keep a minimal DDS reader).

Related

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions