Image Contact-Sheet Maker
Turn photographs or product images into one labelled overview grid. Control image order, sizing and spacing without a free-placement collage editor.
Your images are decoded and drawn locally, not uploaded or saved. Refreshing clears files, settings and results.Source images
Static JPEG/PNG only: 40 files, 15 MiB each, 100 MiB combined, 20 megapixels and 8,192 px per source edge. Sources are checked serially. Files and settings stay in memory; refreshing clears them.
Drop images here, or choose files.
0 selected; 0 valid; 0 B compressed input.
No images selected. Add at least one JPEG or PNG to create a layout.
Layout and export
Cells: 64–1600 px; margin/gap: 0–100 px. Enabled labels add 28 px per row. Full column count is kept, even for incomplete rows. PNG and JPEG sheets are opaque; transparency is composited over your background.
Live preview
A uniformly scaled version of the full output geometry, using oriented thumbnails. Export uses original decoded sources. Full labels and title remain available in the editable fields and tooltips above.
Add valid sources and fix layout errors to see a preview.
How to make an image contact sheet
- Select or drop static JPEG/PNG files. Import order is preserved; failed sources stay listed and must be explicitly removed.
- Use keyboard-accessible Up/Down controls, remove images, or explicitly sort by filename. Edit displayed labels independently of original filenames.
- Choose columns, image-cell dimensions, margin, gap, colors, Contain/Cover, labels and optional title. Review the live preview and output dimensions.
- Press Generate contact sheet, then download the complete contact-sheet.png or contact-sheet.jpg. JPEG quality is adjustable; Copy sheet details copies text, not image pixels.
Worked example and exact dimensions
Five images, three columns, 100-by-80 image cells, 10 px margins and 5 px gaps make a 330-by-185 sheet with labels and title off. There are two rows and one empty cell, which keeps the chosen background.
Enabling labels adds a 28 px band to every row: 330 by 241 pixels. Enabling a title adds a 48 px band: 330 by 289 pixels. All configured columns remain even if the final row is incomplete.
rows = ceil(images / columns) width = 2 × margin + columns × cellWidth + (columns − 1) × gap height = 2 × margin + titleBand + rows × (cellHeight + labelBand) + (rows − 1) × gap
Contain, Cover and orientation
Contain shows the complete image, centered with padding; Cover scales uniformly to fill the cell and clips a centered crop without distortion. A 200-by-100 source in a 100-by-100 cell is 100 by 50 with 25 px vertical padding in Contain, or 200 by 100 with a centered horizontal crop in Cover.
The browser applies EXIF orientation exactly once before measuring, thumbnailing or drawing, including mirrored and portrait variants. Original decoded sources are used for export. Preview uses oriented thumbnails with the same full-layout coordinates at one uniform scale, not a separately computed thumbnail grid.
Labels, title and backgrounds
Labels can be disabled, use editable filename labels, or show sequential numbers in visible order. An optional one-line title allows up to 120 Unicode code points. A bundled Liberation Sans font loads locally before canvas text measurement; long text is measured and ellipsized within a clipped band. Full text remains accessible in fields/tooltips. Glyph availability for some scripts and emoji depends on browser fallback fonts.
Labels and title are plain text, never HTML. Tabs and line breaks are displayed as spaces in raster labels. Sorting still uses original filenames, not edited labels, in ordinal order. Only basenames are displayed or included in copied details; filesystem paths are not read or exported.
Both output formats have an opaque chosen background. Transparent PNG content is composited over it; the sheet itself is not transparent. PNG keeps rendered pixels without JPEG loss. JPEG uses the selected quality, with the same geometry and background. Returned Blob MIME is checked before a matching extension is offered.
Limits and error handling
Accepts 40 static JPEG/PNG files, 15 MiB each and 100 MiB combined compressed input. Each source and output is limited to 20 megapixels and 8,192 px per edge. Cells are 64–1600 px, columns 1–8, margins/gaps 0–100 px. Computed sheet dimensions are checked before allocation; oversized output is rejected, never silently resized.
Compressed limits do not guarantee available memory. Source checks and each draw pass decode one image at a time and promptly close bitmaps; canvases are released after export. Animated PNG, GIF, WebP, SVG, corrupt images and unsupported JPEG encodings are rejected explicitly. No partial sheet silently drops a failed file.
Changing order, labels, title or settings invalidates completed exports and discards stale asynchronous results. Cancel generation discards unfinished output while preserving sources. Clear images offers in-memory Undo, including order, labels and settings. Clipboard denial selects the text details for manual copy. Downloads are rendered overviews, not archives of original photos or metadata.
No remote-image URLs, cloud storage, free placement, generated images, logos, PDF contact sheets or multipage pagination are included in this release.
How was this tool?
Help us improve Image contact-sheet maker.
Opens your email app; you send it there. No email app? Copy your comment and email feedback@tooltulip.com.
Don't include sensitive data.
0/300