SD _ComfyUI

001. Comfy Cloud - Fashion Editorial Shots templates / NanoBananaPro API node 그리고 그 외 노드 정리

cat8claw8 2026. 1. 19. 00:58

 

로컬 컴피는 내 컴퓨터 사양이 도저히 감당을 못해서, 

결국 20 달러 한화로 현재 30,103원 결제 하고 클라우드 이용 하였다. 

뭐 이런 천국 같으면서 지옥같은 게 있을까. 

매 달 돈을 갖다 바치면 머리 끙끙 싸매지 않아도 되는 노드가 바로 생성되고 기다리는 시간도 없이 렌더가 된다니, 근데 이 기능이 매번 업데이트가 되니까 무서울 지경이다. 

 

어쨋든  하루 하루 시도해 본 것들을 정리하고 좀 내 껄로 만들고 싶어서...기록해 보려고 한다. 

 

 

 

 

 

1. templates - 2x2_grid character_bg_product 

 

먼저 시도해 본 작업들 

작업 파이프라인 과정은 다음과 같다. 

주목해서 본 키워드로 떠오르는 이미지 서치  > 이미지를 수집 > 모아진 이미지들 중 위의 템플릿 키워드에 맞게 이미지를 넣고 API를 이용해서 (Nano banana)크래딧 소요가 큰 노드다.. > 4개의 만들어진 이미지를 조합 후 업스케일링  

 

 

 

이번 키워드는 'Unapologetic Self' 

고른 이유는 앞으로 시끄럽고 너무 빠른 세상에서 살아남으려면 필요한 태도인거 같아서 골랐다. 뭐 대충 여러 사이트를 접속해서 읽다가 낚시한 단어. 

이 때 떠오른 이미지는 리한나가 superbowl에서 임신 상태임에도 짱 멋지게 무대한 장면에서의 그 무대 느낌..?, 제5원소의 여주인공, 명상 하며 자기 수양하는 삶, 다도, 고요하고 차분하지만 내 갈 길은 휘청거리지 않고 간다. 의심없이? 와 같은....

 

 

그래서 이미지는 다음과 같다.

 

 

캐릭터 배경 상품

 

 

1. 이미지의 변경 없이 사이즈만 변경하고 구도를 보존한 채 패딩을 채우고 BatchImage로 이미지를 묶는다.

첫번째 단계 - Batch Images로 연결 : 위의 3개의 load image들이 이렇게 연결 되어있다.

 

위의 사진들이 Get Image Size - ResizeAndPadImage로 연결 된 후 그 이미지가 각각 Batch Image로 연결 / 왜 이렇게 되어 있는지 몰라서 찾아보고자 한다. 

 Get Image Size core node Returns width and height of the image, and passes it through unchanged. 이미지의 너비와 높이를 반환하고, 이미지는 변경 없이 그대로 전달한다
ResizeAndPadImage   이미지를 지정한 해상도로 맞추되, 원본 비율(aspect ratio)은 유지하고 남는 공간은 패딩(padding)으로 채우는 노드 
    • 입력 이미지의 가로·세로 비율을 계산
    • 목표 Width / Height 안에 최대한 크게 맞게 리사이즈
    • 목표 해상도에서 남는 영역을
      • 위·아래 또는
      • 좌·우에
        패딩으로 채움
    • 최종 출력 이미지 해상도는 무조건 지정한 Width × Height

ResizeAndPadImage (이 노드)

    • 구도 보존
    • 영상·광고·패션 컷에 안정적
BatchImage  

이 노드가 하는 정확한 역할

1️⃣ 여러 장의 이미지를 하나로 묶음

  • Image A
  • Image B
  • Image C
⬇️
  • Batch(Image A, B, C)
이렇게 되면 이후 노드는
👉 “이미지 3장을 동시에 처리”하게 됨

2️⃣ 배치 단위 연산을 가능하게 함

배치를 이해하는 노드들은:
  • 리사이즈
  • ControlNet
  • IP-Adapter
  • VAE Encode / Decode
  • Save Image
등을 한 번에 여러 장 처리함

