VS Label Photo Slot
The print-ready label's empty window, filled
- label
- photo
- label
- coverage
Label art usually arrives as an EPS export with a blank photo window and empty NAME / FROM lines, because the printer expects you to drop the artwork in later. That's fine for a printer and useless for a render. VS Label Photo Slot has two jobs: put a photo into that window, or - often more useful - punch the window and the name field out of the label's coverage mask so the photo that's already on the bottle survives the label lock.
The two modes, which is the whole node
The source docstring says it plainly: "Either drop the bottle's photo in, or mark those areas as 'keep from base' so the photo already on the bottle survives the label lock." Those are genuinely different operations and you'll use the second one more than you expect.
Drop a photo in. Wire an IMAGE into the optional photo input and it's cover-fitted into the rectangle - scaled so it fills, centred, cropped. The label output has your photo composited into the window.
Mark it as keep. Leave photo unconnected and the rectangle is zeroed out of the coverage mask instead, while the label pixels stay as they were. That coverage mask is what tells the cylinder wrap where the clean label is allowed to paint. So the photo, and optionally the name field, come from your source render rather than from the flat art. For a real product shot that's exactly right: the photo on a physical bottle is lit, curved and partly obscured, and a flat pasted version of it would look like a sticker.
Inputs worth touching
The rectangle fields are photo_u0, photo_v0, photo_u1, photo_v1 - fractions of the flat label (u across, v down), not of the canvas. The defaults correspond to the pack's reference label die line, so if your label is the same template they're already correct. If it isn't, you'll be nudging three or four of these by hand with a mask preview open.
keep_name_fields is a boolean, on by default, that zeroes a second rectangle defined by name_u0, name_v0, name_u1, name_v1. Note the defaults are a narrow vertical strip - 0.104 to 0.136 in u - which is what a "NAME / FROM" column looks like on this particular label, not a general-purpose box. Turn it off and those fields disappear from coverage too, meaning the wrapped label will paint over them.
Outputs are label and coverage. coverage is a full-frame mask that is 1 everywhere except the zeroed rectangles. Feed both into VS Cylinder Label Wrap.
How it works, mechanically
The node builds coverage as a mask of ones, then sets the photo rectangle to zero if there's no photo input, and the name rectangle to zero if keep_name_fields is on. If there is a photo, it computes max(box_h / photo_h, box_w / photo_w) - classic cover fit - resizes, and crops the centre. Everything is plain tensor slicing; there's no model and no interpolation cleverness beyond one bilinear resize.
Install
Manager → VS Glass Matte (Comfy Registry name), restart. Or clone by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/andrewclass1/comfyui-vs-glassmatte
The pack ships zero dependencies - torch and numpy only, dependencies = [] in pyproject.toml, no weights to download. Which is the good kind of custom node install.
Where people get burned
These coordinates are fractions of the flat label, and flat labels are not square and are rarely the aspect ratio you assume. A rectangle that looks centred in an image viewer can land in the wrong place because the export has bleed. Check the coverage mask output before you trust the wrap; the pack's own coverage mask is the fastest debugging view you have, because you can see the holes.
The other one: with keep_name_fields on but no photo wired, you get two holes and no replacement - the label comes out with a missing window and missing name. That's not an error, it's the node doing what you asked. If you wanted a clean label everywhere, wire a photo or turn the flag off.
And as with every node in this pack: first image of the batch only. It's built for one hero at a time.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| label | IMAGE | — | |
| photo_u0 | FLOAT | 0.13670–1 | — |
| photo_v0 | FLOAT | 0.27510–1 | — |
| photo_u1 | FLOAT | 0.42500–1 | — |
| photo_v1 | FLOAT | 0.77990–1 | — |
| keep_name_fields | BOOLEAN | true | — |
| name_u0 | FLOAT | 0.10410–1 | — |
| name_v0 | FLOAT | 0.58160–1 | — |
| name_u1 | FLOAT | 0.13590–1 | — |
| name_v1 | FLOAT | 0.78210–1 | — |
| photoopt | IMAGE | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| label | IMAGE | — |
| coverage | MASK | — |