Skip to main content
Open 48 MP phone photos without running out of memory, and know which units your code gets back.

The 16.7 MP Working Copy

The editor works on at most 16.7 MP of any photo (2^24 px, the area of 4096 × 4096). A larger photo is scaled down once, when it opens, keeping its ratio. The screen, Auto, smart crop, the thumbnails and the export all use that copy. It’s the same in every browser, for two reasons:
  • Memory on phones. A full 48 MP photo takes more memory than a phone’s browser tab may get.
  • Parity with the legacy editor, which always worked at this size in Safari and on iOS.

What Your Code Sees

Editor.tsx
Don’t pass a saved state’s crop to processImage as its crop option. Those px are the working copy’s, not the file’s.

Memory

Measured on WebKit standing in for an iPhone 15, a 48 MP photo: The full file is still decoded once when it opens, which adds 0.29 GB to the opening peak and about 0.15 s before onLoad.

Phones

Phones shoot 12 to 48 MP. To get smaller files from them, set maxWidth and maxHeight lower. The export renders straight at that size.
Upload.tsx
  • A HEIC from a phone saves as PNG unless outputType says otherwise.
  • Safari decodes HEIC itself. Chromium and Firefox, Android’s included, use a bundled decoder that loads only for a HEIC, in a background worker. A 48 MP HEIC takes about 8 s on a fast laptop, longer on a phone.
  • Every gesture works with a finger, and controls reach at least 44 × 44 px under a finger.

Crop & Aspect Ratio

Output size and type props.

Process Without UI

Units in processImage.