❌ 그냥 여러 번 돌리면 안 되나?

물론 가능해.
하지만 문제는:

  • 워크플로우 복잡해짐
  • 동일 설정 유지가 어려움
  • ControlNet / IPAdapter에서 일관성 붕괴

✅ Batch를 쓰면

  • 같은 조건
  • 같은 시드 구조
  • 같은 모델
한 묶음 결과를 안정적으로 뽑을 수 있어.

⚠️ 해상도는 반드시 같아야 함

Batch로 묶인 이미지들은:
  • Width
  • Height
  • Channels
완전히 동일해야 함
그래서 보통:
이 순서가 정석이야.

 

 

2. Nano Banana Pro

두번째 단계 - nano banna pro API 프롬프트로 연결됨. 기본 프롬프트는 다음과 같이 작성되어 있었음.

Generate a 2x2 (2 rows, 2 cols) grid.

Divide the frame in 4 different 16:9 frames.

Fashion editorial photoshoot of the model from image 1 in the scene from image 2. The character is showcasing the product from image 3. No visible margin or borders between grid images.

For each frame choose the angle and type of shot, ensure the character and product are visible in each frame, seamlessly interacting.

 

Nano Banana Pro 모델 API
  • 프롬프트를 Vertex API로 전송
  • Nano Banana Pro가 이미지 생성
  • 결과 이미지를 ComfyUI IMAGE 타입으로 반환
👉 일반 SD 샘플러 대신 쓰는 외부 생성 엔진

✅ 1. “정확한 수정”이 필요할 때

SD Inpaint처럼:
  • 마스크
  • 시드 튜닝
  • 노이즈 조절
이런 거 안 하고도:
같은 지시가 잘 먹힘.

*Vertex API란 ? “ Google이 관리하는,월 사용료 내고 쓰는 프리미엄 AI 렌더팜” / Google 서버에서 돌아가는 Gemini 이미지 모델을 외부 프로그램(ComfyUI 포함)이 쓰게 해 주는 공식 호출 창구

 

 

 

결과 

 

 

위의 이미지를 이제 4개롤 쪼개고 (유지 한 채) 그 뒤에 디테일 추가함. 

 

 

3. Crop image / (복잡함)

4장의 합쳐진 이미지를 각각 4개의 단일 이미지로 변환 / 2X2구성된 이미지를 크롭으로 짜르고 각 이미지의 인물들이 동일하게 중심에 올 수 있도록 만들어줌. 그리고 각각의 해상도와 사이즈를 동일하게 맞춘 조건으로 생성

 

이 블록의 전체 목적 (한 문장)

한 장의 큰 이미지를
2×2 위치 기준으로 각각 잘라서
4개의 IMAGE로 만든 뒤
다시 하나의 Batch로 묶는 구간

그리드 크롭 위치를 수학적으로 계산하는 부분 / 이미지의 정중앙을 기준으로 그리드 셀 크기에 맞게 정확한 크롭 좌표를 자동 계산하는 로직

 

1️⃣ Get Image Size — 기준 정보 뽑는 노드

역할

 
입력 이미지 → width / height / batch_size 반환

지금 쓰는 건:

  • width → 이미지 전체 가로 길이
  • height → 이미지 전체 세로 길이

👉 이게 모든 계산의 기준값


2️⃣ WIDTH 노드 (comfyui_essentials)

입력

  • a ← image width
  • b ← (보통 그리드 셀 가로 크기)

수식

 
(a - 2*b) / 2

이 수식이 의미하는 것

이미지를 이렇게 본다고 생각해봐:

 
|---- b ----|---- b ----|---- b ----|
  • 전체 폭 = a
  • 양쪽에서 b씩 두 번을 고려
  • 남은 공간을 양쪽으로 반 나눔

👉 결과:

좌우 중앙 정렬을 위한 X 오프셋

즉:

  • “이 셀을 이미지 중앙에 오게 하려면
    왼쪽에서 얼마나 떨어져야 하냐”

3️⃣ HEIGHT 노드 (comfyui_essentials)

입력

  • a ← image height
  • b ← (그리드 셀 세로 크기)

