如何使用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
相关产品推荐
相关产品推荐

