ComfyUI/blueprints/Color Balance.json
linmoumou 8bf520295e Add description field to all blueprint subgraphs
Sets the 'description' field on every subgraph blueprint node,
which will show on the node preview and tooltip. Covers all 51
blueprint files under blueprints/.
2026-05-09 10:40:42 +08:00

1137 lines
30 KiB
JSON

{
"revision": 0,
"last_node_id": 20,
"last_link_id": 0,
"nodes": [
{
"id": 20,
"type": "243b9e93-7303-4500-8c70-58acb712f5bc",
"pos": [
3610,
-2630
],
"size": [
270,
420
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [
{
"label": "image",
"localized_name": "images.image0",
"name": "images.image0",
"type": "IMAGE",
"link": null
}
],
"outputs": [
{
"label": "IMAGE",
"localized_name": "IMAGE0",
"name": "IMAGE0",
"type": "IMAGE",
"links": []
}
],
"properties": {
"proxyWidgets": [
[
"4",
"value"
],
[
"5",
"value"
],
[
"6",
"value"
],
[
"7",
"value"
],
[
"8",
"value"
],
[
"9",
"value"
],
[
"10",
"value"
],
[
"11",
"value"
],
[
"12",
"value"
],
[
"13",
"value"
]
]
},
"widgets_values": [],
"title": "Color Balance"
}
],
"links": [],
"version": 0.4,
"definitions": {
"subgraphs": [
{
"id": "243b9e93-7303-4500-8c70-58acb712f5bc",
"version": 1,
"state": {
"lastGroupId": 0,
"lastNodeId": 15,
"lastLinkId": 39,
"lastRerouteId": 0
},
"revision": 0,
"config": {},
"name": "Color Balance",
"inputNode": {
"id": -10,
"bounding": [
2660,
-4500,
120,
60
]
},
"outputNode": {
"id": -20,
"bounding": [
4270,
-4500,
120,
60
]
},
"inputs": [
{
"id": "d24c0b6d-00bd-4e95-be80-8114e8376ec0",
"name": "images.image0",
"type": "IMAGE",
"linkIds": [
29
],
"localized_name": "images.image0",
"label": "image",
"pos": [
2760,
-4480
]
}
],
"outputs": [
{
"id": "92723f62-996e-496d-ad4f-81a38be4ad64",
"name": "IMAGE0",
"type": "IMAGE",
"linkIds": [
28
],
"localized_name": "IMAGE0",
"label": "IMAGE",
"pos": [
4290,
-4480
]
}
],
"widgets": [],
"nodes": [
{
"id": 4,
"type": "PrimitiveFloat",
"pos": [
3060,
-4500
],
"size": [
270,
58
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [
{
"label": "shadows red",
"localized_name": "value",
"name": "value",
"type": "FLOAT",
"widget": {
"name": "value"
},
"link": null
}
],
"outputs": [
{
"localized_name": "FLOAT",
"name": "FLOAT",
"type": "FLOAT",
"links": [
30
]
}
],
"title": "Shadows Red",
"properties": {
"Node name for S&R": "PrimitiveFloat",
"max": 100,
"min": -100,
"step": 1,
"display": "gradientslider",
"gradient_stops": [
{
"offset": 0,
"color": [
0,
255,
255
]
},
{
"offset": 0.5,
"color": [
128,
128,
128
]
},
{
"offset": 1,
"color": [
255,
0,
0
]
}
]
},
"widgets_values": [
0
]
},
{
"id": 5,
"type": "PrimitiveFloat",
"pos": [
3060,
-4390
],
"size": [
270,
58
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [
{
"label": "shadows green",
"localized_name": "value",
"name": "value",
"type": "FLOAT",
"widget": {
"name": "value"
},
"link": null
}
],
"outputs": [
{
"localized_name": "FLOAT",
"name": "FLOAT",
"type": "FLOAT",
"links": [
31
]
}
],
"title": "Shadows Green",
"properties": {
"Node name for S&R": "PrimitiveFloat",
"max": 100,
"min": -100,
"step": 1,
"display": "gradientslider",
"gradient_stops": [
{
"offset": 0,
"color": [
255,
0,
255
]
},
{
"offset": 0.5,
"color": [
128,
128,
128
]
},
{
"offset": 1,
"color": [
0,
255,
0
]
}
]
},
"widgets_values": [
0
]
},
{
"id": 6,
"type": "PrimitiveFloat",
"pos": [
3060,
-4280
],
"size": [
270,
58
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [
{
"label": "shadows blue",
"localized_name": "value",
"name": "value",
"type": "FLOAT",
"widget": {
"name": "value"
},
"link": null
}
],
"outputs": [
{
"localized_name": "FLOAT",
"name": "FLOAT",
"type": "FLOAT",
"links": [
32
]
}
],
"title": "Shadows Blue",
"properties": {
"Node name for S&R": "PrimitiveFloat",
"max": 100,
"min": -100,
"step": 1,
"display": "gradientslider",
"gradient_stops": [
{
"offset": 0,
"color": [
255,
255,
0
]
},
{
"offset": 0.5,
"color": [
128,
128,
128
]
},
{
"offset": 1,
"color": [
0,
0,
255
]
}
]
},
"widgets_values": [
0
]
},
{
"id": 7,
"type": "PrimitiveFloat",
"pos": [
3060,
-4170
],
"size": [
270,
58
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [
{
"label": "midtones red",
"localized_name": "value",
"name": "value",
"type": "FLOAT",
"widget": {
"name": "value"
},
"link": null
}
],
"outputs": [
{
"localized_name": "FLOAT",
"name": "FLOAT",
"type": "FLOAT",
"links": [
33
]
}
],
"title": "Midtones Red",
"properties": {
"Node name for S&R": "PrimitiveFloat",
"max": 100,
"min": -100,
"step": 1,
"display": "gradientslider",
"gradient_stops": [
{
"offset": 0,
"color": [
0,
255,
255
]
},
{
"offset": 0.5,
"color": [
128,
128,
128
]
},
{
"offset": 1,
"color": [
255,
0,
0
]
}
]
},
"widgets_values": [
0
]
},
{
"id": 8,
"type": "PrimitiveFloat",
"pos": [
3060,
-4060
],
"size": [
270,
58
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [
{
"label": "midtones green",
"localized_name": "value",
"name": "value",
"type": "FLOAT",
"widget": {
"name": "value"
},
"link": null
}
],
"outputs": [
{
"localized_name": "FLOAT",
"name": "FLOAT",
"type": "FLOAT",
"links": [
34
]
}
],
"title": "Midtones Green",
"properties": {
"Node name for S&R": "PrimitiveFloat",
"max": 100,
"min": -100,
"step": 1,
"display": "gradientslider",
"gradient_stops": [
{
"offset": 0,
"color": [
255,
0,
255
]
},
{
"offset": 0.5,
"color": [
128,
128,
128
]
},
{
"offset": 1,
"color": [
0,
255,
0
]
}
]
},
"widgets_values": [
0
]
},
{
"id": 9,
"type": "PrimitiveFloat",
"pos": [
3060,
-3950
],
"size": [
270,
58
],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [
{
"label": "midtones blue",
"localized_name": "value",
"name": "value",
"type": "FLOAT",
"widget": {
"name": "value"
},
"link": null
}
],
"outputs": [
{
"localized_name": "FLOAT",
"name": "FLOAT",
"type": "FLOAT",
"links": [
35
]
}
],
"title": "Midtones Blue",
"properties": {
"Node name for S&R": "PrimitiveFloat",
"max": 100,
"min": -100,
"step": 1,
"display": "gradientslider",
"gradient_stops": [
{
"offset": 0,
"color": [
255,
255,
0
]
},
{
"offset": 0.5,
"color": [
128,
128,
128
]
},
{
"offset": 1,
"color": [
0,
0,
255
]
}
]
},
"widgets_values": [
0
]
},
{
"id": 10,
"type": "PrimitiveFloat",
"pos": [
3060,
-3840
],
"size": [
270,
58
],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [
{
"label": "highlights red",
"localized_name": "value",
"name": "value",
"type": "FLOAT",
"widget": {
"name": "value"
},
"link": null
}
],
"outputs": [
{
"localized_name": "FLOAT",
"name": "FLOAT",
"type": "FLOAT",
"links": [
36
]
}
],
"title": "Highlights Red",
"properties": {
"Node name for S&R": "PrimitiveFloat",
"max": 100,
"min": -100,
"step": 1,
"display": "gradientslider",
"gradient_stops": [
{
"offset": 0,
"color": [
0,
255,
255
]
},
{
"offset": 0.5,
"color": [
128,
128,
128
]
},
{
"offset": 1,
"color": [
255,
0,
0
]
}
]
},
"widgets_values": [
0
]
},
{
"id": 11,
"type": "PrimitiveFloat",
"pos": [
3060,
-3730
],
"size": [
270,
58
],
"flags": {},
"order": 7,
"mode": 0,
"inputs": [
{
"label": "highlights green",
"localized_name": "value",
"name": "value",
"type": "FLOAT",
"widget": {
"name": "value"
},
"link": null
}
],
"outputs": [
{
"localized_name": "FLOAT",
"name": "FLOAT",
"type": "FLOAT",
"links": [
37
]
}
],
"title": "Highlights Green",
"properties": {
"Node name for S&R": "PrimitiveFloat",
"max": 100,
"min": -100,
"step": 1,
"display": "gradientslider",
"gradient_stops": [
{
"offset": 0,
"color": [
255,
0,
255
]
},
{
"offset": 0.5,
"color": [
128,
128,
128
]
},
{
"offset": 1,
"color": [
0,
255,
0
]
}
]
},
"widgets_values": [
0
]
},
{
"id": 12,
"type": "PrimitiveFloat",
"pos": [
3060,
-3620
],
"size": [
270,
58
],
"flags": {},
"order": 8,
"mode": 0,
"inputs": [
{
"label": "highlights blue",
"localized_name": "value",
"name": "value",
"type": "FLOAT",
"widget": {
"name": "value"
},
"link": null
}
],
"outputs": [
{
"localized_name": "FLOAT",
"name": "FLOAT",
"type": "FLOAT",
"links": [
38
]
}
],
"title": "Highlights Blue",
"properties": {
"Node name for S&R": "PrimitiveFloat",
"max": 100,
"min": -100,
"step": 1,
"display": "gradientslider",
"gradient_stops": [
{
"offset": 0,
"color": [
255,
255,
0
]
},
{
"offset": 0.5,
"color": [
128,
128,
128
]
},
{
"offset": 1,
"color": [
0,
0,
255
]
}
]
},
"widgets_values": [
0
]
},
{
"id": 13,
"type": "PrimitiveBoolean",
"pos": [
3060,
-3510
],
"size": [
270,
58
],
"flags": {},
"order": 9,
"mode": 0,
"inputs": [
{
"label": "preserve luminosity",
"localized_name": "value",
"name": "value",
"type": "BOOLEAN",
"widget": {
"name": "value"
},
"link": null
}
],
"outputs": [
{
"localized_name": "BOOLEAN",
"name": "BOOLEAN",
"type": "BOOLEAN",
"links": [
39
]
}
],
"title": "Preserve Luminosity",
"properties": {
"Node name for S&R": "PrimitiveBoolean"
},
"widgets_values": [
true
]
},
{
"id": 15,
"type": "GLSLShader",
"pos": [
3590,
-4500
],
"size": [
420,
500
],
"flags": {},
"order": 10,
"mode": 0,
"inputs": [
{
"label": "image0",
"localized_name": "images.image0",
"name": "images.image0",
"type": "IMAGE",
"link": 29
},
{
"label": "image1",
"localized_name": "images.image1",
"name": "images.image1",
"shape": 7,
"type": "IMAGE",
"link": null
},
{
"label": "u_float0",
"localized_name": "floats.u_float0",
"name": "floats.u_float0",
"shape": 7,
"type": "FLOAT",
"link": 30
},
{
"label": "u_float1",
"localized_name": "floats.u_float1",
"name": "floats.u_float1",
"shape": 7,
"type": "FLOAT",
"link": 31
},
{
"label": "u_float2",
"localized_name": "floats.u_float2",
"name": "floats.u_float2",
"shape": 7,
"type": "FLOAT",
"link": 32
},
{
"label": "u_float3",
"localized_name": "floats.u_float3",
"name": "floats.u_float3",
"shape": 7,
"type": "FLOAT",
"link": 33
},
{
"label": "u_float4",
"localized_name": "floats.u_float4",
"name": "floats.u_float4",
"shape": 7,
"type": "FLOAT",
"link": 34
},
{
"label": "u_float5",
"localized_name": "floats.u_float5",
"name": "floats.u_float5",
"shape": 7,
"type": "FLOAT",
"link": 35
},
{
"label": "u_float6",
"localized_name": "floats.u_float6",
"name": "floats.u_float6",
"shape": 7,
"type": "FLOAT",
"link": 36
},
{
"label": "u_float7",
"localized_name": "floats.u_float7",
"name": "floats.u_float7",
"shape": 7,
"type": "FLOAT",
"link": 37
},
{
"label": "u_float8",
"localized_name": "floats.u_float8",
"name": "floats.u_float8",
"shape": 7,
"type": "FLOAT",
"link": 38
},
{
"label": "u_bool0",
"localized_name": "bools.u_bool0",
"name": "bools.u_bool0",
"shape": 7,
"type": "BOOLEAN",
"link": 39
},
{
"localized_name": "fragment_shader",
"name": "fragment_shader",
"type": "STRING",
"widget": {
"name": "fragment_shader"
},
"link": null
},
{
"localized_name": "size_mode",
"name": "size_mode",
"type": "COMFY_DYNAMICCOMBO_V3",
"widget": {
"name": "size_mode"
},
"link": null
}
],
"outputs": [
{
"localized_name": "IMAGE0",
"name": "IMAGE0",
"type": "IMAGE",
"links": [
28
]
},
{
"localized_name": "IMAGE1",
"name": "IMAGE1",
"type": "IMAGE",
"links": null
},
{
"localized_name": "IMAGE2",
"name": "IMAGE2",
"type": "IMAGE",
"links": null
},
{
"localized_name": "IMAGE3",
"name": "IMAGE3",
"type": "IMAGE",
"links": null
}
],
"properties": {
"Node name for S&R": "GLSLShader"
},
"widgets_values": [
"#version 300 es\nprecision highp float;\n\nuniform sampler2D u_image0;\nuniform float u_float0; // shadows red (-100 to 100)\nuniform float u_float1; // shadows green (-100 to 100)\nuniform float u_float2; // shadows blue (-100 to 100)\nuniform float u_float3; // midtones red (-100 to 100)\nuniform float u_float4; // midtones green (-100 to 100)\nuniform float u_float5; // midtones blue (-100 to 100)\nuniform float u_float6; // highlights red (-100 to 100)\nuniform float u_float7; // highlights green (-100 to 100)\nuniform float u_float8; // highlights blue (-100 to 100)\nuniform bool u_bool0; // preserve luminosity\n\nin vec2 v_texCoord;\nout vec4 fragColor;\n\nvec3 rgb2hsl(vec3 c) {\n float maxC = max(c.r, max(c.g, c.b));\n float minC = min(c.r, min(c.g, c.b));\n float l = (maxC + minC) * 0.5;\n if (maxC == minC) return vec3(0.0, 0.0, l);\n float d = maxC - minC;\n float s = l > 0.5 ? d / (2.0 - maxC - minC) : d / (maxC + minC);\n float h;\n if (maxC == c.r) {\n h = (c.g - c.b) / d + (c.g < c.b ? 6.0 : 0.0);\n } else if (maxC == c.g) {\n h = (c.b - c.r) / d + 2.0;\n } else {\n h = (c.r - c.g) / d + 4.0;\n }\n h /= 6.0;\n return vec3(h, s, l);\n}\n\nfloat hue2rgb(float p, float q, float t) {\n if (t < 0.0) t += 1.0;\n if (t > 1.0) t -= 1.0;\n if (t < 1.0 / 6.0) return p + (q - p) * 6.0 * t;\n if (t < 1.0 / 2.0) return q;\n if (t < 2.0 / 3.0) return p + (q - p) * (2.0 / 3.0 - t) * 6.0;\n return p;\n}\n\nvec3 hsl2rgb(vec3 hsl) {\n float h = hsl.x, s = hsl.y, l = hsl.z;\n if (s == 0.0) return vec3(l);\n float q = l < 0.5 ? l * (1.0 + s) : l + s - l * s;\n float p = 2.0 * l - q;\n return vec3(\n hue2rgb(p, q, h + 1.0 / 3.0),\n hue2rgb(p, q, h),\n hue2rgb(p, q, h - 1.0 / 3.0)\n );\n}\n\nvoid main() {\n vec4 tex = texture(u_image0, v_texCoord);\n vec3 color = tex.rgb;\n\n // Build shadows/midtones/highlights vectors (scale -100..100 to -1..1)\n vec3 shadows = vec3(u_float0, u_float1, u_float2) * 0.01;\n vec3 midtones = vec3(u_float3, u_float4, u_float5) * 0.01;\n vec3 highlights = vec3(u_float6, u_float7, u_float8) * 0.01;\n\n // GIMP: HSL lightness for weight calculation\n float maxC = max(color.r, max(color.g, color.b));\n float minC = min(color.r, min(color.g, color.b));\n float lightness = (maxC + minC) * 0.5;\n\n // GIMP weight curves: linear ramps with constants a=0.25, b=0.333, scale=0.7\n const float a = 0.25;\n const float b = 0.333;\n const float scale = 0.7;\n\n float sw = clamp((lightness - b) / -a + 0.5, 0.0, 1.0) * scale;\n float mw = clamp((lightness - b) / a + 0.5, 0.0, 1.0) *\n clamp((lightness + b - 1.0) / -a + 0.5, 0.0, 1.0) * scale;\n float hw = clamp((lightness + b - 1.0) / a + 0.5, 0.0, 1.0) * scale;\n\n color += sw * shadows + mw * midtones + hw * highlights;\n\n if (u_bool0) {\n vec3 hsl = rgb2hsl(clamp(color, 0.0, 1.0));\n hsl.z = lightness;\n color = hsl2rgb(hsl);\n }\n\n fragColor = vec4(clamp(color, 0.0, 1.0), tex.a);\n}",
"from_input"
]
}
],
"groups": [],
"links": [
{
"id": 29,
"origin_id": -10,
"origin_slot": 0,
"target_id": 15,
"target_slot": 0,
"type": "IMAGE"
},
{
"id": 28,
"origin_id": 15,
"origin_slot": 0,
"target_id": -20,
"target_slot": 0,
"type": "IMAGE"
},
{
"id": 30,
"origin_id": 4,
"origin_slot": 0,
"target_id": 15,
"target_slot": 2,
"type": "FLOAT"
},
{
"id": 31,
"origin_id": 5,
"origin_slot": 0,
"target_id": 15,
"target_slot": 3,
"type": "FLOAT"
},
{
"id": 32,
"origin_id": 6,
"origin_slot": 0,
"target_id": 15,
"target_slot": 4,
"type": "FLOAT"
},
{
"id": 33,
"origin_id": 7,
"origin_slot": 0,
"target_id": 15,
"target_slot": 5,
"type": "FLOAT"
},
{
"id": 34,
"origin_id": 8,
"origin_slot": 0,
"target_id": 15,
"target_slot": 6,
"type": "FLOAT"
},
{
"id": 35,
"origin_id": 9,
"origin_slot": 0,
"target_id": 15,
"target_slot": 7,
"type": "FLOAT"
},
{
"id": 36,
"origin_id": 10,
"origin_slot": 0,
"target_id": 15,
"target_slot": 8,
"type": "FLOAT"
},
{
"id": 37,
"origin_id": 11,
"origin_slot": 0,
"target_id": 15,
"target_slot": 9,
"type": "FLOAT"
},
{
"id": 38,
"origin_id": 12,
"origin_slot": 0,
"target_id": 15,
"target_slot": 10,
"type": "FLOAT"
},
{
"id": 39,
"origin_id": 13,
"origin_slot": 0,
"target_id": 15,
"target_slot": 11,
"type": "BOOLEAN"
}
],
"extra": {
"workflowRendererVersion": "LG"
},
"category": "Image Tools/Color adjust",
"description": "Balances image colors across shadows, midtones, and highlights."
}
]
}
}