Seedream 5.5 이미지로 GIF 만들기: 검증한 로컬 내보내기 방법

PNG 프레임 순서와 재생 시간을 정하고 반복 GIF로 내보내는 방법입니다. 로컬 변환 예제는 검증했으며 Seedream 생성은 테스트하지 않았습니다.

조이트로프가 순서대로 놓인 주황색 표시를 반복 동작으로 보여 주는 모습

Seedream 5.5 이미지로 GIF를 만들려면 먼저 구도가 일정한 개별 PNG를 확보한 뒤, 애니메이션 내보내기 도구에서 순서와 표시 시간을 지정해야 합니다. 투명 이미지, 여러 포즈를 모은 시트, 움직이는 GIF는 서로 다른 결과물입니다. 이미지 모델에 “GIF를 만들어 달라”고 요청했다고 해서 다운로드 가능한 애니메이션이 나온다고 가정하면 안 됩니다.

ByteDance의 Seedream 5.5 제품 페이지는 달리는 캐릭터의 연속 이미지를 별도의 투명 레이어로 보여 줍니다. 이를 바탕으로 프레임을 조합하는 방식을 검토할 수 있지만, 모델이 GIF를 직접 출력하는 API나 프레임 수 매개변수, 특정 서비스의 내보내기 설정까지 확인된 것은 아닙니다. 이 글에서 테스트한 범위는 수학적으로 위치를 정한 자체 테스트 마커를 이용한 로컬 PNG→GIF 변환 단계입니다. 예제 프레임을 Seedream 5.5로 생성하지 않았으며 아래 프롬프트도 아직 검증하지 않은 시작 템플릿입니다.

작동 예제 다운로드 및 실행

예제 키트 다운로드에는 원본 PNG 프레임, 출처 설명, 내보내기 스크립트, 테스트 프레임 생성기, 실제로 만들어진 GIF와 검사 보고서가 들어 있습니다. 스크립트는 모델을 호출하거나 파일을 업로드하지 않습니다.

Python 3와 Pillow가 필요하며 FFmpeg 명령을 PATH에서 실행할 수 있어야 합니다. 평소 사용하는 패키지 관리자로 FFmpeg를 설치하세요. ZIP을 새 작업 폴더에 풀고 export_gif.py와 fixture/가 보이는 해당 폴더에서 터미널을 엽니다. macOS나 Linux에서는 다음과 같이 Pillow를 설치하고 실행합니다.

python3 -m venv .venv
source .venv/bin/activate
python -m pip install Pillow
python export_gif.py fixture output --fps 10 --matte '#fff8ee'

Windows에서는 source 줄 대신 .venv\Scripts\activate로 가상 환경을 활성화하거나, 가상 환경 안의 Python 실행 파일을 직접 사용하세요.

검증한 환경에서는 FFmpeg 9.0.2를 사용했습니다. 키트는 설치된 버전과 출력 속성을 report.json에 기록합니다. 처음 시험할 때는 버전을 지정하지 않고 현재 Pillow를 설치해도 편리합니다. 반복해서 사용하는 제작 환경에서는 자체 검사를 통과한 버전을 고정하세요.

출력 폴더는 실행 전에 존재하지 않아야 합니다. 실수로 다시 실행해 승인된 애니메이션을 덮어쓰는 일을 막기 위한 조건입니다. 원본 프레임은 변경하지 않습니다. 실패한 실행이 FAILED.txt를 포함한 폴더를 남겼다면 원인을 확인하고 다음 시도에는 다른 출력 폴더를 사용하세요.

로컬 내보내기 결과: 주황색 테스트 마커가 닫힌 경로를 따라 움직이는 모습

코드로 그린 테스트 프레임을 로컬에서 내보낸 실제 결과입니다. Seedream 생성물이 아니며, 단순한 예제의 외형으로 Seedream의 이미지 품질을 판단할 수 없습니다.

