3行代码实现gif裁切

 

最近在做动态二维码的时候碰到一个问题,从网上下载的动态gif不是正方形的,很难看,本来想找个软件来处理的,竟然没找到,只好自己动手。

先来看效果:

before

after

 

代码的确只有三行:

第一行:读取gif图片。 

第二行:分解gif图片帧并进行裁切。 

第三行:按照原gif的参数组装新的gif。

代码如下(需要用到PIL库):

def crop_gif_short(gif, gif_out, box):
    im = Image.open(gif)
    frames = [im.crop(box) for frame in range(0, im.n_frames) if not im.seek(frame)]
    frames[0].save(gif_out, save_all=True, append_images=frames, loop=0, duration=im.info['duration'])

可读性更高一点的版本:

def crop_gif(gif, box):
    """
    Crop gif picture.
    Args:
        gif: gif file name
        box: crop box (left, up, right, down)
    """
    _, file = os.path.split(gif)
    name, ext = os.path.splitext(file)

    im = Image.open(gif)
    frames = []
    for frame in range(0, im.n_frames):
        im.seek(frame)
        frames.append(im.crop(box))
    frames[0].save(name + '_crop' + ext,
                   save_all=True,
                   append_images=frames,
                   loop=0,
                   duration=im.info['duration'])

 

另外,生成动态二维码也只需要一行代码,如下(需要用到myqr库):

myqr.run( words = get_text(origin),
              version = 1,
              level = 'H',
              picture = picture,
              colorized = True,
              contrast = 2.0,
              brightness = 1.0,
              save_name = save_name,
              save_dir = path)

其中words是二维码内容,picture是背景图,save_name是保存名称,save_dir是保存路径。

二维码内容可以通过pyzbar库进行读取,代码如下(需要用到pyzbar库):

def get_text(f):
    return ''.join([_.data.decode('utf-8') for _ in pyzbar.decode(Image.open(f))])

生成的动态二维码效果如下:

 

 

 

 

(↓ 扫我加关注 ↓)

在C语言中直接显示GIF并不是标准库的一部分,因为C语言本身不提供形用户界面(GUI)的处理。不过,如果你的目标是在嵌入式系统或特定环境下运,可能有一些库如libgifgiflib这样的第三方库可以帮助你在C语言中读取和显示GIF。 例如,使用giflib库,你可以通过以下几个步骤来实现: 1. 安装giflib库:确保你的编译环境已包含这个库,或者从其官网下载并安装。 2. 包含头文件:在你的C源文件中包含`gif_lib.h`,以便使用库中的函数。 3. 加载GIF文件:使用`GifFile* GifOpenFileName(const char *filename)`打开一个GIF文件。 4. 获取像数据:读取动画帧的数据。 ```c GifFileType *gif = GifOpenFileName("your_gif_file.gif"); if (gif == NULL) { // 处理错误 } // 获取像的信息 ImageDesc *desc = &gif->Image; ``` 5. 显示像:如果你在一个支持的平台上,比如Linux终端或某些嵌入式设备,可以尝试用ASCII艺术或者其他方法模拟显示。如果在GUI环境中,你可能需要使用外部库来绘制。 6. 逐帧显示:处理动画的每一帧,并循环播放。 7. 关闭文件:完成播放后,记得调用`GifCloseFile(gif)`关闭GIF文件。 由于C语言本身的限制,实际的显示操作可能会非常复杂,且依赖于目标平台的特性。如果你需要在形界面上显示GIF,通常会使用C++、Java或类似的语言,结合专门的GUI库或跨平台框架如Qt或wxWidgets。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值