GPT Image 2.6에서 영역을 표시해 이미지 수정하고 결과 확인하기

투명한 표시 레이어를 만들고 Ofox API로 이미지를 수정하는 방법입니다. 실제 출력 2개, 원본 파일, 전체 요청 코드와 선택 영역 밖의 변화를 확인하는 스크립트를 제공합니다.

자수 틀 안의 주황색 천 조각으로 전체 이미지 안의 국소적인 수정을 표현한 그림

GPT Image 2.6에서 원으로 대상을 표시해 수정하려면 원본 이미지와 별도의 투명 PNG 표시 파일을 Images 편집 엔드포인트로 보내고, 표시 파일을 markup 필드에 지정합니다. 원하는 변경은 프롬프트로 설명합니다. 표시를 원본과 정확히 맞추고, 생성 후에는 전체 이미지를 확인하세요. 대상을 제대로 선택했다고 해서 표시 밖의 모든 픽셀이 그대로 유지되는 것은 아닙니다.

2026년 11월 6일 Ofox를 통해 실제로 테스트했습니다. 요청 2개에 여행용 머그잔 3개가 있는 동일한 그림과 동일한 프롬프트를 사용했습니다. 빨간 타원만 왼쪽 머그잔에서 오른쪽 머그잔으로 옮기자 주황색으로 바뀌는 대상도 달라졌습니다. 하지만 두 결과 모두 대상 밖의 픽셀도 바뀌었습니다. 이 차이를 직접 확인할 수 있도록 원본 파일, 실제 출력, 요청 설정과 로컬 검사 도구를 제공합니다.

유료 요청 전에 예제부터 내려받기

표시 기반 이미지 수정 예제 전체 다운로드에는 원본 PNG와 SVG, 투명 표시 레이어 2개, 실제 생성된 PNG 2개, 프롬프트, 요청 기록과 Python 보조 스크립트 3개가 들어 있습니다. 다운로드하거나 로컬에서 살펴보는 것만으로 API가 호출되지는 않습니다.

원본은 이 테스트를 위해 직접 만든 일러스트이며 고객의 상품 사진이 아닙니다. 청록색 여행용 머그잔 3개 위에 A, B, C가 있고 각 잔에는 A-17이 적혀 있습니다. 제목, 배경, 아래쪽 짧은 선과 주황색 점도 확인할 영역입니다. 단순한 요소를 사용하면 잘못된 대상이나 글자 변경을 알아보기 쉽습니다. 얼굴, 보석, 실제 상품 사진 또는 대량 처리에서의 성능을 보여 주는 테스트는 아닙니다.

로컬 이미지 검사에는 Python 3와 Pillow가 필요합니다. 터미널에서 압축을 푼 폴더로 이동한 뒤 별도의 환경을 만드세요.

python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install Pillow

위 예시는 macOS 또는 Linux 셸 문법입니다. Windows에서는 사용하는 셸에 맞는 명령으로 가상 환경을 활성화하세요. 함께 제공하는 decode_edit.py는 Python 표준 라이브러리만 사용합니다.

표시, 마스크, 정확한 합성 중 필요한 방법 고르기

markup은 설명보다 가리키는 편이 쉬울 때 유용합니다. 비슷한 머그잔 중 하나를 바꾸거나, 화살표로 지정한 물체를 없애거나, 복잡한 구도에서 한 부분을 수정하는 경우입니다. 표시는 편집 의도를 전달하는 수단이며 완성 이미지에 남길 그림이 아닙니다.

필요한 작업시작할 방법확인할 항목
비슷한 물체 중 하나 지정별도 표시 레이어와 구체적인 프롬프트대상이 맞는지, 표시가 사라졌는지, 나머지 물체가 허용 가능한지
투명도 마스크로 수정 영역 안내마스크 기반 작업 흐름마스크 해석과 주변 변화
승인된 로고나 배경을 정확하게 유지원본을 보관하고 채택한 수정 부분을 이미지 편집기에서 합성레이어 경계, 정렬, 보호할 픽셀의 일치 여부

마지막 행은 작업 방식에 대한 권장 사항이지 이번 호출 2개로 테스트한 기능은 아닙니다. 특정 픽셀을 바꾸지 않는 것이 납품 조건이라면 비슷해 보인다는 이유만으로 생성 결과를 승인하지 마세요. 이 문제는 마스크와 상품 영역 보존 가이드에서 따로 다룹니다.

