python笔记之GIF的制作


本文使用的包为:imageio

基本用法及参数解释:

介绍完了,上代码!

import imageio
def create_gif(image_list,gif_name,duration=0.5):
    """
    :param image_list: 原始图片,png
    :param gif_name: gif的文件名
    :param duration: 间隔时间
    path:路径
    :return:
    """
    
    frames = []
    for image_name in image_list:
        frames.append(imageio.imread(image_name))
    #保存为GIF
    imageio.mimsave(gif_name,frames,'GIF',duration = duration)
    return

#这个duration表示的是:
def main():
    image_list = ['1.png','2.png','3.png','4.png']
    gif_name = 'first.gif'
    duration = 1.5
    create_gif(image_list,gif_name)

#当前程序被当作主程序运行时, __ name__被自动赋值为固定的字符串__main__;当它被当作模块被其他文件调用时,自动被赋值为模块所在的文件名
if __name__ == '__main__':
    main()

在这里就顺便记一下if name == 'main’的具体用法及说明(其实我之前真的不是很理解这行代码)

__name__本身其实就是一个变量,当前程序被当作主程序运行时, __ name__被自动赋值为固定的字符串__main__;当它被当作模块被其他文件调用时,自动被赋值为模块所在的文件名

报错解决:

忽然发现是少打了一个字母,上面的代码是修改过的,请放心使用!( ̄▽ ̄)~*

import imageio
import matplotlib.pyplot as plt
from pygifsicle import optimize

n = 100
gif_path = "test.gif"
frames_path = "{i}.jpg"

n = 100
plt.figure(figsize=(4,4))
for i, x in enumerate(range(n)):
    plt.scatter(x/n, x/n)
    plt.xlim(0, 1)
    plt.ylim(0, 1)
    plt.savefig("{i}.jpg".format(i=i))

with imageio.get_writer(gif_path, mode='I') as writer:
    for i in range(n):
        writer.append_data(imageio.imread(frames_path.format(i=i)))

optimize(gif_path)

这是官方的GIF优化的方法!

其他有趣的操作!

图片操作

将指定颜色变透明 只能保存 png jpg

  /**
     * 将指定颜色变透明 只能保存 png jpg
     *
     * @param imageSrc
     * @param mask
     * @return
     */
    public static BufferedImage createImageByMaskColorEx(
            BufferedImage imageSrc, Color mask) {
        int x, y;
        x = imageSrc.getWidth(null);
        y = imageSrc.getHeight(null);
        BufferedImage imageDes = new BufferedImage(x, y,
                BufferedImage.TYPE_4BYTE_ABGR);
        WritableRaster rasterDes = imageDes.getRaster();
        int[] des = new int[4];
        while (--x >= 0)
            for (int j = 0; j < y; ++j) {
                int rgb = imageSrc.getRGB(x, j);
                int sr, sg, sb;
                sr = (rgb & 0xFF0000) >> 16;
                sg = (rgb & 0xFF00) >> 8;
                sb = rgb & 0xFF;
                if (sr == mask.getRed() && sg == mask.getGreen()
                        && sb == mask.getBlue()) {
                    des[3] = 0;
                } else {
                    des[0] = sr;
                    des[1] = sg;
                    des[2] = sb;
                    des[3] = 255;
                }
                rasterDes.setPixel(x, j, des);
            }
        return imageDes;
    }

按倍率缩小图片

  /**
     * 按倍率缩小图片
     *
     * @param imageSrc    读取图片路径
     * @param imageDest   写入图片路径
     * @param widthRatio  宽度缩小比例
     * @param heightRatio 高度缩小比例
     */
    public static void reduceImageByRatio(String imageSrc, String imageDest, int widthRatio, int heightRatio) {
        FileOutputStream outputStream = null;
        try {
            File file = new File(imageSrc);
            BufferedImage read = ImageIO.read(file);
            int width = read.getWidth();
            int height = read.getHeight();
            /**
             * 根据缩放比较 构建新的BufferImage 对象
             */
            BufferedImage destBufferImage = new BufferedImage(width / widthRatio, height / heightRatio, BufferedImage.TYPE_INT_RGB);
            /**
             * 绘制 缩小  后的图片
             */
            destBufferImage.getGraphics().drawImage(read, 0, 0, width / widthRatio, height / heightRatio, null);
            outputStream = new FileOutputStream(imageDest);
            ImageIO.write(destBufferImage, "jpg", outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

指定图形的长和宽

 /**
  * 指定图形的长和宽
  *
  * @param iamgeSrc
  * @param imageDest
  * @param width
  * @param height
  * @throws IOException
  */
 public static void resizeImage(String iamgeSrc, String imageDest, int width, int height) {
     FileOutputStream outputStream = null;
     try {
         //读入文件
         File file = new File(iamgeSrc);
         // 构造Image对象
         BufferedImage src = javax.imageio.ImageIO.read(file);
         // 放大边长
         BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
         //绘制放大后的图片
         tag.getGraphics().drawImage(src, 0, 0, width, height, null);
         outputStream = new FileOutputStream(imageDest);
         outputStream = new FileOutputStream(imageDest);
         ImageIO.write(tag, "jpg", outputStream);
     } catch (Exception e) {
         e.printStackTrace();
     }
 }

更多操作请看:https://blog.csdn.net/baidu_28665563/article/details/82887485


文章作者: 古客
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 古客 !
评论
 上一篇
python之三个数据类型 python之三个数据类型
由于老是记不住python的list,字典,元组等表示的方法及区别,经常会搞混,所以特地写了这篇文章来加强记忆和复习。 list(列表)符号[],用‘’包起来,用逗号分开 例子: fish = ['大鱼','鱼','小鱼','fish']
2020-02-12 古客
下一篇 
Markdown数学公式的使用 Markdown数学公式的使用
常用符号 几乎所有数学公式有需要用$$将其包围。 上标、下标与组合 上标符号,符号:^,如:$x^4$ 下标符号,符号:_,如:$x_1$ 组合符号,符号:{},如:${16}{8}O{2+}{2}$ 占位符 两个quad空格,符号
2020-02-11
  目录