Skip to content

Image Nodes

Optimize and transform images with resize, optimize, transform, and AI-powered operations.

PluginPackageBest ForSpeed
imagePlugin@uploadista/flow-images-sharpNode.js servers, full features50-100ms
imagePluginNode@uploadista/flow-images-photonEdge/serverless (Cloudflare Workers)5-10ms
imageAiPlugin@uploadista/flow-images-replicateAI operations (background removal)5-20s
npm install @uploadista/flow-images-nodes @uploadista/flow-images-sharp
import { createUploadistaServer } from "@uploadista/server";
import { imagePlugin } from "@uploadista/flow-images-sharp";
const uploadista = await createUploadistaServer({
// ...
plugins: [
imagePlugin(),
],
});

Features: Resize, optimize, transform, blur, rotate, watermark, logo, text overlay

Requirements: Node.js 18+

FeatureSharpPhotonReplicate
ResizeYesYesNo
OptimizeYesYesNo
BlurYesYesNo
RotateYesNoNo
FlipYesYesNo
GrayscaleYesYesNo
Brightness/ContrastYesYesNo
WatermarkYesNoNo
Logo overlayYesNoNo
Text overlayYesNoNo
Background removalNoNoYes
AI upscaleNoNoYes
EnvironmentNode.jsEdge/WorkersAny
CostFreeFreePer-request

Scale images to specific dimensions.

Package: @uploadista/flow-images-nodes

import { createResizeNode } from "@uploadista/flow-images-nodes";
// Resize to specific dimensions
const resizeNode = yield* createResizeNode("resize-1", {
width: 800,
height: 600,
fit: "cover",
});
// Resize width only, maintain aspect ratio
const widthOnlyNode = yield* createResizeNode("resize-2", {
width: 1200,
fit: "contain",
});
// With streaming mode for large files
const streamingNode = yield* createResizeNode("resize-3", {
width: 800,
height: 600,
fit: "cover",
}, {
mode: "streaming",
naming: { mode: "auto" },
});
ParameterTypeRequiredDescription
widthnumberNo*Target width in pixels
heightnumberNo*Target height in pixels
fit"contain" | "cover" | "fill"YesHow the image fits within dimensions

*At least one of width or height must be specified.

OptionTypeDefaultDescription
mode"auto" | "buffered" | "streaming""auto"Processing mode
keepOutputbooleanfalseKeep output in flow results
namingFileNamingConfig-File naming configuration
streamingConfig.fileSizeThresholdnumber1048576Threshold for auto streaming (1MB)

Compress and convert image formats.

Package: @uploadista/flow-images-nodes

import { createOptimizeNode } from "@uploadista/flow-images-nodes";
// Convert to WebP with quality 80
const optimizeNode = yield* createOptimizeNode("optimize-1", {
quality: 80,
format: "webp",
});
// Maximum compression with AVIF
const avifNode = yield* createOptimizeNode("optimize-2", {
quality: 75,
format: "avif",
});
// High quality JPEG for compatibility
const jpegNode = yield* createOptimizeNode("optimize-3", {
quality: 90,
format: "jpeg",
}, {
naming: { mode: "auto" },
});
ParameterTypeRequiredDescription
qualitynumber (0-100)YesImage quality percentage
format"jpeg" | "webp" | "png" | "avif"YesOutput image format
OptionTypeDefaultDescription
mode"auto" | "buffered" | "streaming""buffered"Processing mode
keepOutputbooleanfalseKeep output in flow results
namingFileNamingConfig-File naming configuration

Recommended Settings:

  • quality: 85, format: "webp" - Good balance of size and quality
  • quality: 90, format: "jpeg" - Maximum compatibility
  • quality: 75, format: "avif" - Maximum compression

Apply multiple transformations in sequence.

Package: @uploadista/flow-images-nodes

import { createTransformImageNode } from "@uploadista/flow-images-nodes";
// Chain multiple transformations
const transformNode = yield* createTransformImageNode("transform-1", {
transformations: [
{ type: "resize", width: 800, height: 600, fit: "cover" },
{ type: "brightness", value: 10 },
{ type: "sharpen" },
],
});
// Add watermark (Sharp only)
const watermarkNode = yield* createTransformImageNode("transform-2", {
transformations: [
{ type: "resize", width: 1200, fit: "contain" },
{
type: "watermark",
imagePath: "https://example.com/watermark.png",
position: "bottom-right",
opacity: 0.5,
},
],
});
// Apply filters
const filterNode = yield* createTransformImageNode("transform-3", {
transformations: [
{ type: "grayscale" },
{ type: "contrast", value: 20 },
],
});
TypeParametersSharpPhotonDescription
resizewidth?, height?, fitYesYesResize image
blursigma (0.3-1000)YesYesApply Gaussian blur
rotateangle, background?YesNoRotate by degrees
flipdirection (“horizontal” | “vertical”)YesYesFlip image
grayscale-YesYesConvert to grayscale
sepia-YesYesApply sepia tone
brightnessvalue (-100 to 100)YesYesAdjust brightness
contrastvalue (-100 to 100)YesYesAdjust contrast
sharpensigma?YesYesApply sharpening
watermarkimagePath, position, opacity, offsetX?, offsetY?YesNoAdd watermark
logoimagePath, position, scale, offsetX?, offsetY?YesNoAdd logo overlay
texttext, position, fontSize, color, fontFamily?, offsetX?, offsetY?YesNoAdd text overlay

For watermark, logo, and text: "top-left" | "top-right" | "bottom-left" | "bottom-right" | "center"


AI-powered background removal.

Package: @uploadista/flow-images-nodes

import { createRemoveBackgroundNode } from "@uploadista/flow-images-nodes";
// Remove background with default settings
const removeBgNode = yield* createRemoveBackgroundNode("remove-bg-1");
// With custom credential and naming
const customNode = yield* createRemoveBackgroundNode("remove-bg-2", {
credentialId: "my-replicate-credential",
naming: { mode: "auto" },
});
ParameterTypeRequiredDefaultDescription
credentialIdstringNo-AI service credential ID
keepOutputbooleanNofalseKeep output in flow results
namingFileNamingConfigNo-File naming (auto suffix: nobg)

Performance: ~5-15s | Cost: ~$0.001-0.002 per image


Extract image metadata using AI.

Package: @uploadista/flow-images-nodes

import { createDescribeImageNode } from "@uploadista/flow-images-nodes";
// Describe image content
const describeNode = yield* createDescribeImageNode("describe-1");
// With custom credential
const customDescribeNode = yield* createDescribeImageNode("describe-2", {
credentialId: "my-ai-credential",
keepOutput: true,
});
ParameterTypeRequiredDefaultDescription
credentialIdstringNo-AI service credential ID
keepOutputbooleanNofalseKeep output in flow results

Output: Returns { description: string } with AI-generated image description.


All transform nodes support three processing modes:

ModeDescriptionWhen to Use
autoAutomatically selects streaming for files > 1MBDefault, recommended
bufferedLoads entire file into memorySmall files, predictable memory
streamingProcesses file as chunksLarge files, memory-constrained

OperationSharpPhoton
Resize (1MB image)50-100ms5-10ms
Optimize (WebP)100-200ms10-15ms
Transform (multiple ops)100-300ms20-50ms
AI OperationTimeCost
Remove background5-15s$0.001-0.002
Describe image2-5s$0.001