为Slack创建优化动画GIF的知识和工具包。提供约束条件、验证工具和动画概念。当用户请求为Slack创建动画GIF时使用,如为Slack制作一个X做Y的GIF。技能概述slack-gif-creator 技能是一个专门用于创建和优化Slack动画GIF的工具包。它提供了完整的工具集,包括GIF构建器、验证器、缓动函数和帧组合工具,帮助开发者创建符合Slack要求的优化GIF文件。此技能不仅提供了Slack的GIF要求和约束,还提供了丰富的动画概念和实用工具,使开发者能够创建专业、流畅且文件大小优化的GIF动画。它支持从零开始绘制图形,也可以处理用户上传的图像,提供了极大的灵活性。下载地址:https://github.com/anthropics/skills/tree/main/skills主要功能GIF构建器: 提供GIFBuilder类来组装帧并优化GIF输出验证工具: 提供validate_gif和is_slack_ready函数来检查GIF是否符合Slack要求缓动函数: 提供多种缓动函数(linear、ease_in、ease_out、bounce_out等)来创建平滑动画帧组合工具: 提供创建空白帧、渐变背景、绘制圆形、文本、星星等实用函数动画概念: 提供抖动、脉冲、弹跳、旋转、淡入淡出、滑动、缩放、爆炸等动画概念优化策略: 提供多种优化方法来减小GIF文件大小触发条件在以下情况下应该调用此技能:用户请求为Slack创建动画GIF,如为Slack制作一个GIF用户要求创建特定主题的GIF动画,如制作一个弹跳球的GIF用户需要优化GIF以符合Slack的尺寸和文件大小要求用户需要创建表情符号GIF或消息GIF用户需要验证GIF是否符合Slack的技术要求使用场景创建表情符号GIF当用户需要创建128x128像素的表情符号GIF时,使用此技能提供的工具和优化策略来创建符合Slack要求的GIF。创建消息GIF当用户需要创建480x480像素的消息GIF时,使用此技能提供的动画概念和绘制工具来创建吸引人的动画效果。处理用户上传的图像当用户上传图像并要求制作动画时,使用PIL加载图像并根据用户需求直接使用或作为灵感参考。Slack要求表情符号GIF: 128x128像素(推荐)消息GIF: 480x480像素帧率(FPS): 10-30帧/秒(越低文件越小)颜色数量: 48-128种颜色(越少文件越小)持续时间: 表情符号GIF保持在3秒以下处理过程1. 理解用户需求分析用户的请求,确定他们想要创建什么类型的GIF。如果用户上传了图像,判断他们是想要直接使用它还是仅作为灵感参考。提示:使用PIL的Image.open()函数加载用户上传的图像,然后根据请求决定是直接使用还是仅参考其颜色/样式。2. 创建GIFBuilder实例根据GIF类型创建GIFBuilder实例,设置适当的尺寸和帧率。from core.gif_builder import GIFBuilder# 表情符号GIFbuilder GIFBuilder(width128, height128, fps10)# 消息GIFbuilder GIFBuilder(width480, height480, fps15)3. 生成帧使用PIL的ImageDraw原语绘制每一帧。可以使用提供的实用函数如create_blank_frame、draw_circle、draw_star等。from PIL import Image, ImageDrawfrom core.frame_composer import create_blank_frame, draw_circle# 生成12帧for i in range(12):frame create_blank_frame(128, 128, (240, 248, 255))draw ImageDraw.Draw(frame)# 使用PIL原语绘制动画draw.ellipse([x1, y1, x2, y2], fill(r, g, b), outline(r, g, b), width3)builder.add_frame(frame)4. 应用动画概念根据需求应用适当的动画概念,如抖动、脉冲、弹跳、旋转等。使用缓动函数创建平滑的运动效果。from core.easing import interpolate# 使用缓动函数t i / (num_frames - 1)y interpolate(start0, end400, tt, easingbounce_out)5. 保存并优化GIF使用GIFBuilder的save方法保存GIF,并根据需要应用优化策略。# 保存并优化builder.save(output.gif,num_colors48,optimize_for_emojiTrue,remove_duplicatesTrue)可用工具GIFBuilder (core.gif_builder)组装帧并为Slack优化的主要工具:builder GIFBuilder(width128, height128, fps10)builder.add_frame(frame) # 添加PIL图像builder.add_frames(frames) # 添加帧列表builder.save(out.gif, num_colors48, optimize_for_emojiTrue, remove_duplicatesTrue)Validators (core.validators)检查GIF是否符合Slack要求:from core.validators import validate_gif, is_slack_ready# 详细验证passes, info validate_gif(my.gif, is_emojiTrue, verboseTrue)# 快速检查if is_slack_ready(my.gif):print(Ready!)Easing Functions (core.easing)平滑运动而非线性运动:from core.easing import interpolate# 从0.0到1.0的进度t i / (num_frames - 1)# 应用缓动y interpolate(start0, end400, tt, easingease_out)# 可用: linear, ease_in, ease_out, ease_in_out,# bounce_out, elastic_out, back_outFrame Helpers (core.frame_composer)常见需求的便捷函数:from core.frame_composer import (create_blank_frame, # 纯色背景create_gradient_background, # 垂直渐变draw_circle, # 圆形辅助函数draw_text, # 简单文本渲染draw_star # 五角星)动画概念抖动/震动 (Shake/Vibrate)使用振荡偏移对象位置:使用math.sin()或math.cos()配合帧索引,为自然感添加小的随机变化,应用于x和/或y位置。脉冲/心跳 (Pulse/Heartbeat)有节奏地缩放对象大小:使用math.sin(t * frequency * 2 * math.pi)进行平滑脉冲,心跳:两次快速脉冲然后暂停,在基础大小的0.8到1.2之间缩放。弹跳 (Bounce)对象下落并弹跳:使用interpolate()配合easingbounce_out进行着陆,使用easingease_in进行下落(加速),通过每帧增加y速度来应用重力。旋转 (Spin/Rotate)围绕中心旋转对象:PIL: image.rotate(angle, resampleImage.BICUBIC),对于摆动:使用正弦波作为角度而非线性。淡入/淡出 (Fade In/Out)逐渐出现或消失:创建RGBA图像,调整alpha通道,或使用Image.blend(image1, image2, alpha),淡入:alpha从0到1,淡出:alpha从1到0。滑动 (Slide)从屏幕外移动对象到位置:起始位置:在帧边界外,结束位置:目标位置,使用interpolate()配合easingease_out进行平滑停止,对于过冲:使用easingback_out。缩放 (Zoom)缩放和定位以产生缩放效果:放大:从0.1缩放到2.0,裁剪中心,缩小:从2.0缩放到1.0,可以添加运动模糊以增加戏剧性(PIL滤镜)。爆炸/粒子爆发 (Explode/Particle Burst)创建向外辐射的粒子:生成具有随机角度和速度的粒子,更新每个粒子:x vx, y vy,添加重力:vy gravity_constant,随时间淡出粒子(减少alpha)。优化策略仅在被要求使文件更小时,实施以下几种方法:更少的帧: 降低FPS(10而不是20)或更短的持续时间更少的颜色: num_colors48而不是128更小的尺寸: 128x128而不是480x480删除重复: 在save()中使用remove_duplicatesTrue表情符号模式: optimize_for_emojiTrue自动优化# 表情符号的最大优化 builder.save( emoji.gif, num_colors48, optimize_for_emojiTrue, remove_duplicatesTrue )输入要求使用此技能时,用户需要提供:GIF的描述或主题(如弹跳球、旋转星星等)GIF类型(表情符号GIF或消息GIF)可选的上传图像(如果需要使用或参考)可选的动画参数(如持续时间、帧率等)可选的优化要求(如文件大小限制)输出说明技能将提供:符合Slack要求的优化GIF文件GIF的详细信息(路径、大小、尺寸、帧数、FPS、持续时间、颜色数)优化建议(如果文件过大)使用示例示例1: 创建弹跳球GIFfrom core.gif_builder import GIFBuilderfrom core.easing import interpolatefrom PIL import Image, ImageDraw# 创建builderbuilder GIFBuilder(width128, height128, fps15)# 生成帧num_frames 20for i in range(num_frames):frame Image.new(RGB, (128, 128), (240, 248, 255))draw ImageDraw.Draw(frame)# 使用弹跳缓动t i / (num_frames - 1)y interpolate(start10, end100, tt, easingbounce_out)# 绘制球draw.ellipse([54, int(y), 74, int(y)20],fill(255, 100, 100),outline(200, 50, 50),width2)builder.add_frame(frame)# 保存GIFbuilder.save(bouncing_ball.gif, num_colors48, optimize_for_emojiTrue)示例2: 创建旋转星星GIFfrom core.gif_builder import GIFBuilderfrom core.frame_composer import create_blank_frame, draw_starfrom PIL import Image# 创建builderbuilder GIFBuilder(width128, height128, fps12)# 生成帧num_frames 24for i in range(num_frames):frame create_blank_frame(128, 128, (25, 25, 112))# 绘制星星(带发光效果)draw_star(frame, (64, 64), 30, (255, 215, 0),outline_color(255, 255, 0), outline_width2)draw_star(frame, (64, 64), 40, (255, 215, 0, 100)) # 半透明发光builder.add_frame(frame)# 保存GIFbuilder.save(rotating_star.gif, num_colors64, optimize_for_emojiTrue)最佳实践使用较粗的线条: 始终为轮廓和线条设置width2或更高。细线(width1)看起来粗糙且不专业。添加视觉深度: 使用渐变作为背景(create_gradient_background),分层多个形状以增加复杂性(如带有内部较小星星的星星)。使形状更有趣: 不要只画一个简单的圆 - 添加高光、圆环或图案,星星可以有发光效果(在后面绘制更大、半透明的版本),组合多个形状(星星闪光,圆圆环)。注意颜色: 使用鲜艳、互补的颜色,添加对比度(浅色形状上的深色轮廓,深色形状上的浅色轮廓),考虑整体构图。对于复杂形状: 使用多边形和椭圆的组合,仔细计算点以保持对称性,添加细节(心形可以有高光曲线,雪花有复杂的分支)。不要使用表情符号字体: 跨平台不可靠,不要假设此技能中存在预打包的图形。结合动画概念: 创造性地组合概念(弹跳旋转,脉冲滑动等)并使用PIL的完整功能。仅在需要时优化: 只有在被要求使文件更小时才实施优化策略。依赖项pip install pillow imageio numpy设计理念此技能提供:知识: Slack的要求和动画概念工具: GIFBuilder、验证器、缓动函数灵活性: 使用PIL原语创建动画逻辑此技能不提供:僵化的动画模板或预制函数表情符号字体渲染(跨平台不可靠)内置在技能中的预打包图形库