Nodes/ComfyUI-GeN13/Load Image Orient (GeN13)
ComfyUI Node

Load Image Orient (GeN13)

Load Image Orient (GeN13) exists because your iPhone screenshot loads sideways

By heigen13·Created 23 days ago·Updated 11 days ago· 1
Load Image Orient (GeN13)
    • IMAGE
    • MASK
    ◄image▾►

    You drag a screenshot off your phone into ComfyUI, and the woman you're trying to inpaint is lying on her side. Nothing is corrupt, the file opens fine in Preview, and the built-in Load Image node is cheerfully showing it rotated ninety degrees. You re-export it, you re-screenshot it, you rename it. Same result.

    Load Image Orient (GeN13) is a plain image loader with one specific fix: it decodes with Pillow and applies the EXIF orientation tag, and never routes the file through PyAV.

    Why the core node gets it wrong

    ComfyUI's core Load Image was moved onto a PyAV/ffmpeg decode path so it could handle animated and video-ish files. Part of that path reads frame.rotation and rotates accordingly. On Windows, for an iOS-native PNG that carries an eXIf chunk, PyAV reports the wrong rotation - the pack author measured a value of 135 - and the result is your image turned a quarter turn anticlockwise. Pillow's exif_transpose gets the same file right.

    So this isn't a "better loader", it's a compatibility shim with a very narrow job: phone screenshots and phone photos, mostly on Windows. If you don't shoot on iOS, you probably don't need it, and the built-in node is fine.

    What you get

    The widget surface is deliberately identical to core Load Image - one image dropdown of files in input/, with upload and drag-and-drop. That's not laziness, it's so that swapping the node into an existing workflow doesn't shift widget order and break saved layouts on restore. Same field count, same position.

    Outputs:

    • IMAGE - the decoded image. Multi-frame files (GIF, APNG) come out as a batch, with mismatched frames skipped.
    • MASK - inverted alpha: 1 where the image is transparent, all zeros across the full frame when there's no alpha channel. If your screenshots have no transparency (they won't), the mask is a black rectangle and you can ignore it.

    Beyond orientation, the shared decoder in this pack does a couple of sensible things: 16-bit greyscale gets normalised to 0–1, palette images with a transparency entry get a real mask, and cache invalidation uses file path + mtime + size rather than hashing the whole file, so a 40 MB screenshot doesn't cost you anything on a re-queue.

    Installing

    Manager → search GeN13 → install → restart. Manual:

    cd ComfyUI/custom_nodes
    git clone https://github.com/heigen13/ComfyUI-GeN13
    pip install -r ComfyUI-GeN13/requirements.txt
    

    Pillow, numpy and torch are all already in ComfyUI; the only line in the requirements file is nvidia-ml-py, for the pack's resource monitor. Nothing to download, no model files, no Node.js build.

    When it's still sideways

    If the image is still rotated after using this node, the file doesn't contain orientation metadata - it has been physically re-encoded into the wrong orientation by whatever app exported it. That's not fixable at load time; rotate it once in an image editor and save the corrected copy, or put a rotate node downstream.

    And check whether your workflow actually saved the right node. Community workflows mostly use core Load Image, so if you paste a graph from somewhere and the image looks off, you may be looking at a core node you never replaced. Right-click a core Load / Save / Preview Image in this pack and there's a convert-in-place option - it keeps the links and the settings - which is the fast way to swap one loader for the other without re-dragging wires.

    One non-fix worth stating plainly: this node does none of the A1111 parameter reading that Load Image SD does, and Load Image SD uses the same Pillow decoder, so it has the orientation fix too. If you're loading an old A1111 PNG anyway, go straight to that one.

    CategoryGeN13/image

    Inputs (1)

    NameTypeDefaultDescription
    imageCOMBOImage: a file in the input folder; upload or drag and drop to add one.

    Outputs (2)

    NameTypeDescription
    IMAGEIMAGEImage: multi-frame files are output as a batch.
    MASKMASKMask: 1 in transparent areas; all 0 when the image has no alpha channel.