Anamorphic Streaks
Anamorphic streaks without renting a cinema lens
- image
- mask
- image
- mask
- anamorphic_streaks_info
That horizontal streak across the light is the single cheapest way to make a frame read as "shot on an anamorphic lens," and you don't need to wait for one to flare. x1AnamorphicStreaks builds it from highlights that are actually in your image, which is the part that makes it look like the lens did the work instead of a filter you dropped on top.
It's part of MKRShift Nodes, a big production-flavored pack (creative direction, finishing, surface work, even G-code output - it's a lot) by an author who built the pack with their own Codex extension-builder skill. The whole thing is young - zero impressions on comfy.icu, zero Reddit mentions when I checked - so don't expect tutorials yet. Treat it as fresh code with a test suite, not a battle-tested pack.
How it works
The mechanism is honest, deterministic, and easy to reason about: it computes luma, runs a soft threshold (threshold / softness) to find the bright stuff, boosts the bright pass with core_boost, smears it horizontally (or vertically) with length_px controlling the streak length and tail_softness shaping the falloff, tints it with tint_r/g/b, and screens it back over the original at mix. It's pure NumPy/PIL running on the CPU. No models, no downloads, no surprises.
You get three outputs:
image- the graded framemask- a matte of where the streak contribution landed (not your input mask; that trips people up)anamorphic_streaks_info- a string logging the resolved settings and mask coverage, handy for a Text Multiline node if you want the parameters echoed out
The inputs that actually matter
Everything lives in one settings_json string, which is the pack's house style - the widget is JSON, but the node ships a frontend panel that renders sliders over it, so you mostly drag, not type. The ones a beginner sets:
orientation-horizontalfor classic widescreen flare,verticalfor the sci-fi lookthreshold- how bright a pixel has to be to seed a streak; too low and everything smears, too high and you get nothinglength_pxandstrength- the two knobs that decide dramamix- how much of the streak-treated frame replaces the original
The optional mask localizes the effect, with mask_feather and invert_mask handled for you.
Installing
ComfyUI Manager → Install Custom Nodes → search MKRShift Nodes. Or the manual route:
cd ComfyUI/custom_nodes
git clone https://github.com/criskb/MKRShift_Nodes
Then restart ComfyUI. There's no requirements.txt and no model files - it runs on the numpy/PIL/torch ComfyUI already ships.
Where people get burned
- Malformed JSON silently resets to defaults. If you hand-edit
settings_jsonand break the parse, the node catches it and falls back to the default settings rather than erroring. That means a typo can flip your look off with no error message. If the panel isn't showing, that's the first suspect. - The mask output is the streak matte, not the mask you fed in. Wire the
maskoutput into a compositor expecting "where did this do work" and you're correct; wire it somewhere expecting your original region and you'll be confused. - It's CPU-only, so on big video batches every frame pays a NumPy cost. Fine for finishing one frame or a short clip; not your per-frame VFX pipe for long renders.
Bright practicals, neon, and emissive plates are where it shines - dim, flat footage just doesn't have the highlights to seed from.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| settings_json | STRING | {"orientation":"horizontal","threshold":0.74,"softness":0.1,"length_px":48.0,"strength":0.75,"core_boost":1.0,"tail_softness":1.0,"tint_r":0.92,"tint_g":0.86,"tint_b":1.0,"mix":1.0,"mask_feather":10.0,"invert_mask":false} | — |
| maskopt | MASK | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |
| anamorphic_streaks_info | STRING | — |