수식

 
(a - 2*b) / 2

WIDTH랑 완전히 같은 구조인데,
이번엔 세로(Y축) 계산.

👉 결과:

상하 중앙 정렬을 위한 Y 오프셋


4️⃣ Crop Inset Grid Images Value 노드

역할

 
값을 INT로 확정해서 넘겨주는 중간 노드
  • a → 위에서 계산된 값
  • value = a

왜 이게 있냐면:

  • Crop Insert Grid Image는
    INT 타입 좌표를 요구함
  • 계산 노드는 FLOAT를 뱉는 경우가 많음

👉 타입 안정화용 노드


5️⃣ 전체 흐름을 한 문장으로 요약하면

 
이미지 전체 크기에서 그리드 셀 크기를 기준으로 중앙에 딱 맞게 들어가도록 x, y 크롭 시작 좌표를 계산한다

6️⃣ 왜 (a - 2*b) / 2 이냐? (직관적으로)

예를 들어:

  • 이미지 width = 4000
  • 셀 width = 1000

계산:

 
(4000 - 2000) / 2 = 1000

의미:

  • 왼쪽에서 1000px 떨어진 지점부터
  • 셀 2개 폭을 기준으로
  • 중앙 정렬

👉 그리드가 이미지 한가운데 오도록 하는 공식


7️⃣ 이게 Crop Insert Grid Image와 연결되는 이유

Crop Insert Grid Image는 내부적으로:

  • “각 셀을 어디서부터 자를지”
  • “얼마나 자를지”

숫자로 받아야 함.

이 블록은:

“그 숫자를 자동 계산해 주는 계산기”


8️⃣ 이 구조의 장점 (실무적으로 중요)

  • 해상도 바뀌어도 OK
  • 4K → 6K → 세로 이미지 전부 대응
  • 얼굴 잘림 사고 줄어듦
  • 프롬프트에 “중앙” 같은 말 안 써도 됨

 





2×2 그리드용 좌표를 실제로 써서 이미지를 4등분 → 다시 묶는 핵심 구간

 

1️⃣ Col 1 – X val / Col 2 – X val

(가로 위치 계산)

● Col 1 – X val

 
value = b / 2

의미:

  • 첫 번째 컬럼(왼쪽)의 X 시작 위치
  • 왼쪽에서 반 셀만큼 이동

👉 셀 중앙 기준 정렬용


● Col 2 – X val

 
value = a + (b / 2)

의미:

  • 두 번째 컬럼(오른쪽)의 X 시작 위치
  • 첫 셀 폭(a) + 반 셀(b/2)

👉 오른쪽 셀의 중앙 기준 위치


📌 정리하면:

  • Col 1 = 왼쪽 칸 X
  • Col 2 = 오른쪽 칸 X

2️⃣ Row 2 – Y val

(세로 위치 계산)

 
value = a + (b / 2)
  • 첫 줄(Row 1)은 Y = b/2
  • 두 번째 줄(Row 2)은
    → 첫 셀 높이(a) + 반 셀(b/2)

👉 상 / 하 행 위치 분리


3️⃣ Crop Image 노드들 (1, 2, 3, 4)

각 Crop Image는:

번호위치
1 좌상
2 우상
3 좌하
4 우하

입력 값

  • image → 원본 이미지
  • width / height → 셀 크기
  • x / y → 위에서 계산한 좌표

👉 정확한 사분면 크롭


4️⃣ Preview Image 노드

  • 잘린 결과를 눈으로 확인
  • 디버깅용

📌 결과 어긋나면:

  • X/Y 계산식부터 확인

5️⃣ Image Batch Multi (comfyui-kjnodes)

역할

IMAGE_1 ~ IMAGE_4 를
하나의 Batch IMAGE로 묶는다

  • inputcount = 4
  • 순서가 곧 그리드 순서

👉 Crop Insert Grid Image가 기대하는 구조


6️⃣ Resize Images 노드

왜 여기서 리사이즈?

  • 크롭된 4장 이미지
  • 셀 크기 정확히 통일
  • divisible_by = 2
    • 모델/후처리 안전성

👉 최종 그리드 품질 안정화


7️⃣ 이 구조를 왜 이렇게 복잡하게 만드냐?

이유 3가지

  1. 해상도 독립
    • 4K / 6K / 세로 전부 대응
  2. 중앙 기준 크롭
    • 얼굴, 제품 잘림 최소화
  3. AI에 그리드 맡기지 않음
    • AI는 컷만 생성
    • 레이아웃은 툴이 책임

 

 

 

 

 

결과 

 

 

이제 위의 이미지에서 한 장을 선택하고 디테일을 추가하는 단계를 밟음

 

4. 여러 장의 이미지에서 한 장만 선택 할 수 있는 노드

1️⃣ IMAGE (Batch 입력)

왼쪽 위의 image 포트:

  • 앞에서 만든 Image Batch Multi 결과
  • 내부적으로는:이런 배열 구조
  •  
    [IMAGE_0, IMAGE_1, IMAGE_2, IMAGE_3]

📌 중요

  • ComfyUI 내부 인덱스는 0부터 시작

2️⃣ Select Image Number

설정값

 
value = 1 control after generate = fixed

의미

  • 사용자가 보고 싶은 이미지 번호
  • 사람이 이해하기 쉬운 방식:
  •  
    1 = 첫 번째 2 = 두 번째 3 = 세 번째

👉 하지만 이 값은 그대로 쓰면 안 됨 (이유는 아래)


3️⃣ Image # as index (comfyui_essentials)

수식

 
value = a - 1

왜 이게 필요하냐?

사용자 입력실제 batch_index
1 0
2 1
3 2
4 3

📌 사람 친화적 입력 → 컴퓨터 친화적 인덱스 변환

이 노드가 없으면:

  • 1 입력했는데 두 번째 이미지가 나오는 사고 발생

4️⃣ ImageFromBatch 노드

입력

  • image → 전체 Batch
  • batch_index → 계산된 인덱스
  • length = 1

역할

Batch에서 해당 인덱스의 이미지 하나만 꺼냄

결과:

  • 출력은 단일 IMAGE
  • 더 이상 batch 아님

5️⃣ 오른쪽 IMAGE 출력

이제 이 이미지는:

  • 단일 이미지 노드들과 자유롭게 연결 가능
  • 다시 crop / resize / save 가능

이 구조를 왜 이렇게 만들었을까?

이유 4가지

  1. 슬라이더로 이미지 선택 가능
  2. 워크플로 재생성 없이 미리보기 전환
  3. Batch 구조 깨지지 않음
  4. 다중 그리드 / 반복 생성 대응

 

 

5. NanoBananaPro  :  디테일 추가해서 마지막 이미지 만들어 본다.

선택한 이미지를 고르고 그 이미지에서 3가지 이미지 중 더 돋보이거나 추가하거나 삭제하거나 등등의 이야기를 넣음.

 

 

Upscale image 1 while maintaining pose and composition, add subtle details. Use the product from image 2 to add back details to the product.

 

결과 (After)

 

 

(Before)

 

 

이게 이 템플릿의 끝임......

 

 

 

 

 

 

 

 

근데 난 이 최종 이미지가 조금 아쉬웠음. 가루 날리는 디테일이 추가되는 건 좋았는데, 뒤에 좀 어색하게 product가 추가 된 거 같아서 수정 하였다. 

 

수정법은 Flux inpaint mask

 

<Flux fill inpaint example>

 

 

1. 아까 만든 이미지를 불러와서 mask로 지우고 싶은 부분 선택
2. 그 다음 이렇게 생긴 파라미터 노드가 연결 되는데 이걸 뜯어보면......다음과 같다.
3. 이게 무엇인가.

 

0️⃣ 이 그래프의 목적 (핵심 한 줄)

마스크로 지정한 영역만 “지우거나(delete)” 새로 다시 그리되,
Flux 모델 특유의 디테일 유지 + 안정적인 인페인팅을 하려는 구조


1️⃣ 전체 구조 한 번에 보기

 
[Flux 모델 로드] ↓ Differential Diffusion ↓ KSampler ↓ VAE Decode