실행 결과는 320 × 180 GIF, 인코딩된 프레임 12개, 총 재생 시간 1,200ms, loop 값 0이었습니다. GIF 메타데이터에서 loop 0은 무한 반복을 뜻합니다. 파일 크기는 6,366바이트였습니다. 이는 작은 테스트 자료의 측정값이며, 세밀한 캐릭터 애니메이션의 예상 크기나 품질을 나타내지 않습니다.

이미지를 요청하기 전에 동작 정의하기

애니메이션 작업 지시에는 동작, 고정된 기준점, 마지막에서 처음으로 돌아가는 전환이 필요합니다. “귀여운 마스코트, 아름다운 조명”은 이미지 스타일을 설명할 뿐 움직임을 정하지 않습니다. 프레임마다 바뀌는 요소와 고정할 요소를 구분하세요. 캔버스 크기, 카메라 위치, 피사체 크기, 발이 닿는 기준선, 팔레트, 외형을 식별하는 세부 요소가 여기에 해당합니다.

첫 반복 동작은 가볍게 손을 흔드는 것처럼 한 가지로 제한하세요. 회전, 점프, 카메라 이동, 소품 교체, 배경 이동을 한꺼번에 넣지 않는 편이 좋습니다. 변화가 많을수록 의도한 움직임과 생성 과정에서 생긴 불필요한 변화를 구분하기 어렵습니다. 서로 다른 여섯 포즈로 동작의 개념을 표현할 수는 있지만, 여섯 프레임이 매끄러운 움직임을 보장하지는 않습니다. 표시 시간과 포즈 사이의 변화 폭이 움직임의 느낌을 결정합니다.

프롬프트를 쓰기 전에 실제 서비스가 Seedream 5.5를 제공하고 필요한 파일을 내보낼 수 있는지 확인하세요. 2026년 11월 10일 Ofox 카탈로그 확인에서는 5.0 Pro와 Flash가 있었고 5.5는 찾지 못했습니다. 버전과 접근 경로 안내에서 이 차이를 설명합니다. 다른 버전을 대신 사용한 결과를 5.5 결과라고 표시하면 안 됩니다.

접근이 확인된 서비스에서 사용할 수 있는 전체 시작 프롬프트는 다음과 같습니다.

Create a six-pose sequence for a short looping wave by the character
in my reference. Keep the camera fixed and use the same full canvas,
character scale, foot baseline, clothing and colors in every pose.

Pose order:
0 — neutral, arm resting;
1 — arm lifting;
2 — hand raised and tilted left;
3 — hand raised and tilted right;
4 — arm lowering;
5 — almost neutral, positioned to transition back to pose 0.

The face, torso, feet and background framing should remain stable.
Only the waving arm and hand should move. Avoid new objects or text.
Return separate PNG images with transparent backgrounds if this
service supports that export. Do not draw a checkerboard background.
If only a contact sheet is available, use an exact 3-column × 2-row
grid with equal cells, no gutters, no labels and no outer border.

프롬프트, 선택한 모델명, 참조 이미지, 다운로드한 원본을 함께 보관하세요. 인터페이스가 개별 프레임 여섯 개나 정돈된 시트를 반환하지 못한다고 해서 숨겨진 API 옵션이 해결해 줄 것이라 추정하지 마세요. 서비스가 실제로 지원하는 내보내기를 사용하거나 애니메이션 출력이 검증된 다른 경로를 선택하세요.

정렬을 유지하며 포즈 분리하기

모든 프레임은 같은 크기의 전체 캔버스를 유지해야 합니다. 각 이미지를 불투명한 내용에 맞춰 개별적으로 잘라 내면 제자리에 있어야 할 캐릭터가 튀어 보일 수 있습니다. 포즈는 고정하려 했어도 그림의 좌표 기준점이 달라지기 때문입니다. 모든 프레임에 같은 자르기 영역과 배율을 적용하세요.

별도 파일을 받았다면 의도한 동작 순서대로 이름을 붙입니다.

frames/
  frame-000.png
  frame-001.png
  frame-002.png
  frame-003.png
  frame-004.png
  frame-005.png