OpenAI 이미지 생성 가이드에 따르면 Images 편집 경로의 markup은 Image 2.5와 2.6에서 지원되므로 2.6 전용 기능은 아닙니다. 첫 번째 입력 이미지에 적용되며 mask 또는 prompt_rewriter와 함께 사용할 수 없습니다. 표시 파일은 방향을 바로잡은 원본과 크기가 같은 투명 PNG여야 합니다. 문서상 제한은 각 이미지 16,777,216픽셀, 표시 파일 50 MB입니다. 이 예제는 1024 × 1024 입력과 제한보다 훨씬 작은 표시 파일을 사용합니다.

표시만 별도의 투명 파일로 내보내기

예제에서는 source.png를 원본으로, markup-left.png를 표시로 사용합니다. 오른쪽 대상용 파일은 markup-right.png입니다. SVG는 수정할 수 있는 소스 파일이며 이번 API 요청에 제출한 파일은 아닙니다.

레이어를 지원하는 이미지 편집기에서 직접 표시를 만들려면 다음 순서로 작업하세요.

  1. 원본을 열고 방향부터 확정합니다. 편집기가 EXIF 정보를 따라 회전한다면 표시를 그리기 전에 올바른 방향의 작업용 사본을 내보냅니다.
  2. 캔버스 크기를 유지한 채 원본 위에 투명 레이어를 추가합니다.
  3. 대상 하나를 명확하게 둘러쌉니다. 가능하면 관련 없는 물체는 밖에 두고, 중요한 글자를 굵은 선으로 가리지 않습니다.
  4. 원본을 숨기고 표시 레이어만 PNG로 내보냅니다. 그림의 외곽에 맞춰 자르지 말고 전체 캔버스를 유지합니다.
  5. 원본과 표시를 다시 겹쳐 정렬을 확인합니다. 원본은 따로 보관하고, 빨간 원을 합친 이미지로 덮어쓰지 마세요.

이미지에 그려진 체크무늬는 투명도가 아닙니다. 흰 배경 위에 빨간 원이 있는 PNG도 투명 레이어가 아닙니다. 알파 채널에 실제로 투명한 배경 픽셀이 있어야 합니다. 미리 보기에서 투명해 보이는 것만으로는 증명할 수 없습니다.

제공된 로컬 검사를 실행합니다.

python3 preflight.py source.png markup-left.png

예제 파일은 passed: true, 크기 [1024, 1024], 알파 범위 [0, 255]를 반환합니다. 불투명한 표시, 아무 선도 없는 완전 투명 파일, 크기가 다른 파일, JPEG를 거부하는지도 로컬에서 모두 확인했습니다. 검사를 통과했다는 것은 기본 파일 속성이 맞다는 뜻이며, 모델 접근 권한이나 원의 위치, 편집 성공을 확인한 것은 아닙니다.

변경은 하나로 좁히고 보존할 세부 사항을 나열하기

두 요청에 사용한 프롬프트 원문입니다. 재현할 수 있도록 영어 그대로 실었으며, 다운로드한 파일의 prompt.txt에도 동일하게 들어 있습니다.

Change only the body of the travel mug inside the red ellipse to warm orange. Keep its dark lid, handle geometry, cream A-17 label and label text unchanged. Keep the other two mugs, their colors, the A B C headings, FIELD / 03 title, background, bottom line and small orange dot unchanged. The red ellipse is an editing annotation: do not draw it in the final image. Keep the original framing and flat illustration style.

프롬프트에는 ‘왼쪽’이나 ‘오른쪽’이라는 말이 없습니다. 대상 위치를 표시로 전달하기 위해서입니다. 잔 몸통과 뚜껑, 손잡이 형태, 라벨을 구분하고 최종 이미지에 빨간 타원을 그리지 말라고 명시합니다. 다른 잔과 색, A/B/C, FIELD / 03 제목, 배경, 아래쪽 선과 점, 구도와 평면 일러스트 스타일도 유지하도록 요청합니다.

직접 사용할 때는 대상, 변경 내용, 보호할 세부 사항을 바꾸세요. 색, 조명, 위치, 배경을 한 번에 바꾸기보다 한 가지 수정부터 시작하면 결과를 진단하기 쉽습니다. 보존해 달라는 지시는 확인해야 할 요구 사항이지 이미 보존되었다는 증거가 아닙니다.

이미지 프롬프트 가이드에서는 국소 편집과 모델별 설정을 설명합니다. 이번 작은 작업에서는 quality=medium, complexity=low를 사용하고 input_fidelity는 생략했습니다. 이는 테스트 조건이며 모든 이미지에 최적인 설정이라는 뜻은 아닙니다.

Ofox로 전체 요청 보내기

