Image sets

An ImageSet represents several outputs derived from one source. Missing outputs are rendered together so the selected driver can decode the source once.

Multiply widths and formats

<?php

use Alto\Image\Format;
use Alto\Image\Image;

$set = Image::open('photo.jpg')
    ->cover(ratio: 16 / 9)
    ->widths(640, 960, 1280)
    ->formats(Format::Webp, Format::Avif);

$results = $set->store('public/media');

This request contains six outputs. widths(), heights(), and formats() multiply the current outputs, preserve order, and do not remove duplicates.

If a resize already defines a box ratio, changing one axis preserves that ratio. For example, cover(1600, 900)->widths(640, 1280) produces 640x360 and 1280x720 outputs.

Combine different outputs

Use and() when outputs differ by more than one dimension or format:

<?php

use Alto\Image\Image;

$source = Image::open('photo.jpg');

$set = $source->cover(1600, 900)->webp(82)
    ->and($source->cover(600, 400)->webp(80))
    ->and($source->cover(160, 160)->webp(75));

$results = $set->store('public/media');

All members must share the same source, limits, and driver. Configure using() and within() before deriving the individual outputs.

Inspect and select outputs

ImageSet implements Countable and IteratorAggregate:

<?php

foreach ($set as $index => $image) {
    echo $index . ': ' . $image->size() . PHP_EOL;
}

$subset = $set->select(0, 2);

Indexes are zero-based. select() preserves the requested order.

Render or store

render() returns one Result per output in memory. store() returns the same shape and writes each derivative to a signature-keyed store. ImageSet has no save() method because one path cannot name several outputs.

The one-decode guarantee applies to outputs rendered in the same batch. A store renders only its missing outputs together; existing derivatives are reused.