이름을 바꾸기 전에 이미지를 확인하세요. 다운로드 순서가 포즈 순서와 같다는 보장은 없습니다. 파일 크기로 정렬하거나 서비스가 붙인 파일명이 시간 순서를 뜻한다고 가정하지 마세요.

시트 형태로 받았다면 자르기 전에 요청한 격자가 실제로 있는지 확인하세요. 셀 크기가 다르거나 주변에 제목이 있는 3 × 2 배치는 바로 쓸 수 있는 스프라이트 시트가 아닙니다. 이미지 편집기나 스프라이트 시트 변환기에서 실제 셀 경계를 지정하고 추출된 셀을 모두 확인하세요. 칸 경계를 넘어간 그림은 수학적으로 균등하게 자른다고 해결되지 않습니다. Image 2.6 GIF 튜토리얼에는 별도로 검증한 시트 변환 예제와 출처가 있습니다. 그 시트를 Seedream이 생성했다는 증거는 아닙니다.

정렬이 맞을 때까지 원본 해상도를 유지하세요. 잘림 오류를 찾기 전에 모든 프레임을 작은 캔버스로 줄이면 미리보기에서는 문제가 숨겨지고 나중에 수정하기는 더 어려워질 수 있습니다.

사용할 배경에 맞춰 내보내기

PNG는 부분 투명도를 담을 수 있습니다. GIF는 팔레트 기반 투명도를 사용하므로 같은 연속적인 알파 값을 보존하지 않습니다. 희미한 빛, 유리 가장자리, 부드럽게 처리한 머리카락 경계는 투명 GIF로 바꾼 뒤 다르게 보일 수 있습니다. 파일 확장자만 바꿔서는 이런 속성을 유지할 수 없습니다.

제공한 스크립트는 예측 가능한 방식을 사용합니다. GIF 색상을 양자화하고 인코딩하기 전에, 모든 입력을 명시한 단색 배경에 합성합니다. 기본 크림색 배경은 디자인 선택이며 투명 출력이 아닙니다. 흰 배경에는 --matte '#ffffff'를 지정하거나 게시할 페이지의 실제 배경색을 사용하세요. 여러 배경에서 쓸 GIF라면 이 방식이 적합하지 않을 수 있습니다.

실제 부분 투명도가 중요하다면 원본 PNG 시퀀스를 보관하고 대상 앱에서 알파를 지원하는 애니메이션 형식을 검토하세요. APNG와 애니메이션 WebP가 대안이 될 수 있지만 편집기, 콘텐츠 시스템, 재생 환경에 따라 지원 여부가 다릅니다. 해당 환경에서 확인하지 않은 채 채팅 앱이나 광고 지면이 이를 지원한다고 약속하면 안 됩니다. 투명 PNG 안내로 원본에 그려진 배경이 아니라 실제로 유효한 알파가 있는지 확인할 수 있습니다.

Pillow GIF 문서는 프레임 표시 시간, 반복, 다음 프레임을 표시하기 전 이전 프레임을 처리하는 방식(disposal)을 설명합니다. 파일 형식에 관한 자료이며 Seedream 생성 규격이 아닙니다.

재생 시간과 반복 연결 지점 확인하기

초당 10프레임이면 각 프레임은 100ms 동안 표시됩니다. 따라서 12프레임은 1.2초입니다. 스크립트는 GIF의 1/100초 단위로 표시 시간을 정확히 나타낼 수 있도록 5, 10, 20, 25, 50fps만 허용합니다. 이는 스크립트의 의도적인 제한이며 Seedream의 제한이 아닙니다.

마지막 프레임에서 첫 프레임으로 넘어가는 전환은 중간 전환만큼 중요합니다. 마지막 포즈가 첫 포즈와 크게 다르면 반복할 때 눈에 띄게 튑니다. 첫 프레임과 마지막 프레임이 동일하고 각각 한 프레임의 전체 시간만큼 유지되면 불필요한 멈춤이 생길 수 있습니다. 멈춤이 의도된 경우도 있으므로 하나의 규칙을 무조건 적용하지 말고 실제 애니메이션을 확인하세요.

