2D Pose Editor
Pose a character by hand in ComfyUI, no OpenPose skeleton required
- background_image
- image
You've probably used the OpenPose Editor dance: place keypoints, hope the skeleton comes out human. The 2D Pose Editor (class PoseEditor2D, from ketle-man/comfyui-2dpose-editor) skips the keypoint step entirely. Instead of drawing a skeleton, you get an actual rigged figure embedded right in the node - drag its joints around like a paper doll, point the eyes, and it hands you a clean IMAGE you can feed into img2img or ControlNet. No models, no API, no key. It's all one little canvas widget.
One thing worth stating up front: it works differently from the OpenPose-Editor lineage - it outputs a rendered figure, not a keypoint map. That's not a bug; it's what makes it good for the job it's aimed at.
How it works
The whole rig lives in the browser. A JavaScript extension (js/pose_editor.js) draws the figure on a canvas - head, chest, arms, hands, legs, feet, plus pupils for eye direction - and lets you drag the white joint dots to rotate bones, the red dashed shoulder/hip lines to slide them, and the background to pan or zoom with the wheel. When you click the 📸 capture button, it serializes the canvas to a base64 PNG and stuffs it into the hidden image_data string input. On the Python side, pose_editor_node.py does almost nothing clever: it base64-decodes that PNG, optionally composites it over your background_image, and converts the result to a (1, H, W, C) float32 torch tensor. That's the entire mechanism - which is why it needs no extra dependencies and no model files.
A subtle detail worth knowing: the output is always rig-free. Older versions had a toggle that leaked the skeleton into the capture; since v0.4.0 the rig hides itself during capture so you get a clean figure every time.
The inputs that matter
Four inputs exist, and you'll realistically touch two of them:
output_size_mode-Standard(canvas render size, 600×600),Background(match the connected background's aspect ratio), orCustom(your own dimensions). This is the one you'll set.custom_width/custom_height- only read inCustommode; 64–4096, stepping by 8.background_image(optional) - a scene or a second character to composite behind the pose. This is also how you stage multiple figures: pose one editor, wire it into a backgroundIMAGEinput on another.image_data- the hidden base64 string. You never set it; the frontend does. It does double duty as the cache-buster, so ComfyUI re-runs the node when your pose changes.
The output is a single image (IMAGE). The natural wiring: straight into an img2img pass with low denoise to turn the flat figure into an actual render, or through a scribble/softedge/canny preprocessor into a ControlNet. The pose-union ControlNets in the KB era all want pose conditioning, and a flat colored figure preprocessed into edges works fine as the spatial guide.
Installation
The painless kind. Either:
cd ComfyUI/custom_nodes
git clone https://github.com/ketle-man/comfyui-2dpose-editor.git
then restart ComfyUI - or search "2D Pose Editor" in ComfyUI Manager's install dialog. That's it. No requirements.txt, no model download, no ComfyUI version pin: it only needs torch, Pillow, and numpy, all of which ship with ComfyUI. This is the rare custom-node install that cannot break your environment - genuinely refreshing, given the usual dependency-conflict horror stories.
Once installed: right-click the canvas → Add Node → 2D Pose → 2D Pose Editor. Drag the white dots, hit Queue Prompt. There's also a P/I toggle that turns the node into a plain image loader (handy for dragging in a reference you then reuse), and a 🖼 Tex button to load a texture atlas if you want to skin the figure with your own character parts - nice for getting the img2img input closer to your actual subject.
Things that'll trip you up
- Blank-ish gray output. If you queue without ever posing,
image_datais empty and you get a flat#e0e0e0gray square. Pose first, then queue. Backgroundmode doing nothing. It only sizes the output from the background when a background is actually connected; no wire, no size change - it silently falls back to Standard. Same if you expect the background to define the frame inCustommode.- Not an OpenPose replacement. No JSON keypoints to feed an openpose ControlNet here - it's a renderer, not a keypoint exporter. Use it for composition, staging, and img2img guidance.
Small, self-contained, and honest about what it is. If you're tired of fighting openpose pose files just to get a character leaning a certain way, this is worth the two minutes it takes to install.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| image_data | STRING | — | |
| output_size_mode | COMBO | Standard | 3 options: Standard, Background, Custom |
| custom_width | INT | 60064–4096 | — |
| custom_height | INT | 60064–4096 | — |
| background_imageopt | IMAGE | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |