zoukankan      html  css  js  c++  java
  • C#修改GIF大小同时保持GIF仍然可动和背景透明

    /// <summary> 
     
            /// 设置GIF大小 
            /// </summary> 
            /// <param name="path">图片路径</param> 
            /// <param name="width"></param> 
            /// <param name="height"></param> 
            private void setGifSize(string path, int width, int height) 
            { 
                Image gif = new Bitmap(width, height); 
                Image frame = new Bitmap(width, height); 
                Image res = Image.FromFile(path); 
                Graphics g = Graphics.FromImage(gif); 
                Rectangle rg = new Rectangle(0, 0, width, height); 
                Graphics gFrame = Graphics.FromImage(frame); 
     
                foreach (Guid gd in res.FrameDimensionsList) 
                { 
                    FrameDimension fd = new FrameDimension(gd); 
     
    //因为是缩小GIF文件所以这里要设置为Time,如果是TIFF这里要设置为PAGE,因为GIF以时间分割,TIFF为页分割 
                    FrameDimension f = FrameDimension.Time; 
                    int count = res.GetFrameCount(fd); 
                    ImageCodecInfo codecInfo = GetEncoder(ImageFormat.Gif); 
                    System.Drawing.Imaging.Encoder encoder = System.Drawing.Imaging.Encoder.SaveFlag; 
                    EncoderParameters eps = null; 
     
                    for (int i = 0; i < count; i++) 
                    { 
                        res.SelectActiveFrame(f, i); 
                        if (0 == i) 
                        { 
                             
                            g.DrawImage(res, rg); 
     
                            eps = new EncoderParameters(1); 
     
    //第一帧需要设置为MultiFrame 
     
                            eps.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.MultiFrame); 
                            bindProperty(res, gif); 
                            gif.Save(@"C:	mp	estaaa.gif", codecInfo, eps); 
                        } 
                        else 
                        { 
                             
                            gFrame.DrawImage(res, rg); 
     
                            eps = new EncoderParameters(1); 
     
    //如果是GIF这里设置为FrameDimensionTime,如果为TIFF则设置为FrameDimensionPage 
     
                            eps.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.FrameDimensionTime); 
     
                            bindProperty(res, frame); 
                            gif.SaveAdd(frame, eps); 
                        } 
                    } 
     
                    eps = new EncoderParameters(1); 
                    eps.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.Flush); 
                    gif.SaveAdd(eps); 
                } 
            } 
     
            /// <summary> 
            /// 将源图片文件里每一帧的属性设置到新的图片对象里 
            /// </summary> 
            /// <param name="a">源图片帧</param> 
            /// <param name="b">新的图片帧</param> 
            private void bindProperty(Image a,Image b) 
     
            { 
     
    //这个东西就是每一帧所拥有的属性,可以用GetPropertyItem方法取得这里用为完全复制原有属性所以直接赋值了 
     
    //顺便说一下这个属性里包含每帧间隔的秒数和透明背景调色板等设置,这里具体那个值对应那个属性大家自己在msdn搜索GetPropertyItem方法说明就有了 
     
                for (int i = 0; i < a.PropertyItems.Length; i++) 
                { 
                    b.SetPropertyItem(a.PropertyItems[i]); 
                } 
            } 
     
            private ImageCodecInfo GetEncoder(ImageFormat format) 
            { 
     
                ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders(); 
     
                foreach (ImageCodecInfo codec in codecs) 
                { 
                    if (codec.FormatID == format.Guid) 
                    { 
                        return codec; 
                    } 
                } 
                return null; 
            }
  • 相关阅读:
    VS Code安装以及工作区的创建
    var let const的使用和区别
    springboot 配置mysql日期返回格式
    vue安装Node和NPM配置,路由安装。
    分组查询语句(group by函数)
    ORA-00918:未明确定义列
    内连接(inner join)
    右外连接(right join)
    左外连接(left join)
    比较oracle两表中date类型数据是否一致语句查询
  • 原文地址:https://www.cnblogs.com/rinack/p/3500239.html
Copyright © 2011-2022 走看看