예제의 마커 위치 12개는 닫힌 경로 위에 있으며 마지막에 첫 위치를 중복하지 않습니다. 자연스러운 캐릭터 동작을 모사하는 예제가 아니라 순서와 시간을 검증하는 예제입니다. 자신의 시퀀스는 시트로 외형의 일관성을 확인한 뒤 실제 표시 크기로 재생하세요. 정지된 시트만으로는 어색한 리듬을 확인할 수 없습니다.

스크립트가 확인하는 범위와 직접 판단할 부분

스크립트는 연속 번호가 붙은 PNG, 동일한 크기, 최소 두 프레임, 프레임 간 차이를 요구합니다. 기존 출력 폴더를 거부하고 변환 전에 지나치게 큰 프레임을 차단합니다. 인코딩 뒤 GIF를 다시 열어 여러 프레임이 있는지, 총 재생 시간이 예상과 같은지, 무한 반복으로 설정됐는지 확인합니다. 이후 비교할 수 있도록 원본 해시도 기록합니다.

인코딩에는 FFmpeg의 팔레트 생성·적용 필터를 사용합니다. 이 필터는 시퀀스 전체에 일관된 팔레트를 만드는 데 도움이 되지만, 사라진 그림의 세부를 복원하거나 서로 맞지 않는 포즈를 고치지는 않습니다. GIF 인코더는 동일한 프레임을 합치고 표시 시간을 더해 보존할 수도 있습니다. 따라서 인코딩된 프레임 수가 원본 파일 수와 항상 같은 것은 아닙니다.

로컬 PNG→GIF 예제의 검사 기록

영어로 표시된 로컬 테스트 기록의 실제 스크린샷입니다. 파일 검증과 내보내기 결과를 기록하며 모델 인터페이스나 Seedream 생성 결과를 보여 주는 화면은 아닙니다.

증상먼저 확인할 항목다음 조치
이미지 하나만 보임실제 다운로드 파일을 디코딩해 프레임 수 확인개별 원본 프레임이나 실제 애니메이션 내보내기 찾기
캐릭터 위치가 튐캔버스 크기, 공통 좌표 기준점, 자르기 영역인코딩 전에 같은 캔버스 위에서 정렬
흰 사각형이 나타남원본 PNG의 알파 유무와 선택한 배경색알파를 확인한 뒤 적절한 배경이나 형식 선택
가장자리가 거침팔레트·알파 변환과 미리보기 크기PNG 원본을 보관하고 실제 사용할 배경에서 확인
반복할 때 동작이 튐마지막 포즈와 첫 포즈의 차이파일명이 아니라 포즈나 표시 시간 수정
모델 요청 실패정확한 모델, 서비스, 지원 요청 형식이미지 API 오류 해결 안내 확인. 다른 모델의 GIF 매개변수를 가져다 쓰지 않기

실제 제작물의 합격 기준은 .gif라는 이름만으로 정해지지 않습니다. 대상 환경에서 재생되고, 요구한 동작을 담으며, 피사체의 외형을 유지하고, 가장자리 품질과 해당 환경의 파일 크기 제한을 충족해야 합니다. 수정 가능한 프레임을 최종 파일과 함께 보관하세요. 프레임 조합보다 모델의 직접 GIF 생성이 중요하다면 Seedream 5.5와 Image 2.6 선택 안내를 통해 출력 지원이 검증된 경로를 고르세요.

Ofox Chat 열기에서 동작 지시를 준비하고 현재 제공되는 이미지 도구를 사용할 수 있습니다. 일반적인 Chat 진입 링크이며 Seedream 5.5가 제공된다는 확인이 아닙니다. 크레딧을 사용하기 전에 모델과 내보내기 옵션을 확인하세요.

다운로드한 스크립트는 프레임당 최대 1,600만 픽셀, 전체 입력 시퀀스 최대 6,400만 픽셀로 제한됩니다. 더 큰 자료는 실행 전에 크기를 줄이거나 나누세요. 작은 로컬 작업을 위한 도구이며 대규모 일괄 제작용 인코더가 아닙니다.