Communitygithub.com

kalash33/adobe-resize-photos-and-videos

Adobe 도구를 사용하여 사진 및 비디오를 정확한 픽셀 크기나 화면비로 크기를 조정합니다.

adobe-resize-photos-and-videos란 무엇인가요?

이 스킬은 Adobe Creative Cloud 기반 AI 에이전트가 사진과 비디오의 크기를 조정할 수 있도록 지원합니다. 사용자가 '1920x1080으로 리사이즈', '4K로 만들어 줘', '16:9 비율로 변경', '사진 크기 줄이기' 등 특정 치수나 화면비를 요청할 때 트리거됩니다. 이 스킬은 `adobe-mandatory-init`을 먼저 호출한 후 `image_crop_and_resize`(사진용)와 `video_resize`(비디오용) 툴을 사용하며, reframe, pad, extract 등 다양한 맞춤 모드와 스마트 포커스 옵션(주제, 얼굴, 상반신, 명명된 개체)을 지원합니다. 결과물은 미리보기, Creative Cloud 업로드, Firefly 보드 공유가 가능하며, 대량 처리 시 페이지네이션을 통해 긴 세션도 안정적으로 처리합니다. 소셜 미디어 플랫폼 세트(Instagram, TikTok 등)는 `adobe-create-social-variations` 스킬로 라우팅하므로 주의해야 합니다.

지원 대상✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/kalash33/kstack/tree/HEAD/skills/adobe-adobe-resize-photos-and-videos

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

Adobe 사진 및 비디오 크기 조정

사용자가 지정한 치수, 화면비 또는 명명된 크기로 이미지 또는 비디오 크기를 조정합니다. 소셜 미디어 플랫폼 세트(Instagram, TikTok 등)의 경우 → 대신 adobe-create-social-variations 스킬을 사용하세요.


도구 참조

단계도구참고사항
파일 선택기 열기asset_add_filepresignedAssetUrl, assetId, mediaType 반환
CC에서 에셋 찾기asset_search이미지의 경우 asset_add_file을 통해 다시 스테이징; 비디오의 경우 id 직접 사용
PSD/AI 렌더링document_render_vector크기 조정 전 JPEG로 변환
이미지 크기 조정image_crop_and_resize치수당 한 번 호출; 기본값 reframe
출력물 미리보기asset_preview_file모든 출력을 한 번에 호출
CC에 업로드(시작)asset_initialize_file_upload블록 업로드 파이프라인의 첫 번째 호출
CC에 업로드(완료)asset_finalize_file_upload두 번째 호출; 보드용 presigned CC URL 반환
Firefly 보드 생성create_firefly_board최종 URL과 함께 import_adobe_storage 전달
비디오 크기 조정video_resizestatusId 반환 (폴링 용)
비디오 크기 조정 폴링resizeVideoPoll지연 도구 — 호출 전 로드 필요

워크플로우

0단계 — Adobe 도구 초기화

먼저 adobe_mandatory_init을 호출합니다. 그러면 나머지 워크플로우에 필요한 파일 처리 규칙과 도구 라우팅 지침이 반환됩니다.

{ "skill_name": "adobe-resize-photos-and-videos", "skill_version": "1.0.1" }

1단계 — 자격 확인

adobe_mandatory_init에서 "Adobe for creativity" 커넥터가 활성화되었음을 확인했으므로, 위의 도구 참조 표와 대조하여 "Adobe for creativity" 커넥터를 통해 사용 가능한 도구를 확인합니다.


즉시 실행 필요

1단계: 매개변수가 누락되었거나 모호한 경우 → 다단계 입력 수집을 실행합니다(아래 2단계). 2단계: 파일이 업로드되지 않은 경우 3단계(asset_add_file({}))를 실행합니다. 3단계: 이미지인지 비디오인지 감지하여 올바른 워크플로우(이미지/비디오 5단계)로 라우팅합니다.


2단계 — 다단계 입력 수집

사용자가 완전한 매개변수(유형 + 크기 + 맞춤 모드)를 제공하지 않은 경우 실행합니다. 사용자 메시지에 이미 세 가지가 모두 포함된 경우에는 건너뜁니다.

