Skip to main content

Image Manipulation

还没翻译译自英文(supabase.com)本页 19 段都还没译

Supabase Storage has out-of-the-box support for the most common image transformations and optimizations you need. If you need to do anything custom beyond what Supabase Storage provides, you can use Edge Functions to write custom image manipulation scripts.

In this example, we will use magick-wasm to perform image manipulations. magick-wasm is the WebAssembly port of the popular ImageMagick library and supports processing over 100 file formats.

Caution

Edge Functions currently doesn't support image processing libraries such as Sharp, which depend on native libraries. Only WASM-based libraries are supported.

Prerequisites

Make sure you have the latest version of the Supabase CLI installed.

Create the Edge Function

Create a new function locally:

supabase functions new image-blur

Write the function

In this example, we are implementing a function allowing users to upload an image and get a blurred thumbnail.

Here's the implementation in index.ts file:

// This is an example showing how to use Magick WASM to do image manipulations in Edge Functions.
//
import { ImageMagick, initializeImageMagick, MagickFormat } from 'npm:@imagemagick/magick-wasm@^0'
import { withSupabase } from 'npm:@supabase/server@^1'

const wasmBytes = await Deno.readFile(
  new URL('magick.wasm', import.meta.resolve('npm:@imagemagick/magick-wasm@^0'))
)
await initializeImageMagick(wasmBytes)

// Authenticated endpoint, so deploy with verify_jwt = true.
export default {
  fetch: withSupabase({ auth: 'user' }, async (req, _ctx) => {
    const formData = await req.formData()
    const file = formData.get('file')
    if (!(file instanceof Blob)) {
      return Response.json({ error: 'file is required' }, { status: 400 })
    }
    const content = await file.bytes()

    let result = ImageMagick.read(content, (img): Uint8Array => {
      // resize the image
      img.resize(500, 300)
      // add a blur of 60x5
      img.blur(60, 5)

      return img.write((data) => data)
    })

    return new Response(Uint8Array.from(result), {
      headers: { 'Content-Type': 'image/png' },
    })
  }),
}

Test it locally

You can test the function locally by running:

supabase start
supabase functions serve --no-verify-jwt

Then, make a request using curl or your favorite API testing tool.

curl --location '<http://localhost:54321/functions/v1/image-blur>' \\
--form 'file=@"/path/to/image.png"'
--output '/path/to/output.png'

If you open the output.png file you will find a transformed version of your original image.

Deploy to your hosted project

Deploy the function to your Supabase project.

supabase link
supabase functions deploy image-blur

Caution

Hosted Edge Functions have limits on memory and CPU usage.

If you try to perform complex image processing or handle large images (> 5MB) your function may return a resource limit exceeded error.