Django Rest Framework中如何处理GIF图片以保留动画效果?
解决Django中处理GIF丢失动画的问题
首先修正模型代码里的笔误:model.Model 应该改为 models.Model。
你遇到的核心问题是 ProcessedImageField 默认的 SmartResize 处理器会将GIF转为静态图片(仅保留第一帧),导致动画丢失。解决思路是对GIF图片跳过图像处理步骤,仅处理非GIF图片,具体实现如下:
步骤1:导入必要模块
from django.db import models from imagekit.models import ProcessedImageField from imagekit.processors import SmartResize, conditional_processor import imghdr
步骤2:修改模型字段
使用 conditional_processor 实现条件处理,仅对非GIF图片应用缩放:
class GiftCardPlan(models.Model): # ... 其他字段 ... image = ProcessedImageField( null=True, blank=True, upload_to=giftcardplan_image_path, processors=[ conditional_processor( # 判断是否为非GIF图片 lambda img: imghdr.what(img.file) != 'gif', # 仅对非GIF应用缩放 SmartResize(480, 290, upscale=False) ) ], # quality参数对GIF无效,可调整为仅针对非GIF设置,或移除 options={'quality': 100} )
步骤3:验证序列化器
你的 Base64ImageField 只需保持原样即可,因为它只是将图片文件编码为Base64格式,不会破坏GIF的动画结构。
可选:保留GIF动画同时调整尺寸
如果需要对GIF进行尺寸调整且保留动画,需要自定义处理器遍历每一帧处理:
from PIL import Image, ImageSequence class AnimatedGifResize: def __init__(self, width, height, upscale=False): self.width = width self.height = height self.upscale = upscale def process(self, img): if img.format != 'GIF': return img frames = [] duration = img.info.get('duration', 100) loop = img.info.get('loop', 0) # 遍历每一帧处理 for frame in ImageSequence.Iterator(img): frame = frame.copy() if not self.upscale and (frame.width <= self.width or frame.height <= self.height): resized_frame = frame else: resized_frame = frame.resize((self.width, self.height), Image.Resampling.LANCZOS) frames.append(resized_frame) # 重新组合GIF output = frames[0] output.save( img.file, format='GIF', save_all=True, append_images=frames[1:], duration=duration, loop=loop, disposal=2 ) return img # 在模型中使用自定义处理器 processors=[ conditional_processor( lambda img: img.format != 'GIF', SmartResize(480, 290, upscale=False) ), conditional_processor( lambda img: img.format == 'GIF', AnimatedGifResize(480, 290, upscale=False) ) ]
注意:自定义GIF尺寸处理需要确保PIL版本支持 Image.Resampling.LANCZOS(Python 3.9+),旧版本可使用 Image.LANCZOS。
内容的提问来源于stack exchange,提问作者Hamza.S
相关产品推荐
相关产品推荐