테스트한 엔드포인트는 https://api.ofox.ai/v1/images/edits, Ofox 모델 ID는 openai/gpt-image-2.6-flare입니다. 공급자에 직접 연결할 때와 게이트웨이를 사용할 때의 ID는 다를 수 있습니다. 이름을 바꾸기 전에 Ofox Images API 문서와 계정에서 사용 가능한 모델을 확인하세요.

아래 요청은 예제 파일을 사용하며 계정 크레딧을 소비합니다. OFOX_API_KEY는 로컬 환경에 안전하게 설정하고, 글이나 배포 파일 또는 공유 노트북에 넣지 마세요.

curl --fail-with-body --silent --show-error \
  https://api.ofox.ai/v1/images/edits \
  -H "Authorization: Bearer ${OFOX_API_KEY:?Set OFOX_API_KEY first}" \
  -F 'model=openai/gpt-image-2.6-flare' \
  -F 'image=@source.png;type=image/png' \
  -F 'markup=@markup-left.png;type=image/png' \
  -F 'prompt=<prompt.txt' \
  -F 'size=1024x1024' \
  -F 'quality=medium' \
  -F 'complexity=low' \
  -F 'n=1' \
  -F 'output_format=png' \
  -o response.json

multipart Content-Type과 boundary는 curl이 설정하도록 두세요. boundary 없는 Content-Type: multipart/form-data 헤더를 직접 추가하지 마세요. curl 폼 문법에서 prompt=<prompt.txt는 파일 내용을 prompt 필드로 읽습니다. 파일 이름 자체를 프롬프트로 보내는 문법이 아닙니다.

curl이 정상 종료되면 응답을 디코딩하고 검사합니다.

python3 decode_edit.py response.json my-left-result.png
python3 inspect_edit.py source.png my-left-result.png

디코더는 오류 응답과 PNG 시그니처를 확인하고 기존 출력 파일을 덮어쓰지 않습니다. 비교 스크립트는 제공된 1024 × 1024 예제와 고정된 자르기 좌표를 전제로 합니다. 다른 사진에서는 실제로 보호할 영역에 맞게 좌표를 바꾸고 잔의 좌표를 그대로 사용하지 마세요.

오른쪽 대상 실험을 재현하려면 markup-left.png만 markup-right.png로 바꾸고 source.png는 유지하세요. 응답과 출력에는 새로운 파일 이름을 사용합니다. 호출마다 비용이 발생합니다. 왼쪽 결과를 오른쪽 요청의 입력으로 사용하면 시작 이미지도 달라지므로 같은 비교가 아닙니다.

실제 출력 2개가 보여 주는 결과

원본과 왼쪽·오른쪽 수정 결과 및 대상 밖 픽셀 차이를 보여 주는 로컬 검사 화면

영문 로컬 검사 화면을 실제 브라우저에서 캡처했습니다. 실제 API 출력과 측정값을 보여 주며 Ofox Chat 인터페이스는 아닙니다. 글의 장식용 표지 이미지는 별도의 개념 일러스트입니다.

관찰 항목왼쪽 표시오른쪽 표시
눈에 보이는 변경A 잔 몸통이 주황색으로 바뀜C 잔 몸통이 주황색으로 바뀜
HTTP 응답200200
출력1024 × 1024 PNG1024 × 1024 PNG
네트워크를 포함한 클라이언트 경과 시간11.566초10.229초
반환된 입력 / 출력 토큰1,286 / 1,4491,265 / 1,449
최종 결과에 빨간 표시가 남았는지아니요아니요

대상마다 한 번만 호출했고 재시도는 없었습니다. 시간은 관측값이며 속도 벤치마크나 서비스 지연 시간 보장이 아닙니다. 같은 프롬프트인데도 입력 토큰 수가 달랐지만 이 테스트로 원인을 설명할 수는 없습니다. Sunburst나 다른 공급자와의 비교도 하지 않았습니다.

라벨은 읽을 수 있고 두 결과 모두 의도한 잔의 색이 바뀌었습니다. 다만 생성 이미지에 미세한 질감과 음영이 추가됐습니다. 나머지 잔은 여전히 청록색으로 보이지만 RGB 값은 원본과 같지 않습니다. 축소된 캡처만 보지 말고 원본, 왼쪽 결과, 오른쪽 결과를 원래 해상도로 열어 확인하세요.

로컬 스크립트는 크기를 바꾸지 않고 동일한 좌표의 영역을 비교합니다. 0–255 범위의 RGB 채널 값에 대해 절대 차이의 평균을 구합니다.

잘라낸 영역왼쪽 결과오른쪽 결과
두 요청 모두 선택하지 않은 가운데 잔 몸통11.86610.925
제목 영역3.1413.890
아래쪽 짧은 선1.8531.527