AskUserQuestion을 사용하여 단계별로 매개변수를 수집합니다.

2a단계 — 유형

AskUserQuestion([{
  question: "사진인가요 비디오인가요?",
  type: "single_select",
  options: ["사진", "비디오"]
}])

2b단계 — 크기

사진인 경우 (multi_select — 사용자가 하나 이상 선택 가능):

AskUserQuestion([{
  question: "크기 — 필요한 것을 모두 선택하세요",
  type: "multi_select",
  options: [
    "1080 × 1080 — Instagram 정사각형",
    "1080 × 1350 — Instagram 세로형",
    "1080 × 1920 — 스토리 / 릴스",
    "1920 × 1080 — YouTube / 가로형",
    "1280 × 720 — YouTube 썸네일",
    "1200 × 675 — X / Twitter 게시물",
    "1200 × 630 — Facebook / OG 이미지",
    "1080 × 566 — LinkedIn 게시물",
    "2560 × 1440 — YouTube 배너",
    "3840 × 2160 — 4K / UHD",
    "400 × 400 — 프로필 / 아바타",
    "2480 × 3508 — A4 인쇄 (300 dpi)",
    "사용자 지정 — 직접 입력"
  ]
}])

사용자가 "사용자 지정"을 선택한 경우 후속 질문: "사용자 지정 크기를 입력하세요 (예: 1500×800):"

사용자가 여러 프리셋을 선택한 경우 → 각 치수에 대해 image_crop_and_resize를 한 번씩 실행하고, 매번 동일한 소스 URI와 매개변수를 사용합니다. 마지막에 모든 출력을 함께 미리보기합니다.

비디오인 경우 (multi_select — 사용자가 하나 이상 선택 가능):

AskUserQuestion([{
  question: "크기 — 필요한 것을 모두 선택하세요",
  type: "multi_select",
  options: [
    "1080 × 1920 — 릴스 / TikTok / 스토리",
    "1920 × 1080 — YouTube / 가로형",
    "1080 × 1080 — 정사각형 게시물",
    "1280 × 720 — YouTube 720p",
    "3840 × 2160 — 4K / UHD",
    "854 × 480 — SD / 480p",
    "사용자 지정 — 직접 입력"
  ]
}])

사용자가 여러 비디오 프리셋을 선택한 경우 → 각 치수에 대해 별도의 video_resize 작업을 제출하고, 각각이 완료될 때까지 폴링한 후 모든 출력을 함께 미리보기합니다.

2c단계 — 맞춤 모드

사진인 경우 (single_select):

AskUserQuestion([{
  question: "맞춤 모드",
  type: "single_select",
  options: [
    "Reframe — 채우기 위해 자르기",
    "Pad — 레터박스, 자르기 없음",
    "Extract — 피사체 분리"
  ]
}])

비디오인 경우 (single_select):

AskUserQuestion([{
  question: "맞춤 모드",
  type: "single_select",
  options: [
    "Letterbox — 비율 유지",
    "Crop — 채우기, 검은 막대 없음",
    "Stretch — 강제 정확한 크기 (왜곡)"
  ]
}])

2d단계 — 스마트 포커스 (사진만 해당)

AskUserQuestion([{
  question: "스마트 포커스 — 자르기 중심을 어디로 할까요?",
  type: "single_select",
  options: [
    "주제",
    "얼굴 / 초상화",
    "상반신",
    "중앙 (기하학적)",
    "명명된 개체 — 설명하겠습니다"
  ]
}])

사용자가 "명명된 개체"를 선택한 경우 후속 질문: "개체를 설명하세요 (예: '빨간 차', '로고'):"

2e단계 — 옵션 (사진만 해당)

AskUserQuestion([{
  question: "추가 옵션이 있나요?",
  type: "multi_select",
  options: [
    "일괄 — 여러 이미지",
    "출력: JPEG",
    "출력: PNG"
  ]
}])

2f단계 — 소스 (비디오만 해당)

AskUserQuestion([{
  question: "비디오 위치는 어디인가요?",
  type: "single_select",
  options: [
    "기기에서 업로드",
    "Creative Cloud에서"
  ]
}])

