이 페이지는
gpt-image-2를 POST /v1/images/edits를 통해 사용하는 로컬 편집(inpainting)에 대한 실습 가이드입니다. image + mask + prompt를 업로드하여 사용합니다. 전체 파라미터 참고 자료와 대화형 Playground는 이미지 편집 API 참고를 확인하십시오.핵심 원리: 알파 채널이 편집 영역을 정의합니다
지역화된 편집 요청은 세 부분으로 구성됩니다:시각적 예시
원본 이미지가 1024×1024라고 가정합니다:마스크는 하드 크롭이 아닙니다
GPT Image 마스크는 Photoshop 선택 영역처럼 절대적인 픽셀 수준 제약이 아닙니다. 공식적으로 마스크 편집은 여전히 프롬프트 유도 편집입니다. 즉, 모델은 마스크를 참조로 사용하지만 모든 픽셀 경계를 엄격하게 준수한다고 보장하지는 않습니다. 따라서 다음과 같은 현상이 나타날 수 있습니다:- 마스크 바깥의 미세한 그림자 변화
- 마스크를 넘어서는 객체 가장자리
- 조명과 반사 변화의 연동
- 배경의 미세한 다시 칠하기
- 마스크 경계 부근의 전이 효과
편집 안정성 향상
그냥 “빨간 셔츠로 바꿔 주세요”라고만 쓰지 마십시오. 대신 다음처럼 쓰십시오:- 마스크를 대상 객체의 가장자리보다 약간 크게 만드십시오
- 객체의 중앙만 덮지 말고 가장자리, 그림자, 반사도 포함하십시오
- 변경되지 않아야 하는 내용을 명시적으로 밝히십시오
- 편집 영역이 너무 작으면 마스크를 더 크게 하십시오
- 절대적인 보존이 필요하면, 최종 픽셀 합성은 직접 수행하십시오(아래 참조)
마스크를 쓸까 말까? Prompt-Only 편집과의 트레이드오프
흔히 나오는 질문입니다: 현대 AI는 이미 일반적인 언어만으로도 “가리키는 대상을 정확히 편집”할 수 있는데 — 왜 굳이 마스크를 만들어야 합니까? 사실gpt-image-2은 마스크 없이도, 단지 “테이블 왼쪽에 있는 컵을 꽃으로 바꿔 주세요”라고만 주어지면 보통 맞는 위치를 편집합니다 — 지시 이행 능력이 강력하고, 가벼운 편집에는 prompt만으로도 충분하기 때문입니다. 하지만 마스크는 언어가 모호하거나, 모호하지 않더라도 여전히 충분히 신뢰할 수 없는 경우를 해결합니다:
연구 결과도 같은 방향을 가리킵니다: 마스크 없는(순수 텍스트 기반) 편집은 정밀한 공간 제어에 약합니다 — 예를 들어 prompt-to-prompt 스타일 기법은 객체를 프레임 안에서 공간적으로 이동시킬 수 없으며, 암묵적 편집 영역이 빗나가면 “바뀌어야 할 부분은 안 바뀌고, 바뀌면 안 되는 부분이 바뀌는” 상황이 생깁니다. 마스크 기반 편집은 약간의 편의성을 포기하는 대신 명시적인 공간 정밀도를 얻습니다.
파일 요구 사항 한눈에 보기
여러 이미지를 사용해 편집할 때의 역할 지정:
Python 예제
cURL 예시
이미지 편집 엔드포인트에는multipart/form-data이 필요합니다 — 이미지와 마스크를 일반 JSON 필드로는 제출할 수 없습니다:
image[] 필드 이름을 사용해야 합니다.
Node.js 예제
마스크는 어디에서 오나요? 다섯 가지 일반적인 방법
사람들은 종종 마스크를 어렵게 느낍니다 — “원본 이미지와 픽셀 단위까지 정확히 일치해야 한다”는 생각 때문입니다. 핵심은 이것입니다: 마스크를 처음부터 직접 그리는 일은 거의 없고, 원본 이미지에서 파생한다는 점입니다. 코드, 사진 편집기, 웹 캔버스 중 무엇을 쓰든 흐름은 항상 “원본을 연다 → 그 위에 영역을 표시한다 → 내보낸다”이므로, 크기 일치는 자동입니다.방법 1: 프로그래밍으로 투명 마스크 생성하기
직사각형 영역을 투명하게 설정합니다(편집 가능):(255, 255, 255, 255)= 불투명, 보존 영역(0, 0, 0, 0)= 투명, 편집 가능 영역
방법 2: 사진 편집기에서 수동으로 지우기
투명 PNG를 지원하는 편집기라면 무엇이든(Photoshop, GIMP, Krita, Photopea 등) 마스크를 만들 수 있습니다. 사실상 한 가지 작업으로 귀결됩니다: 편집하려는 영역을 지워 투명하게 만드는 것입니다. Photoshop에서는 다음과 같습니다.- 원본 이미지의 복사본을 엽니다(원본 자체에서 작업하면 크기가 정확히 일치합니다)
- 레이어가 잠긴 “Background”라면, 더블클릭하여 일반 레이어로 변환합니다(Background 레이어는 투명을 지원하지 않습니다)
- 올가미 / 빠른 선택 / 개체 선택 도구로 수정할 영역을 선택합니다
- Delete를 누릅니다 — 선택 영역이 투명한 체크무늬로 바뀝니다
- “PNG로 내보내기”(투명도 사용) — 결과는 유효한 알파 마스크입니다
Layer → Transparency → Add Alpha Channel, 선택, Delete, PNG로 내보내기.
방법 3: 웹 브러시 캔버스
AI 사진 앱에서 보이는 “바꾸고 싶은 부분을 브러시로 칠하는” 상호작용은, 브라우저에서 실시간으로 생성되는 알파 마스크일 뿐입니다. 이는 단 하나의 Canvas API 속성을 중심으로 구성됩니다. 아래의 브러시 스타일 편집은 어떻게 동작하는가를 보십시오.방법 4: AI 세그멘테이션으로 한 번에 마스크 만들기
브러시조차 번거롭게 느껴진다면, 세그멘테이션 모델에 맡기면 됩니다. Meta의 오픈소스 SAM (Segment Anything Model) 계열이 대표적인 선택입니다.- 클릭으로 마스크 생성: 객체를 한 번 클릭하면 모델이 픽셀 단위로 정확한 윤곽선(머리카락 한 올 수준의 가장자리까지)을 반환합니다
- 텍스트로 마스크 생성: SAM 3는 2025년 11월에 오픈소스로 공개되었으며, “노란 택시 전체”나 “빨간 유니폼을 입은 선수들” 같은 개념 수준의 텍스트 prompt를 받아 일치하는 모든 인스턴스의 마스크를 반환합니다(모델과 코드는
github.com/facebookresearch, 개요는ai.meta.com) - 피사체 / 배경 분리:
rembg같은 오픈소스 도구는 한 번의 명령으로 피사체와 배경을 분리합니다 — 배경 영역은 바로 “배경만 변경” 마스크로 사용할 수 있습니다
방법 5: 흑백 마스크를 알파 마스크로 변환하기
이미 “검정 = 편집, 흰색 = 유지”인 마스크가 있다면:업로드하기 전에 마스크 검증하기
많은invalid_image_file 오류는 파일에 .png 확장자가 있지만 알파 채널 없이 RGB 채널만 있기 때문에 발생합니다. 업로드하기 전에 다음을 실행하십시오:
브러시 스타일 편집이 어떻게 작동하는지와 마스크 형태
마스크는 어떤 불규칙한 형태도 될 수 있습니다
마스크는 본질적으로 픽셀 단위 비트맵이며, 기하학적 도형이 아닙니다. 즉, 모든 픽셀이 고유한 알파 값을 가집니다. 따라서:- 사각형과 원은 가장 단순한 예시일 뿐입니다
- 사람 형태의 실루엣, 머리카락 가닥의 경계, 자유롭게 그린 낙서, 서로 떨어진 여러 조각 모두 유효합니다
- 실제로는 대부분의 마스크가 불규칙합니다: 대상 객체의 윤곽을 따르되 약간 확장한 형태입니다
브러시 스타일 편집이 구현되는 방식
사진 앱에서 “변경할 부분을 브러시로 칠하는” 상호작용은 프런트엔드 관점에서 의외로 단순합니다. 즉, 두 개의 레이어를 겹쳐 놓고 브러시가 위 레이어를 투명도로 ‘지워’ 나가는 방식입니다.destination-out로 설정하면 됩니다(새로 그린 스트로크가 기존 픽셀을 “도려냅니다”):
- 좌표 변환: 캔버스는 보통 페이지에서 CSS로 축소되어 있습니다. 스트로크 좌표를
naturalWidth / clientWidth으로 되돌려 변환하지 않으면 마스크가 어긋납니다 - 실행 취소: 각 스트로크를 그리기 전에
ctx.getImageData()로 스냅샷을 저장하고putImageData()로 복원합니다 - 마스크 팽창: 사용자는 보통 객체의 중심만 브러시로 칠합니다. 따라서 제출하기 전에 마스크를 몇 픽셀 정도 프로그램적으로 확장해야 합니다(전문 도구의 “마스크 확장” 버튼과 같습니다). Python 쪽에서는
PIL.ImageFilter.MaxFilter이나 OpenCV의cv2.dilate를 사용합니다 - 반투명 미리보기: 사용자에게 보이는 하이라이트(예: 반투명 빨강)는 별도의 미리보기 레이어에 그려야 하며, 내보내는 마스크 레이어는 엄격하게 이진의 불투명/투명 상태를 유지해야 합니다
더 나아가기: 클릭 또는 텍스트로 마스크 만들기
브러시를 한 단계 넘어서는 방식은 “사람의 스트로크”를 “모델 추론”으로 바꾸는 것입니다:다중 참고 이미지 + 마스크
일반적인 시나리오: 의상 교체(첫 번째 이미지는 인물이고, 그 뒤로 스타일 / 원단 참고 이미지가 오며, 마스크는 의상 영역을 표시합니다):마스크 밖 내용을 엄격히 보존하기 (픽셀 수준 후처리)
모델이 마스크 밖의 내용을 약간 변경할 수 있으므로, 제품 사진, 신분증 레이아웃, 고정 UI 스크린샷처럼 픽셀 정확도가 필요한 경우에는 생성 후 마스크 밖 영역을 원본에서 다시 합성합니다:일반 오류
invalid_image_file / 잘못된 이미지 파일 또는 모드
invalid_image_file / 잘못된 이미지 파일 또는 모드
일반적인 원인:
- 마스크가 유효한 PNG가 아니거나 파일이 손상되었습니다
- 확장자는 PNG이지만 실제 인코딩은 PNG가 아닙니다
- 비정상적인 이미지 모드(CMYK, 팔레트 모드, 알파 누락)
- 업로드 시 MIME type이 잘못되었습니다
- 파일 스트림이 요청 전에 이미 소비되었거나 닫혔습니다
이미지와 마스크의 크기가 일치하지 않습니다
이미지와 마스크의 크기가 일치하지 않습니다
1픽셀 차이만 있어도 실패합니다. 수정 방법:
흑백 마스크에는 알파 채널이 없습니다
흑백 마스크에는 알파 채널이 없습니다
RGB / L / P 모드만으로는 충분하지 않습니다 — 마스크는 RGBA이어야 합니다. 위의 “방법 2”를 사용해 변환하십시오.투명 배경 요청이 실패합니다
투명 배경 요청이 실패합니다
마스크 자체에는 투명도를 포함할 수 있습니다(이것이 편집 영역을 표시하는 방식입니다). 하지만
gpt-image-2은 투명한 출력 배경을 지원하지 않습니다:"opaque" 또는 "auto"를 background에 사용하십시오. "transparent"를 전달하면 오류가 발생합니다.response_format=url은 이미지를 반환하지 않습니다
response_format=url은 이미지를 반환하지 않습니다
GPT Image 모델은 항상 Base64 데이터를 반환합니다.
response_format은 레거시 DALL·E 2 동작에만 적용됩니다. 결과는 다음과 같이 읽습니다:Content-Type이 multipart/form-data가 아닙니다
Content-Type이 multipart/form-data가 아닙니다
보통
Content-Type 헤더를 수동으로 설정해 boundary를 잃어버리거나, 중간 계층이 multipart 요청을 JSON으로 파싱한 뒤 전달할 때 발생합니다. HTTP 클라이언트가 multipart 헤더를 자동으로 생성하도록 두십시오.크기 매개변수
gpt-image-2은 다음 모든 조건에 따라 유연한 치수를 지원합니다:
1024x1024, 1536x1024, 1024x1536, 2048x2048, 2048x1152, 3840x2160, 2160x3840, auto. 정사각형 이미지는 일반적으로 더 빠르게 생성됩니다.
프로덕션 요청 템플릿
관련 페이지
Image 편집 API 참고 문서
전체 매개변수 참고 문서 및 대화형 Playground
GPT-Image-2 개요
모델 기능, 과금 및 버전 노트
공식 참고 링크(브라우저에 복사하여 사용하십시오):
- 모델 페이지:
developers.openai.com/api/docs/models/gpt-image-2 - Image 편집 API 참고 문서:
developers.openai.com/api/reference/python/resources/images/methods/edit/ - 이미지 생성 가이드:
developers.openai.com/api/docs/guides/image-generation