그리고 중간에 Inpainting 전용 Conditioning 경로가 끼어 있음


2️⃣ Load models 블록

🔹 Load Diffusion Model

  • flux1-fill-dev.safetensors
  • Fill / Inpainting 전용 Flux 모델
  • “지우고 다시 채우기”에 최적화

🔹 DualCLIPLoader

  • clip_l.safetensors
  • t5xxl_fp16.safetensors
  • Flux는 CLIP + T5 둘 다 씀
  • 텍스트 이해력 ↑

🔹 Load VAE

  • ae.safetensors
  • latent ↔ image 변환용

📌 여기까지는 Flux 기본 세팅


3️⃣ Differential Diffusion [BETA]

역할

마스크 영역과 비마스크 영역의 확산 강도를 다르게 처리

왜 필요?

일반 인페인트 문제:

  • 마스크 안만 바꾸고 싶은데
  • 주변까지 같이 흐트러짐

👉 Differential Diffusion은:

  • 마스크 내부 = 적극적으로 새로 그림
  • 외부 = 최대한 고정

주요 파라미터

  • strength = 1.00
    • 1.0 = 완전 활성
    • 낮추면 효과 약해짐

📌 Flux + Inpaint에서는 거의 필수 노드


4️⃣ Prompt 블록 (텍스트 컨디셔닝)

🔹 CLIP Text Encode (Positive)

 
delete the masked image.

이 문장의 의미:

  • “마스크된 영역은 기존 내용을 유지하지 말고 제거해라”
  • 무(無)에서 다시 생성하라는 신호

👉 보통:

  • object 제거
  • 사람 삭제
  • 배경 정리할 때 사용

5️⃣ FluxGuidance

역할

Flux 전용 CFG 컨트롤

 
guidance = 30.0

Flux는:

  • KSampler의 cfg(1.0) 대신
  • FluxGuidance에서 사실상 프롬프트 강도를 제어

📌 Flux에서는:

  • KSampler cfg는 거의 의미 없음
  • Guidance가 진짜 CFG

6️⃣ ConditioningZeroOut

이 노드가 중요한 이유 ⚠️

역할

negative conditioning을 “완전 무시”

Flux + Inpaint에서:

  • 네거티브 프롬프트가
  • 오히려 결과를 망치는 경우 많음

그래서:

  • negative를 0으로 만들어버림

📌 이거 없으면:

  • “왜 인페인트가 이상하지?” 자주 발생

7️⃣ InpaintModelConditioning (핵심 노드)

이 그래프의 진짜 중심

입력

  • positive → Flux prompt
  • negative → ZeroOut된 conditioning
  • pixels → 원본 이미지
  • mask → 인페인트 마스크
  • vae → 디코딩용

옵션

 
noise_mask = true

역할

“이 이미지의 이 마스크 영역만 다시 그려라”를
모델이 이해할 수 있게 번역

📌 이 노드가 하는 일:

  • 이미지 → latent
  • 마스크 영역만 노이즈 주입
  • 나머지 영역은 고정

8️⃣ KSampler

주요 설정

항목값의미
seed randomize 매번 다르게
steps 20 Flux 기준 적당
cfg 1.0 (사실상 무시)
sampler euler 안정
denoise 1.0 완전 재생성

📌 Flux + Inpaint 조합에서는
denoise 1.0이 기본


9️⃣ VAE Decode

  • latent → 최종 이미지

🔑 이 그래프의 핵심 포인트 5가지

1️⃣ Flux Fill 모델은 일반 SD 인페인트와 다르게 동작
2️⃣ Differential Diffusion은 마스크 외부 보호용
3️⃣ FluxGuidance가 진짜 CFG
4️⃣ ConditioningZeroOut은 안정화용 필수
5️⃣ InpaintModelConditioning이 마스크 인페인트의 본체


한 문장 요약

이 노드는
“Flux Fill 모델로 마스크 영역만 완전히 지우고,
주변은 건드리지 않은 채 고퀄리티로 다시 그리기 위한
안정형 인페인팅 파이프라인”이다



 

 

 

결과