3단계 — 소스 파일 가져오기

중요 — /mnt/user-data/uploads/ 경로는 사용 가능한 URL이 아닙니다. 사용자가 파일을 첨부하여 컨텍스트에 /mnt/user-data/uploads/ 경로로 나타나더라도, 이 경로를 Adobe 도구에 전달할 수 없습니다. asset_add_file()을 호출하여 파일을 스테이징하세요. /mnt/user-data/uploads/ 경로는 Adobe 도구에서 가져올 수 없습니다.

잘못됨 ❌  imageURI: "/mnt/user-data/uploads/photo.jpg"
잘못됨 ❌  imageURI: "file:///mnt/user-data/uploads/photo.jpg"
올바름 ✅  asset_add_file() 호출 → 선택기 컨텍스트에서 presignedAssetUrl 사용

파일이 아직 없는 경우 → 즉시 선택기를 엽니다:

asset_add_file()

반환된 mediaType에서 유형 감지:

  • image/* → 이미지 워크플로우
  • video/* → 비디오 워크플로우

4단계 — 대상 크기 결정

사용자 입력해석
1920×1080, 1920x1080width: 1920, height: 1080
4K3840 × 2160
HD, 1080p1920 × 1080
720p1280 × 720
480p854 × 480
A4 인쇄2480 × 3508 (300 DPI 세로)
Letter 인쇄2550 × 3300 (300 DPI 세로)
16:9, 1:1, 4:5, 9:16비율 문자열 → output: "16:9"로 전달
squareoutput: "1:1"
너비만 (800px wide)width: 800, 비율 문자열을 사용하여 가로세로 비율 유지

양식에 지정된 대상이 없고 사용자 메시지에도 없는 경우 → 질문:

"어떤 크기가 필요하신가요? (예: 1920×1080, A4, 16:9)"


이미지 워크플로우

5단계 (이미지) — 유효한 URI 소스

imageURI로 작동하는 것:

  • asset_add_file()의 presignedAssetUrl ✅
  • 이전 도구 호출의 outputUrl ✅
  • 사용자가 제공한 공개 HTTPS URL ✅

imageURI로 사용할 수 없는 것:

  • /mnt/user-data/uploads/ 경로 ❌
  • asset_search의 renditionURL 직접 사용 ❌
  • file:// URI ❌
소스해결 방법
업로드된 파일asset_add_file() → presignedAssetUrl
CC 저장소 에셋asset_search → asset_add_file()을 통해 다시 스테이징 → presignedAssetUrl
이전 도구 출력outputUrl 직접 사용
PSD / AI 파일document_render_vector (JPEG, 300 DPI) → outputPresignedUrl

6단계 (이미지) — 맞춤 모드

의도모드참고사항
"WxH로 리사이즈" / 기본값reframe대상 비율로 가장 큰 자르기, 중앙 정렬 — 왜곡 없음
"자르기 없음", "레터박스", "안쪽에 맞춤"pad빈 공간을 흰색으로 채움
"피사체 분리", "빡빡하게 자르기"extract감지된 영역 주변으로 좁게 자르기

기본값: reframe. 사용자가 명시적으로 요청한 경우에만 변경하세요.

⛔ fit: "extract"는 명시적인 { width, height }와 호환되지 않습니다. 이미지가 늘어납니다. 비율 문자열을 사용하거나 output을 생략하세요.


7단계 (이미지) — image_crop_and_resize 호출

image_crop_and_resize({
  imageURI: presignedAssetUrl,
  options: {
    output: { width: 1920, height: 1080 },  // 또는 "16:9"
    fit: "reframe",
    focus: "subject",  // 또는 "face", "upper_body", { prompt: "the car" }, { x:0.5, y:0.5 }
    quality: 7
  },
  outputFileType: "jpeg"  // 또는 투명도가 필요한 경우 "png"
})
// result.outputUrl → 미리보기 또는 체인에 사용

포커스 가이드:

  • "subject" — 기본값; 전신 감지, 풍경, 개체
  • "face" — 초상화, 헤드샷
  • "upper_body" — 가슴 위 자르기
  • { prompt: "the logo" } — 사용자 양식 입력에서 명명된 개체
  • { x: 0.5, y: 0.5 } — 기하학적 중심 (명확한 주제 없음)

8단계 (이미지) — 일괄 처리

양식에서 일괄 처리가 선택되었거나 사용자가 여러 파일을 제공한 경우:

  1. 각 파일에 대해 asset_add_file()을 호출하여 개별 presigned URL을 얻습니다.
  2. 동일한 매개변수로 각각에 대해 image_crop_and_resize를 호출합니다.
  3. 모든 outputUrl 값을 수집합니다.
  4. 모든 출력으로 한 번에 asset_preview_file을 호출합니다.

이 환경에서는 호출이 순차적으로 실행됩니다. 10개 이상의 이미지인 경우 시작 전에 사용자에게 확인하세요.

턴 간 페이지네이션 (20개 초과 일괄 처리): 대량 일괄 처리의 경우 대화 컨텍스트가 모든 이미지가 처리되기 전에 가득 차서, Claude가 중간에 멈출 수 있습니다. 이는 예상된 현상이며 오류가 아닙니다. 발생 시:

  • 완료된 개수와 남은 개수를 알립니다 (예: "20 / 24 완료 — 나머지는 '계속'이라고 말씀해 주세요")
  • 사용자가 확인할 때까지 기다립니다.
  • 재개 시 다음 처리되지 않은 이미지부터 시작하여 끝까지 계속합니다.
  • 마지막 이미지가 완료된 후에만 모든 출력을 함께 미리보기합니다.

9단계 (이미지) — 미리보기 + 전달 + Firefly 보드

asset_preview_file({
  assets: [
    { name: "photo_1920x1080.jpg", presignedAssetUrl: result.outputUrl },
    // 모든 성공적인 출력
  ]
})

CC에 저장 + Firefly 보드 생성

미리보기 후 블록 업로드 파이프라인(asset_initialize_file_upload → PUT 청크 → asset_finalize_file_upload)을 사용하여 각 출력을 CC 저장소에 업로드합니다.

그런 다음 최종 출력 URL로 firefly 보드 도구를 호출합니다:

create_firefly_board({
  import_adobe_storage: [
    final_output_url_1,
    final_output_url_2,
    // ...
  ]
})

✅ (Stage에서) 확인됨: asset_finalize_file_upload의 presigned URL을 사용한 import_adobe_storage가 보드를 성공적으로 채웁니다.

❌ 작동하지 않음: CC URN(urn:aaid:sc:US:...)을 사용한 import_generic_assets — USS 인덱싱 지연으로 인해 빈 보드가 생성됩니다.

보드 생성이 실패하거나 URL 형식이 잘못된 경우 보드 링크는 생략하세요 (재시도해도 도움이 되지 않음).

보드 단계 후 완료 요약을 게시합니다:

✅ 완료! [N]개의 이미지 크기가 조정되어 준비되었습니다.

📥 다운로드:
• resized_1920x1080.jpg → <cc_storage_url>
[N ≤ 3인 경우 개별 나열, N > 3인 경우 단일 폴더 링크]

🎨 Firefly 보드에서 보기 → <board_url>   ← 보드 생성 실패 시 생략

비디오 워크플로우

5단계 (비디오) — 에셋 ID 가져오기

비디오 도구는 URL이 아닌 assetId가 필요합니다.

소스방법
asset_add_file을 통해 업로드반환된 assetId 사용
CC 저장소filters.mediaType: "video/mp4"와 함께 asset_search → 에셋 id 사용

6단계 (비디오) — 일반 대상

이름크기
4K / UHD3840 × 2160
1080p / HD1920 × 1080
720p1280 × 720
480p854 × 480
세로 9:161080 × 1920
정사각형 1:11080 × 1080

7단계 (비디오) — video_resize 호출

⚠️ resizeVideoPoll은 지연 도구입니다 — 폴링을 시도하기 전에 먼저 로드하세요. 로드하지 않고 직접 호출하면 "로드되지 않음" 오류와 함께 실패합니다.

video_resize({
  assetId: videoAssetId,
  width: targetW,
  height: targetH,
  mode: "letterbox"  // 기본값; 아래 모드 표 참조
})
// 반환: { jobStatus: "pending", statusId }

모드 — 정확한 API 값 사용 (사용자 대상 레이블 아님):

사용자 말함API 값동작
"fit", "preserve ratio", "letterbox""letterbox"비율 유지, 검은 막대 추가 (기본값)
"fill", "crop to fill", "no bars""crop"가장자리를 잘라 대상에 정확히 맞춤
"stretch", "force exact""stretch"대상에 정확히 맞도록 왜곡

ℹ️ 비디오 자동 재구성은 아직 Claude에서 사용할 수 없지만 새로운 도구가 계속 추가되고 있습니다. 더 많은 제어가 필요하면 Adobe Premiere를 사용해 보세요.

폴링: 호출하기 전에 지연 도구 resizeVideoPoll을 로드하세요 — 직접 호출은 "로드되지 않음" 오류와 함께 실패합니다.

// 1단계: 지연 도구 로드

8단계 (비디오) — resizeVideoPoll 호출

resizeVideoPoll({
  videoJobStatusId: statusId_from_video_resize
})
// 반환: { status: "completed" | "processing" | "failed", outputUrl?, error? }

9단계 (비디오) — 미리보기 + 전달 + Firefly 보드

asset_preview_file({
  assets: [
    { name: "video_1920x1080.mp4", presignedAssetUrl: outputUrl },
    // 모든 성공적인 출력
  ]
})

CC에 저장 + Firefly 보드 생성

이미지와 동일: asset_initialize_file_upload → PUT 청크 → asset_finalize_file_upload, 그런 다음 create_firefly_board.

완료 요약을 게시합니다:

✅ 완료! [N]개의 비디오 크기가 조정되어 준비되었습니다.

📥 다운로드:
• resized_video_1920x1080.mp4 → <cc_storage_url>

🎨 Firefly 보드에서 보기 → <board_url>   ← 보드 생성 실패 시 생략

안티패턴 및 주의사항

패턴권장 사항
imageURI에 /mnt/user-data/ 경로 전달대신 asset_add_file() 호출
CC 에셋의 renditionURL 직접 사용항상 asset_add_file()을 통해 다시 스테이징
완료 전 미리보기모든 처리가 완료될 때까지 기다린 후 asset_preview_file을 한 번 호출
각 이미지 후 Firefly 보드 생성모든 처리가 완료된 후 모든 URL로 한 번 호출
export_generic_assets로 보드 채우기import_adobe_storage를 presigned URL과 함께 사용
resizeVideoPoll을 지연 도구로 로드하지 않고 직접 호출반드시 지연된 도구를 먼저 로드

오류 처리

증상조치
adobe_mandatory_init 실패"Adobe for creativity 커넥터가 필요합니다"라고 알리고 중단
asset_add_file이 null 반환"파일 업로드를 찾을 수 없습니다 — 다시 시도해 주세요"
image_crop_and_resize 오류오류 메시지 확인; 잘못된 URI 소스(로컬 경로 확인)
비디오 유형이 감지되지 않음다른 형식의 파일을 요청 (MP4 권장)
resizeVideoPoll 시간 초과30초 후 재시도; 지속되면 실패 보고
제공된 URL이 유효하지 않음소스 파일이 여전히 존재하는지 확인; 다시 업로드 요청

요약 — 의사 결정 트리

사용자가 미디어 파일의 크기 조정 요청
  │
  ├─ 소셜 세트 언급? → `adobe-create-social-variations`로 라우팅
  │
  └─ 단일/사용자 지정 크기? → 이 스킬 사용
        │
        ├─ init → 자격 확인
        ├─ 유형 + 크기 + 맞춤 수집 (또는 사용자 메시지에서 추출)
        ├─ 파일 획득 (asset_add_file)
        │
        ├─ image/* → image_crop_and_resize (일괄 처리 가능)
        │     ├─ 미리보기
        │     └─ CC + Firefly 보드
        │
        └─ video/* → video_resize + resizeVideoPoll
              ├─ 미리보기
              └─ CC + Firefly 보드

관련 스킬