ComfyUI Node

2D Pose Editor

Pose a character by hand in ComfyUI, no OpenPose skeleton required

By ketle-man·Created 6 months ago·Updated 4 months ago· 0
2D Pose Editor
  • background_image
  • image
image_data
output_size_modeStandard
custom_width600
custom_height600

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), or Custom (your own dimensions). This is the one you'll set.
  • custom_width / custom_height - only read in Custom mode; 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 background IMAGE input 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 Node2D Pose2D 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_data is empty and you get a flat #e0e0e0 gray square. Pose first, then queue.
  • Background mode 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 in Custom mode.
  • 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.

Category2D Pose

Inputs (5)

NameTypeDefaultDescription
image_dataSTRING
output_size_modeCOMBOStandard3 options: Standard, Background, Custom
custom_widthINT60064–4096
custom_heightINT60064–4096
background_imageoptIMAGE

Outputs (1)

NameTypeDescription
imageIMAGE