精华内容
下载资源
问答
  • C# gif类库

    2016-09-01 12:05:47
    C# gif类库
  • C#gif相关操作

    2017-09-25 18:12:00
    C#gif相关操作代码,非常实用,需要的可以下载。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
  • GIFLIB C# GIF图片处理组件GIFLIB C# GIF图片处理组件GIFLIB C# GIF图片处理组件GIFLIB C# GIF图片处理组件GIFLIB C# GIF图片处理组件GIFLIB C# GIF图片处理组件GIFLIB C# GIF图片处理组件
  • c#Gif操作类,能处理GIF图片 c#Gif操作类,能处理GIF图片
  • C# Gif屏幕录制工具

    热门讨论 2016-03-18 22:09:37
    * 名称:GIF屏幕录制demo * 作者:Crystal_lz * 时间:2016-03-18 * 博客:var.la,clzf.co(最近关闭) * 简介:本来代码想全部自己写的 找了关于gif文件格式的资料还有lzw压缩算法 * 可是发现这些还不够 不知道...
  • C#GIF播放器源代码

    2010-11-11 15:23:41
    GIF播放器 GIF图片播放器 播放GIF图片 C#源代码
  • C#GIF动画验证码!

    2013-06-14 13:11:39
    这是一款C#中的验证码 特色:验证码支持GIF动画,水印 本身亲自验证过. 很多人发布的为了争积分内容不符,要不就不能使用!
  • C# GIF转字符画代码

    2019-01-11 13:16:58
    单单只是将静态图转换为字符画,功能貌似太过单一。 于是,小编便想着,既然静态图可以转换为字符画,那么动态图是否也可以呢。 毕竟,动态图不也就是许多静态图拼凑在一起生成的吗? 本次教学中,我将教大家如何...
  • 本文将详细介绍下c#实现gif动画添加图片水印,思路很清晰,感兴趣的你可以参考下哈,希望可以帮助到你
  • C# gif添加水印

    2017-12-05 17:44:06
    想做个gif添加水印的东西 然后上网查各种资料 先是看了这位大神的: http://www.cnblogs.com/livexy/archive/2010/07/05/1771714.html 上面直接就有 心中窃喜...哇没想到这么简单.. 不过把code弄下来之后发现gif...

    想做个gif添加水印的东西

    然后上网查各种资料

    先是看了这位大神的:

    http://www.cnblogs.com/livexy/archive/2010/07/05/1771714.html

    上面直接就有  心中窃喜...哇没想到这么简单..

    不过把code弄下来之后发现gif貌似不管用啊....其他jpg png我就没去试了..

    后面又找了很多资料 找资料的过程中 慢慢换了思路 gif可以分解成很多张 jpg (也就是帧数)

    我只需要把每一帧都加上水印 然后在 合并起来就可以了  谁知道想得倒是很简单啊 实行起来真特么难啊 找不到资料啊

    连第一步都搞不定了...

    直到找到了这个文章: http://blog.sina.com.cn/s/blog_4c6e822d0102dzin.html

    现在 gif可以 拆分成很多帧数的图片了 保存起来也没有什么问题(我用某看图王看gif的时候 发现是231帧数 用这个code处理之后保存的图片也是231帧)

    ok现在全部可以保存成jpg了吧  jpg加水印很简单 百度搜索一下即可!其实就跟平时做的验证码差不多..

    ok 那现在就开始找 将jpg合成保存成gif的代码

    然后发现 博客里面说的都需要一个 dll   Gif.Components.dll   然后借助于这个类 AnimatedGifEncoder 来实现 不知道百度一下 肯定有很多博客的.看看就好了

    这里要鄙视一些博客搬运工,你特么的抄袭人家的东西 自己从来都没有跑过?直接拿过去就粘贴上去???找资料的时候碰见好多一模一样的东西 问题还尼玛的不能运行.比如在找AnimatedGifEncoder的时候  这个类里面貌似需要引用另外的两个类 但是另外的两个类从来没有人提到过???能不能有点出息...

    找了半天 终于把dll找到了  特么的 全部都需要劳资注册 登录 有些还需要积分...有点醉.

    这里给大家免费上传上去,呃..刚在传的时候发现不能选0???不过咱们是程序猿,把dom改一下就行了 把select里面的值改下就好了..

     

    发上去 待审核,过一分钟刷新一下就好了 地址: http://download.csdn.net/download/u010067685/10146670

    好了 现在jpg合成gif的dll也有了 又到了动手code的时候了

     

    private void but2_Click(object sender, EventArgs e)
            {
                var path = txt1.Text;//原图
                var fileName = path.Split('\\')[path.Split('\\').Length - 1];//文件名
                var extension = fileName.Split('.')[fileName.Split('.').Length - 1];//后缀名
                Image img = Image.FromFile(txt1.Text);
    
                FrameDimension ImgFrmDim = new FrameDimension(img.FrameDimensionsList[0]);
    
                //Determine the number of frames in the image
                //Note that all images contain at least 1 frame,
                //but an animated GIF will contain more than 1 frame.
                int nFrameCount = img.GetFrameCount(ImgFrmDim);
                // Save every frame into jpeg format
    
                var paths = new List<string>();//存放路径的
                //List<Image> imgs=new List<Image>();//保存每一帧
     //以下是拆分步骤
                for (int i = 0; i < nFrameCount; i++)
                {
                    img.SelectActiveFrame(ImgFrmDim, i);
                    var temppath = string.Format(txt3.Text + "_{0}new.jpg", i);//把每一帧图片保存
                    //var temppath = string.Format(txt3.Text + "_new.jpg");
                    Graphics g1 = Graphics.FromImage(img);
                    //2:声明graphicse把img做为填充他的参数
                    //g1.DrawString("天天搞笑动图", new Font("楷体", 20, FontStyle.Regular), Brushes.Blue, 10, 10);
                    SolidBrush drawBrush = new SolidBrush(Color.FromArgb(255, 180, 0));
                    g1.DrawString("动图", new Font("楷体", 20, FontStyle.Regular), drawBrush, 10, 10);//加水印
    
                    //g1.DrawString("", new Font("楷体", 20, FontStyle.Regular),,10,10)
    
                    //img.Save(temppath, ImageFormat.Jpeg);
    
                    img.Save(temppath, ImageFormat.Jpeg);//保存 每次保存你可以去文件夹中去看到每张jpg
    
                    paths.Add(temppath);//保存路径
    //!!!! 用一个临时的变量 将img赋给 tempimg  imgs.add(tempimg);
     }
    //运行到这一步的时候 图片全部保存完毕
                AnimatedGifEncoder MyGif = new AnimatedGifEncoder();
                MyGif.Start(txt3.Text + "/" + fileName.Split('.')[0] + "_new." + extension);//保存路径
                //MyGif.SetDelay(200);//帧率
                //MyGif.SetSize(300, 300);//尺寸
                MyGif.SetRepeat(0);//重复
    
                foreach (var item in paths)
                {
                    MyGif.AddFrame(Image.FromFile(item));//加入单张图片
                }
                //那这里就直接遍历 imgs就可以了 将item加入到 mygif里面去 
     MyGif.Finish();
    //到这一步的时候已经处理完毕 去文件夹下面看应该是能看到加了水印的gif了  这时候只需要把 paths里面的每一帧的图片全部删除就好了   
     }

    好吧.在写这篇博客的时候 突然想起来 我是不是可以不保存   只需要用 List<Image> 将每一帧保存起来?  然后到最后的时候在遍历一下  看上面的存放路径的

     

    这种方法你们看到了可以去试下 我觉得应该是没问题的。

    后面发现这种方法貌似也有点不好的地方 太大了!

    我原图gif 4.69M 处理i之后居然到9.74M了 

    这里有点很奇怪.就是我这里231张图片总共才2.03M 保存成gif却那么大了???

    然后我又去搜索 gif压缩

    这时候重点来了!  看到了这篇文章 http://blog.csdn.net/pigkeli/article/details/17162243

    看了下 发现完全不需要使用 第三方类库的!分解成每一帧之后合并 img有个saveAdd方法的!可以追加的!

    看code

    将刚才那篇文章 里面的代码 稍微改了下..就能用了

     

    public static void YaSuo(string imgPath)
            {
                //原图  
                Image img = Image.FromFile(imgPath);
                //不够100*100的不缩放  
                if (img.Width > 100 && img.Height > 100)
                {
                    //新图第一帧  
                    Image new_img = new Bitmap(img.Width, img.Height);
                    //新图其他帧  
                    Image new_imgs = new Bitmap(img.Width, img.Height);
                    //新图第一帧GDI+绘图对象  
                    Graphics g_new_img = Graphics.FromImage(new_img);
                    //新图其他帧GDI+绘图对象  
                    Graphics g_new_imgs = Graphics.FromImage(new_imgs);
                    //配置新图第一帧GDI+绘图对象  
                    g_new_img.CompositingMode = CompositingMode.SourceCopy;
                    g_new_img.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    g_new_img.PixelOffsetMode = PixelOffsetMode.HighQuality;
                    g_new_img.SmoothingMode = SmoothingMode.HighQuality;
                    g_new_img.Clear(Color.FromKnownColor(KnownColor.Transparent));
                    //配置其他帧GDI+绘图对象  
                    g_new_imgs.CompositingMode = CompositingMode.SourceCopy;
                    g_new_imgs.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    g_new_imgs.PixelOffsetMode = PixelOffsetMode.HighQuality;
                    g_new_imgs.SmoothingMode = SmoothingMode.HighQuality;
                    g_new_imgs.Clear(Color.FromKnownColor(KnownColor.Transparent));
                    //遍历维数  
                    foreach (Guid gid in img.FrameDimensionsList)
                    {
                        //因为是缩小GIF文件所以这里要设置为Time  
                        //如果是TIFF这里要设置为PAGE  
                        FrameDimension f = FrameDimension.Time;
                        //获取总帧数  
                        int count = img.GetFrameCount(f);
                        //保存标示参数  
                        System.Drawing.Imaging.Encoder encoder = System.Drawing.Imaging.Encoder.SaveFlag;
                        //  
                        EncoderParameters ep = null;
                        //图片编码、解码器  
                        ImageCodecInfo ici = null;
                        //图片编码、解码器集合  
                        ImageCodecInfo[] icis = ImageCodecInfo.GetImageDecoders();
                        //为 图片编码、解码器 对象 赋值  
                        foreach (ImageCodecInfo ic in icis)
                        {
                            if (ic.FormatID == ImageFormat.Gif.Guid)
                            {
                                ici = ic;
                                break;
                            }
                        }
                        //每一帧  
                        for (int c = 0; c < count; c++)
                        {
                            //选择由维度和索引指定的帧  
                            img.SelectActiveFrame(f, c);
                            //第一帧  
                            if (c == 0)
                            {
                                //将原图第一帧画给新图第一帧  
                                g_new_img.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height), new Rectangle(0, 0, img.Width, img.Height), GraphicsUnit.Pixel);
                                //把振频和透明背景调色板等设置复制给新图第一帧  
                                for (int i = 0; i < img.PropertyItems.Length; i++)
                                {
                                    new_img.SetPropertyItem(img.PropertyItems[i]);//选中
                                    Graphics g1 = Graphics.FromImage(new_img);//加水印
                                    SolidBrush drawBrush = new SolidBrush(Color.FromArgb(255, 180, 0));
                                    g1.DrawString("动图", new Font("楷体", 20, FontStyle.Regular), drawBrush, 10, 10);
                                }
                                ep = new EncoderParameters(1);
                                //第一帧需要设置为MultiFrame  
                                ep.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.MultiFrame);
                                //保存第一帧  
                                new_img.Save(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"/temp/" + Path.GetFileName(imgPath), ici, ep);//路径自己改下 这里是桌面的路径
                            }
                            //其他帧  
                            else
                            {
                                //把原图的其他帧画给新图的其他帧  
                                g_new_imgs.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height), new Rectangle(0, 0, img.Width, img.Height), GraphicsUnit.Pixel);
                                //把振频和透明背景调色板等设置复制给新图第一帧  
                                for (int i = 0; i < img.PropertyItems.Length; i++)
                                {
                                    new_imgs.SetPropertyItem(img.PropertyItems[i]);//选中
                                    Graphics g1 = Graphics.FromImage(new_imgs);//加水印
                                    SolidBrush drawBrush = new SolidBrush(Color.FromArgb(255, 180, 0));
                                    g1.DrawString("动图", new Font("楷体", 20, FontStyle.Regular), drawBrush, 10, 10);
                                }
                                ep = new EncoderParameters(1);
                                //如果是GIF这里设置为FrameDimensionTime  
                                //如果为TIFF则设置为FrameDimensionPage  
                                ep.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.FrameDimensionTime);
                                //向新图添加一帧  
                                new_img.SaveAdd(new_imgs, ep);
                            }
                        }
                        ep = new EncoderParameters(1);
                        //关闭多帧文件流  
                        ep.Param[0] = new EncoderParameter(encoder, (long)EncoderValue.Flush);
                        new_img.SaveAdd(ep);
                    }
    
                    //释放文件  
                    img.Dispose();
                    new_img.Dispose();
                    new_imgs.Dispose();
                    g_new_img.Dispose();
                    g_new_imgs.Dispose();
                }
    
            }


    这种方法使用了之后发现 文件大小是小了点(6.47M)。。。

     

    但是貌似有噪点了...不过还是能看的 没很大的影响

    先不管了 折腾了一下午了...头有点疼....先这样吧......

    给文中的三张图给你们去玩玩吧

    好吧..传不上去...

    你们自己去找素材玩吧..

    哎  写东西主要是思路重要..不会写没关系.有百度 谷歌

    当然会写肯定是最好..

     

    百度 谷歌一下午 心累

    尤其是那些博客搬运工的!!!!各种误导人.

    2017-12.05 17.42

     

    2017-12-07 更新一波

    上面不是提到过 可以使用list<image>来 避免保存很多帧的图片嘛  我刚才试了下 没问题的

    记得要将资源释放!!你们在操作的时候可以看任务管理器 内存暴涨啊...

    以下是代码

     

     Image img = Image.FromFile(txt1.Text);
    
                FrameDimension ImgFrmDim = new FrameDimension(img.FrameDimensionsList[0]);
    
                //Determine the number of frames in the image
                //Note that all images contain at least 1 frame,
                //but an animated GIF will contain more than 1 frame.
                int nFrameCount = img.GetFrameCount(ImgFrmDim);
                // Save every frame into jpeg format
    
                var paths = new List<string>();//存放路径的
                List<Image> imgs = new List<Image>();
                var left = 0;
                //以下是拆分步骤
                for (int i = 0; i < nFrameCount; i++)
                {
                    img.SelectActiveFrame(ImgFrmDim, i);
                    var temppath = string.Format(txt3.Text + "_{0}new.jpg", i);//把每一帧图片保存
                    //var temppath = string.Format(txt3.Text + "_new.jpg");
                    Graphics g1 = Graphics.FromImage(img);
                    //2:声明graphicse把img做为填充他的参数
                    //g1.DrawString("天天搞笑动图", new Font("楷体", 20, FontStyle.Regular), Brushes.Blue, 10, 10);
                    SolidBrush drawBrush = new SolidBrush(Color.FromArgb(255, 180, 0));
    
                    if (left > img.Height)
                    {
                        left--;
                    }
                    else
                    {
                        left++;
                    }
                    g1.DrawString("动图", new Font("楷体", 20, FontStyle.Regular), drawBrush, 10, left);//加水印
                    //g1.DrawString("", new Font("楷体", 20, FontStyle.Regular),,10,10)
                    var tempimg = img.Clone() as Image;
                    imgs.Add(tempimg);//用复制就可以了
                    //tempimg.Dispose();//这里不能释放
                    //img.Save(temppath, ImageFormat.Jpeg);
    
                    //img.Save(temppath, ImageFormat.Jpeg);//保存
    
                    //paths.Add(temppath);//保存路径
                }
                img.Dispose();//释放资源
    
                AnimatedGifEncoder MyGif = new AnimatedGifEncoder();
                MyGif.Start(txt3.Text + "/" + fileName.Split('.')[0] + "_new." + extension);//保存路径
                //MyGif.SetDelay(200);//帧率
                //MyGif.SetSize(300, 300);//尺寸
                MyGif.SetRepeat(0);//重复
                //imgs.Reverse();//反序
                foreach (var item in imgs)
                {
                    MyGif.AddFrame(item);//加入单张图片
                    item.Dispose();//释放当前帧
                }
    
                //foreach (var item in paths)
                //{
                //    var tempimg = Image.FromFile(item);
                //    MyGif.AddFrame(tempimg);//加入单张图片                
                //    tempimg.Dispose();//释放资源
    
                //}
    
                MyGif.Finish();//到这一步已经保存好了

     

    经过list<image>处理之后 gif也变小了...很奇怪...不知道什么情况

     

    我现在再来研究下 为什么231张图片总共只有2M多 但是保存成gif怎么就有9M多了 (见上面介绍)

     

     

     

     

     

     

     

     

     

     

    展开全文
  • C# Gif图转png

    2021-08-14 20:31:23
    C# Gif转Png public static void ExportToPngList(string gifPath) { Image img = Image.FromFile(gifPath); FrameDimension frameDimension = new FrameDimension(img.FrameDimensionsList[0]); var ...

    C# Gif转Png

     public static void ExportToPngList(string gifPath)
            {
                Image img = Image.FromFile(gifPath);
                FrameDimension frameDimension = new FrameDimension(img.FrameDimensionsList[0]);
                var frameCount = img.GetFrameCount(frameDimension);
                
                string fileName = Path.GetFileNameWithoutExtension(gifPath);
                string dir = Path.GetDirectoryName(gifPath) + "/" + fileName;
                if (!Directory.Exists(dir))
                {
                    Directory.CreateDirectory(dir);
                }
                for (int i = 0; i < frameCount; i++)
                {
                    img.SelectActiveFrame(frameDimension, i);
                    string savePath = $"{dir}/{fileName}_{i}.png";
                    img.Save(savePath, ImageFormat.Png);
                }
            }
           
    
    

    原文链接:https://blog.csdn.net/XiaoGuiXuan/article/details/108450299

    展开全文
  • C# GIF验证码类

    千次阅读 2008-07-31 11:03:00
    namespace Kissogram.Common.Security{ using System; using System.IO; using System.Web; using System.Drawing; //GIF验证码类 public class Validate { //设置最少4位验证码 p

     namespace Kissogram.Common.Security
    {
        
    using System;
        
    using System.IO;
        
    using System.Web;
        
    using System.Drawing;

        
    //GIF验证码类
         public class Validate
         {
            
    //设置最少4位验证码
             private byte TrueValidateCodeCount = 4;
            
    public byte ValidateCodeCount
             {
                
    get
                 {
                    
    return TrueValidateCodeCount;
                 }
                
    set
                 {
                    
    //验证码至少为3位
                     if (value > 4)
                         TrueValidateCodeCount
    = value;
                 }
             }
            
    protected string ValidateCode = "";
            
    //是否消除锯齿
             public bool FontTextRenderingHint = false;
            
    //验证码字体
             public string ValidateCodeFont = "Arial";
            
    //验证码型号(像素)
             public float ValidateCodeSize = 13;
            
    public int ImageHeight = 23;
            
    //定义验证码中所有的字符
             public string AllChar = "1,2,3,4,5,6,7,8,9,0,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z";

            
    //获得随机四位数
             private void CreateValidate()
             {
                 ValidateCode
    = "";
                
    //将验证码中所有的字符保存在一个字符串数组中
                 string[] CharArray = AllChar.Split(',');
                
    int Temp = -1;
                
    //生成一个随机对象
                 Random RandCode = new Random();
                
    //根据验证码的位数循环
                 for (int i = 0; i < ValidateCodeCount; i++)
                 {
                    
    //主要是防止生成相同的验证码
                     if (Temp != -1)
                     {
                        
    //加入时间的刻度
                         RandCode = new Random(i * Temp * ((int)DateTime.Now.Ticks));
                     }
                    
    int t = RandCode.Next(35);
                    
    if (Temp == t)
                     {
                        
    //相等的话重新生成
                         CreateValidate();
                     }
                     Temp
    = t;
                     ValidateCode
    += CharArray[Temp];
                 }
                
    //错误检测,去除超过指定位数的验证码
                 if (ValidateCode.Length > TrueValidateCodeCount)
                     ValidateCode
    = ValidateCode.Remove(TrueValidateCodeCount);
             }
            
    //生成一帧的BMP图象
             private void CreateImageBmp(out Bitmap ImageFrame)
             {
                
    //获得验证码字符
                 char[] CodeCharArray = ValidateCode.ToCharArray(0, ValidateCodeCount);
                
    //图像的宽度-与验证码的长度成一定比例
                 int ImageWidth = (int)(TrueValidateCodeCount * ValidateCodeSize * 1.3 + 4);
                
    //创建一个长20,宽iwidth的图像对象
                 ImageFrame = new Bitmap(ImageWidth, ImageHeight);
                
    //创建一个新绘图对象
                 Graphics ImageGraphics = Graphics.FromImage(ImageFrame);
                
    //清除背景色,并填充背景色
                
    //Note:Color.Transparent为透明
                 ImageGraphics.Clear(Color.White);
                
    //绘图用的字体和字号
                 Font CodeFont = new Font(ValidateCodeFont, ValidateCodeSize, FontStyle.Bold);
                
    //绘图用的刷子大小
                 Brush ImageBrush = new SolidBrush(Color.Red);
                
    //字体高度计算
                 int FontHeight = (int)Math.Max(ImageHeight - ValidateCodeSize - 3, 2);
                
    //创建随机对象
                 Random rand = new Random();
                
    //开始随机安排字符的位置,并画到图像里
                 for (int i = 0; i < TrueValidateCodeCount; i++)
                 {
                    
    //生成随机点,决定字符串的开始输出范围
                     int[] FontCoordinate = new int[2];
                     FontCoordinate[
    0] = (int)(i * ValidateCodeSize + rand.Next(1)) + 3;
                     FontCoordinate[
    1] = rand.Next(FontHeight);
                     Point FontDrawPoint
    = new Point(FontCoordinate[0], FontCoordinate[1]);
                    
    //消除锯齿操作
                     if (FontTextRenderingHint)
                         ImageGraphics.TextRenderingHint
    = System.Drawing.Text.TextRenderingHint.SingleBitPerPixel;
                    
    else
                         ImageGraphics.TextRenderingHint
    = System.Drawing.Text.TextRenderingHint.AntiAlias;
                    
    //格式化刷子属性-用指定的刷子、颜色等在指定的范围内画图
                     ImageGraphics.DrawString(CodeCharArray[i].ToString(), CodeFont, ImageBrush, FontDrawPoint);
                 }
                 ImageGraphics.Dispose();
             }
            
    //处理生成的BMP
             private void DisposeImageBmp(ref Bitmap ImageFrame)
             {
                
    //创建绘图对象
                 Graphics ImageGraphics = Graphics.FromImage(ImageFrame);
                
    //创建铅笔对象
                 Pen ImagePen = new Pen(Color.Red, 1);
                
    //创建随机对象
                 Random rand = new Random();
                
    //创建随机点
                 Point[] RandPoint = new Point[2];
                
    //随机画线
                 for (int i = 0; i < 15; i++)
                 {
                     RandPoint[
    0] = new Point(rand.Next(ImageFrame.Width), rand.Next(ImageFrame.Height));
                     RandPoint[
    1] = new Point(rand.Next(ImageFrame.Width), rand.Next(ImageFrame.Height));
                     ImageGraphics.DrawLine(ImagePen, RandPoint[
    0], RandPoint[1]);
                 }
                 ImageGraphics.Dispose();
             }
            
    //创建GIF动画
             private void CreateImageGif()
             {
                 Bitmap ImageFrame;
                 Kissogram.Drawing.Gif.AnimatedGifEncoder GifPic
    = new Kissogram.Drawing.Gif.AnimatedGifEncoder();
                 MemoryStream BmpMemory
    = new MemoryStream();
                 GifPic.Start();
                
    //确保视觉残留
                 GifPic.SetDelay(5);
                
    //-1:no repeat,0:always repeat
                 GifPic.SetRepeat(0);
                
    for (int i = 0; i < 20; i++)
                 {
                    
    //创建一帧的图像
                     CreateImageBmp(out ImageFrame);
                    
    //生成随机线条
                     DisposeImageBmp(ref ImageFrame);
                    
    //输出绘图,将图像保存到指定的流
                     ImageFrame.Save(BmpMemory, System.Drawing.Imaging.ImageFormat.Png);
                     GifPic.AddFrame(Image.FromStream(BmpMemory));
                     BmpMemory
    = new MemoryStream();
                 }
                 GifPic.OutPut(
    ref BmpMemory);
                 HttpContext.Current.Response.ClearContent();
                
    //配置输出类型
                 HttpContext.Current.Response.ContentType = "image/Gif";
                
    //输出内容
                 HttpContext.Current.Response.BinaryWrite(BmpMemory.ToArray());
                 BmpMemory.Close();
                 BmpMemory.Dispose();
             }
            
    //输出验证码
             public void OutPutValidate(string ValidateCodeSession)
             {
                 CreateValidate();
                 CreateImageGif();
                
    //把生成的验证码输入到SESSION
                 HttpContext.Current.Session[ValidateCodeSession] = ValidateCode;
             }
         }
    }

     

     

     

    发一个Kissogram类相关的地址: http://topic.csdn.net/u/20070422/18/477cc463-3be7-41f7-8c1f-0c910e8fd790.html?1790859192

    展开全文
  • dll下载的地址 http://www.codeproject.com/Articles/11505/NGif-Animated-GIF-Encoder-for-NET   使用主要调用的是Components这个代码库,引用dll就可以了。     ...
    dll下载的地址
     
    使用主要调用的是Components这个代码库,引用dll就可以了。
     
     
    作者:
    以下为这条连接的博客园内容:
     思路很简单,就是先把gif分解成很多帧,然后对帧进行合并,合并帧之前把帧的位置反转一下就可以了。因为我自己对图像处理的知识不懂,只想到了思路,所以这些功能都要找些资料,然后修改,测试。
    分割帧的代码如下
    //解码gif图片 public List<string> GetFrames(stringpPath,stringpSavedPath) { Image gif=Image.FromFile(pPath); FrameDimension fd=newFrameDimension(gif.FrameDimensionsList[0]); //获取帧数(gif图片可能包含多帧,其它格式图片一般仅一帧) intcount=gif.GetFrameCount(fd); List<string>gifList=newList<string>(); //以Jpeg格式保存各帧 for(inti=0;i<count;i++) { gif.SelectActiveFrame(fd,i); gif.Save(pSavedPath+"\\frame_"+i+".png",ImageFormat.Png); gifList.Add(pSavedPath+"\\frame_"+i+".png"); } returngifList; }
     
     
    可以看到,返回了一个包含所有生成的帧地址的list列表。然后就是使用gifList作为参数来合并了。
     
    //获取系统临时目录存放解码后的png图片\r\n stringtemppath=System.Environment.GetEnvironmentVariable("TEMP"); List<string>gifList=GetFrames(tBoxFile.Text,temppath); gifList.Reverse(); StringoutputFilePath="new.gif"; AnimatedGifEncoder ae=newAnimatedGifEncoder(); ae.Start(outputFilePath); ae.SetDelay(100); // 延迟间隔\r\n ae.SetRepeat(0); //-1:不循环,0:总是循环 播放 \r\n for(inti=0,count=gifList.Count;i<count;i++) { ae.AddFrame(Image.FromFile(gifList[i])); } ae.Finish(); MessageBox.Show("成功!新文件已保存在同目录");
     
     
    这里面使用了AnimatedGifEncoder这个类,这是Gif.Components.dll动态连接库里的类(此库开源,文末给出地址),是我在codeProject上找到的。首先我把gifList反转,然后合并保存到同目录。中间生成的帧为了方便我保存到了temp目录。
    本来这个库里是分割gif的功能的。但是我实际测试后发现效果非常差,图片黑条泛滥,根本没法看。所以还是使用上面那段代码,相关代码我依然保存在工程里,有兴趣可以自己测试。
    展开全文
  • public static Bitmap WaterMarkWithText(System.Drawing.Bitmap origialGif, string  text,string filePath)  {  //用于存放桢  ...//如果不是gif文件,直接返回原图像  if (origialGif.RawFormat.Gui
  • C# 播放gif动画

    热门讨论 2009-04-23 12:59:17
    C# 播放gif动画C# 播放gif动画C# 播放gif动画C# 播放gif动画C# 播放gif动画C# 播放gif动画C# 播放gif动画
  • C#制作GIF

    2020-09-09 14:55:57
    C#制作GIF string[] suffix = { ".jpg", ".jpeg", ".png" }; using (var gif = AnimatedGif.AnimatedGif.Create("./test.gif", 500)) { DirectoryInfo directoryInfo = new DirectoryInfo(@"./image"); fo
  • C#制作gif

    千次阅读 2016-12-04 17:32:02
    C#制作gif
  • c#制作gif动图

    2015-02-07 22:41:42
    c#写的一个winform,引用了一个dll在Gif_Animate文件下,实现将某文件夹下的所有图片转为一个gif动图,可以设置时间间隔和输出位置
  • C#gif动画

    千次下载 热门讨论 2015-06-11 19:35:22
    Example047-播放gif动画
  • vb.net创建GIF动画的DLL,C#创建GIF动画,Gif.Components.dll
  • C#下载gif图片.txt

    2021-04-21 19:29:42
    C#下载的图片,gif很多时候不能动,这个代码下载的就可以保持动画效果
  • C#生成Gif源码,使用c#生成gif动画验证码及给gif动画加上水印代码
  • C# 操作gif 合成类

    2009-12-05 14:45:48
    C# 操作gif 合成类。把多个jpg/gif/png 合成一个gif文件。
  • C#调用GIF的解码库进行动画显示,暂时还没有GIF编码实现
  • c# 使用图片制作 gif 的时候,需要用到一个类,那就是 AnimatedGifEncoder,使用的时候,把这个类复制进工程中,就可以使用相关类了。
  • C#_GIF_动画_透明_C#制作透明色GIF动画的类 简介摘要:前几天,关注了下GIF的文件结构 发现一个GIF文件大小错很多.发现主要是3个地方的问题. 一是色彩表的问题.GIF有全局色彩表和图形色彩表. 二是GIF图形的大小并不...
  • C#支持GIF动画的源码实例
  • C#制作和提取gif图片

    2018-09-12 11:02:28
    C#操作gif图片,可以将图片合成gif,也可以将gif的每一帧图片提取出来
  • c#图片生成GIF动画图片

    热门讨论 2010-08-27 11:24:14
    c#图片生成GIF动画图片c#图片生成GIF动画图片c#图片生成GIF动画图片

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 29,123
精华内容 11,649
关键字:

c#gif

c# 订阅