Communitygithub.com

kalash33/adobe-resize-photos-and-videos

使用Adobe工具将照片和视频调整为精确的像素尺寸或宽高比。

adobe-resize-photos-and-videos 是什么?

该技能专为AI代理(如Claude Code、Cursor等)设计,用于调用Adobe工具集(通过“Adobe for creativity”连接器)来调整图像和视频的尺寸。它能够处理用户各种关于缩放、裁剪、更改分辨率或设置特定宽高比(如16:9、4:5)的请求,支持自定义尺寸、预设(如4K、HD、A4)和宽高比字符串。该技能会自动识别文件类型(图片或视频),并路由到对应的工具链:图片使用`image_crop_and_resize`,视频使用`video_resize`(支持轮询)。它包含一个完整的引导式多步流程来收集缺失的参数(类型、尺寸、适配模式等),并支持批量处理、预览输出、保存到Creative Cloud以及创建Firefly画板。

兼容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/kalash33/kstack/tree/HEAD/skills/adobe-adobe-resize-photos-and-videos

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

Adobe 调整照片和视频尺寸

将图像或视频调整为用户指定的尺寸、宽高比或命名尺寸。 对于社交媒体平台集(Instagram、TikTok 等),请改用 adobe-create-social-variations 技能。


工具参考

步骤工具说明
打开文件选择器asset_add_file返回 presignedAssetUrl、assetId 和 mediaType
在 CC 中查找资源asset_search对于图像,通过 asset_add_file 重新暂存结果;对于视频,直接使用 id
渲染 PSD/AIdocument_render_vector在调整大小前转换为 JPEG
调整图像大小image_crop_and_resize每个尺寸调用一次;默认为 reframe
预览输出asset_preview_file所有输出在单次调用中处理
上传到 CC(开始)asset_initialize_file_upload块上传流水线的第一次调用
上传到 CC(完成)asset_finalize_file_upload第二次调用;返回用于画板的预签名 CC URL
创建 Firefly 画板create_firefly_board使用 import_adobe_storage 传递最终化 URL
调整视频大小video_resize返回用于轮询的 statusId
轮询视频调整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 — 故事/Reels",
    "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 — Reels/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: [
    "重新构图 — 裁剪以填充",
    "填充 — 添加黑边,不裁剪",
    "提取 — 隔离主体"
  ]
}])

如果是视频(single_select):

AskUserQuestion([{
  question: "适配模式",
  type: "single_select",
  options: [
    "信箱 — 保持比例",
    "裁剪 — 填充,无黑边",
    "拉伸 — 强制精确(变形)"
  ]
}])

步骤 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() 以获取单个预签名 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 画板

预览后,使用块上传流水线将每个输出上传到 CC 存储 (asset_initialize_file_upload → PUT 块 → asset_finalize_file_upload)。

然后使用最终输出 URL 调用 firefly 画板工具:

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

✅ 确认有效(Stage): 使用来自 asset_finalize_file_upload 的预签名 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

视频工具需要 assetId,而不是 URL。

来源方法
通过 asset_add_file 上传使用返回的 assetId
CC 存储asset_search 使用 filters.mediaType: "video/mp4" → 使用资源 id

步骤 6(视频)— 常见目标

名称尺寸
4K / UHD3840 × 2160
1080p / HD1920 × 1080
720p1280 × 720
480p854 × 480
纵向 9:161080 × 1920
方形 1:11080 × 1080

步骤 7(视频)— 调用 video_resize

⚠️ resizeVideoPoll 是一个延迟工具 — 在尝试轮询之前请先加载它。 直接调用会失败并显示 "not loaded" 错误。

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 之前先加载它 — 直接调用会失败并显示 "not loaded"。

// 步骤 1:加载延迟工具

…

相关技能