You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python将GIF白色像素转为黑色或实现GIF圆形裁剪

GIF处理实现方案

针对你要处理的原始GIF,两个需求都可以直接基于你已经在用的ffmpeg-python实现,不需要额外引入其他工具,具体方案如下:

白色像素替换为黑色

用lutrgb滤镜做像素级颜色判断即可,逻辑是识别R/G/B三个通道值都接近255的白色像素,将三个通道值置0(纯黑)。

  • 滤镜默认用宽松判断:像素三个通道值都大于240就判定为白色(兼容非纯白的抗锯齿白边),如果需要严格匹配纯#FFFFFF白色,把判断条件里的gt(xxx,240)改成eq(xxx,255)即可。
  • 对应ffmpeg-python代码片段:
stream = ffmpeg.filter(stream, 'lutrgb',
    r="if(gt(r,240)*gt(g,240)*gt(b,240), 0, r)",
    g="if(gt(r,240)*gt(g,240)*gt(b,240), 0, g)",
    b="if(gt(r,240)*gt(g,240)*gt(b,240), 0, b)"
)

圆形区域裁剪

你已经通过ffmpeg.crop(stream, 46,117,390,390)裁出了圆形的外接正方形,接下来只需要通过geq滤镜添加圆形蒙版,把正方形内圆形区域外的像素置为黑色即可:

  • 蒙版逻辑:以390*390正方形的几何中心(坐标195,195)为圆心,195像素为半径画圆,圆内像素保留原始颜色,圆外像素直接置0(黑色)。
  • 对应ffmpeg-python代码片段:
# 先裁出外接正方形
stream = ffmpeg.crop(stream, 46, 117, 390, 390)
# 应用圆形蒙版
stream = ffmpeg.filter(stream, 'geq',
    r='if(lt(pow(X-195,2)+pow(Y-195,2), pow(195,2)), r(X,Y), 0)',
    g='if(lt(pow(X-195,2)+pow(Y-195,2), pow(195,2)), g(X,Y), 0)',
    b='if(lt(pow(X-195,2)+pow(Y-195,2), pow(195,2)), b(X,Y), 0)'
)

如果圆形和正方形中心有偏移,直接修改圆心偏移值(X-xxx、Y-xxx)和半径值即可对齐。如果需要圆外区域透明,只需要新增alpha通道判断,将圆外alpha值设为0。

完整流程参考

把两个处理步骤串接,最后加上GIF专用的调色板生成逻辑避免颜色失真,完整代码如下:

import ffmpeg

# 读取输入GIF
input_stream = ffmpeg.input("your_input.gif")

# 1. 裁剪圆形外接正方形
cropped_square = ffmpeg.crop(input_stream, 46, 117, 390, 390)

# 2. 圆形蒙版裁剪
circle_cropped = ffmpeg.filter(cropped_square, 'geq',
    r='if(lt(pow(X-195,2)+pow(Y-195,2), pow(195,2)), r(X,Y), 0)',
    g='if(lt(pow(X-195,2)+pow(Y-195,2), pow(195,2)), g(X,Y), 0)',
    b='if(lt(pow(X-195,2)+pow(Y-195,2), pow(195,2)), b(X,Y), 0)'
)

# 3. 白色像素替换为黑色
replaced_color = ffmpeg.filter(circle_cropped, 'lutrgb',
    r="if(gt(r,240)*gt(g,240)*gt(b,240), 0, r)",
    g="if(gt(r,240)*gt(g,240)*gt(b,240), 0, g)",
    b="if(gt(r,240)*gt(g,240)*gt(b,240), 0, b)"
)

# 4. 生成优化调色板,避免GIF导出颜色偏差
palette = ffmpeg.filter(replaced_color, 'palettegen', stats_mode='full')
output_stream = ffmpeg.filter([replaced_color, palette], 'paletteuse', dither='bayer')

# 导出结果
ffmpeg.output(output_stream, "processed_result.gif").run(overwrite_output=True)

调试时可以先把输出格式设为mp4快速验证效果,确认裁剪范围、颜色替换逻辑正确后再导出GIF,能大幅节省调试时间。

内容的提问来源于stack exchange,提问作者tcleckner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 14:21:13