이는 픽셀 차이이며 화질 점수나 보편적인 통과 기준이 아닙니다. 다운로드에 기록된 대상 몸통 영역을 포함해 검사한 다섯 영역 모두 원본과 달랐습니다. 따라서 이번 출력은 원으로 표시한 물체 밖에서도 원본의 정확한 복사본은 아닙니다. 모든 보호 픽셀을 측정한 것은 아니며, 어떤 변화가 실제 용도에서 허용 불가능한지 자동으로 결정하는 수치도 아닙니다.

실제 납품 조건에 맞춰 승인하기

수정 결과를 전달하기 전에 세 가지를 나눠 확인하세요.

  • 선택: 원하는 물체가 바뀌었고 옆 물체까지 주황색이 되지는 않았는지, 표시가 사라졌는지 확인합니다.
  • 내용: 라벨, 숫자, 브랜드, 요청한 형태가 맞는지 확인합니다. 이 예제에서는 큰 A/B/C뿐 아니라 모든 A-17을 읽어야 합니다.
  • 보존: 작은 질감이나 색 변화가 허용 가능한지 판단합니다. 완전히 같아야 한다면 보호 영역의 픽셀을 검사하고 합성에 사용할 원본 레이어를 보관합니다.

원본, 표시, 프롬프트, 모델 ID, 설정, 출력, 승인 메모를 함께 보관하세요. 다시 수정할 때는 문제의 원인을 하나씩 해결합니다. 원이 잘못 놓였다면 표시를 수정하고, 대상은 맞는데 스타일 변화가 크다면 보존 지시를 구체화하거나 다른 편집 방식을 택합니다. 원인을 찾지 않고 계속 생성하면 비교의 의미가 줄어듭니다.

Ofox Chat에서 이미지 작업 시도하기

대화형 작업을 원한다면 Ofox Chat을 열고 원본과 구체적인 요청을 전달하세요. 어떤 물체를 어떻게 바꾸고 어떤 세부 사항은 남길지 설명합니다. 받은 결과도 선택, 글자, 보존 기준으로 똑같이 검사하세요.

Ofox Chat에서도 Image 2.6을 사용할 수 있지만 이 글의 두 테스트는 API로 진행했습니다. 별도의 투명 레이어를 API의 markup 필드로 보내는 Chat의 입력 기능은 확인하지 않았습니다. 표시가 있는 참고 이미지를 대화에 올렸다는 사실만으로 같은 필드와 설정이 사용된다고 볼 수 없습니다. 두 파일 요청을 정확하게 재현하려면 위 API 절차를 사용하세요.

파일·요청·결과 문제를 따로 진단하기

증상먼저 확인할 것다음 조치
표시가 거부되거나 크기가 다름방향과 캔버스 크기방향을 통일하고 같은 크기로 내보낸 뒤 사전 검사
흰 사각형이 원본을 덮음표시의 알파 채널원본과 배경을 숨기고 투명 그리기 레이어만 내보내기
미리 보기에서 빈 표시를 못 알아봄알파와 실제 선대비되는 배경에서 열기. 스크립트는 완전 투명 파일을 거부
다른 물체가 바뀜정렬과 모호한 원레이어를 겹쳐 확인하고 대상을 하나로 좁히되 원본은 유지
출력에 빨간 원이 나타남원본에 합쳐진 표시, 불명확한 지시원본을 따로 보내고 표시를 그리지 말라고 명시
마스크 예제를 복사한 후 오류충돌하는 필드markup 요청에서 mask와 prompt_rewriter 제거
모델을 찾을 수 없거나 접근 거부정확한 모델 ID와 응답 본문모델 가용성과 인증 정보를 확인하고 임의의 모델 이름으로 재시도하지 않기
성공 응답인데 사용할 PNG가 없음오류 데이터 또는 이미지 데이터 누락디코딩 전에 JSON을 확인하고 진단용으로 저장
다른 물체나 라벨이 달라짐원본 해상도로 비교허용 못 할 결과는 제외하고 지시 하나를 수정하거나 보호된 원본 레이어와 합성
시간 초과나 요청 제한응답 상태와 계정 제한재시도 전에 완료 여부 확인. 반복 호출은 추가 비용 발생 가능

국소 편집이 아닌 출력 형식 문제라면 Image 2.6 GIF 가이드와 SVG 작업 흐름(영문)을 참고하세요. 각각 다른 결과물을 다루며 엔드포인트와 검증 조건도 다릅니다. 모델 접근과 과금 배경은 Image 2.6 API 개요(영문)에서 확인할 수 있습니다. 위 토큰 관측값은 수정 1회당 고정 요금이 아닙니다.