看一看啦!给大家分享一个C#写的GIF制作工具!!

.Net技术 码拜 9年前 (2015-05-11) 1205次浏览 0个评论
 

今天,自己做了一个GIF图像生成器,可以实现任意张图像生成GIF,很好用,给大家分享一下,资料搜集来自网络!!!
下面是界面图像和效果实例图: 
界面图:
看一看啦!给大家分享一个C#写的GIF制作工具!!
实例图:
看一看啦!给大家分享一个C#写的GIF制作工具!!
接着是源码下载地址: 
http://download.csdn.net/detail/trent1985/4745698
部分源代码如下:

       #region variances
        private string curFileName = null;
        private Bitmap curBitmap = null;
        private List<string> pathString = new List<string>();
        private List<Bitmap> thumbnailImage = new List<Bitmap>();
        private List<Bitmap> srcImage = new List<Bitmap>();
        private Bitmap temp = null;
        private int count = 0;
        private int number = 0;
        private int deleteNumber = 0;
        #endregion

        #region Functions
        //Open Function
        public void OpenImage()
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "所有图像文件 | *.bmp; *.pcx; *.png; *.jpg; *.gif;" +
                   "*.tif; *.ico; *.dxf; *.cgm; *.cdr; *.wmf; *.eps; *.emf|" +
                   "位图( *.bmp; *.jpg; *.png;...) | *.bmp; *.pcx; *.png; *.jpg; *.gif; *.tif; *.ico|" +
                   "矢量图( *.wmf; *.eps; *.emf;...) | *.dxf; *.cgm; *.cdr; *.wmf; *.eps; *.emf";
            ofd.ShowHelp = true;
            ofd.Title = "打开图像文件";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                curFileName = ofd.FileName;
                try
                {
                    curBitmap = (Bitmap)System.Drawing.Image.FromFile(curFileName);
                    pathString.Add(curFileName);
                    srcImage.Add(new Bitmap(curBitmap));
                    if (curBitmap.Width >= curBitmap.Height)
                        temp = new Bitmap(curBitmap, new Size(100, (int)(100 * curBitmap.Height / curBitmap.Width)));
                    else
                        temp = new Bitmap(curBitmap, new Size((int)(100 * curBitmap.Width / curBitmap.Height), 100));
                    thumbnailImage.Add(new Bitmap(temp));
                    count++;
                }
                catch (Exception exp)
                { MessageBox.Show(exp.Message); }
            }
            DisplayImages();
        }
        //Save Function
        public void SaveImage()
        {
            if (imageBox.Image != null)
            {
                SaveFileDialog sfd = new SaveFileDialog();
                sfd.Filter = "(*.gif)|*.gif";
                if (sfd.ShowDialog() == DialogResult.OK)
                {
                    if (File.Exists(sfd.FileName))
                    {
                        File.Delete(sfd.FileName);
                        imageBox.Image.Save(sfd.FileName);
                    }
                    else
                        imageBox.Image.Save(sfd.FileName);
                }
            }
            else
            {
                MessageBox.Show("Please open an image!");
            }
        }

        //Display function
        private void DisplayImages()
        {
            listView1.Clear();
            imageList1.Images.Clear();
            if (count != 0)
            {
                for (int i = 0; i < count; i++)
                {
                    imageList1.ColorDepth = ColorDepth.Depth24Bit;
                    imageList1.ImageSize = new Size(thumbnailImage.ElementAt(i).Width, thumbnailImage.ElementAt(i).Height);
                    imageList1.Images.Add((Image)thumbnailImage.ElementAt(i));
                    listView1.LargeImageList = imageList1;
                    listView1.Items.Add(i.ToString());
                    listView1.Items[i].ImageIndex = i;
                }
            }

        }
        #endregion

        #region Others
        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            label1.Text = "Time interval:"+trackBar1.Value.ToString()+"ms";
        }

        private void openToolStripMenuItem_Click(object sender, EventArgs e)
        {
            OpenImage();
        }

        private void convertToGifToolStripMenuItem_Click(object sender, EventArgs e)
        {
            String outputPath = "C:\"+number.ToString ()+".gif";
            if (File.Exists(outputPath))
            {
                imageBox.Image = null;
                number++;
                outputPath = "C:\" + number.ToString() + ".gif";
            }
            AnimatedGifEncoder gif = new AnimatedGifEncoder();
            gif.Start(outputPath);
            gif.SetDelay(trackBar1.Value);
            gif.SetRepeat(0);
            for (int i = 0; i < count; i++)
            {
                gif.AddFrame(srcImage.ElementAt(i));
            }
            gif.Finish();
            imageBox.Image = (Image)Image.FromFile(outputPath);
            imageBox.Width = srcImage.ElementAt(0).Width;
            imageBox.Height = srcImage.ElementAt(0).Height;
            MessageBox.Show("Done!");
        }

        private void saveToolStripMenuItem_Click(object sender, EventArgs e)
        {
            SaveImage();
        }

        private void deleteToolStripMenuItem_Click(object sender, EventArgs e)
        {
            pathString.RemoveAt(deleteNumber);
            thumbnailImage.RemoveAt(deleteNumber);
            srcImage.RemoveAt(deleteNumber);
            count--;
            DisplayImages();
        }

        private void listView1_MouseDown(object sender, MouseEventArgs e)
        {
            if (listView1.HitTest(e.X, e.Y).Item != null)
            {
                deleteNumber = listView1.HitTest(e.X, e.Y).Item.Index;
                if (e.Button == MouseButtons.Right)
                {
                    contextMenuStrip1.Visible = true;
                }
            }
        }

        private void blogLinkToolStripMenuItem_Click(object sender, EventArgs e)
        {
            System.Diagnostics.Process.Start("IEXPLORE.EXE", "http://dongtingyueh.blog.163.com/");
        }
        #endregion
1分
好贴,收藏了
1分
收藏了,顶。
1分
下来看看,谢谢分享
1分
嗯 !不过功能早就搞过了,GIF的合成和分解都可以
1分
收藏了,顶。
1分
试过了,非常好.
1分
支持分享,支持原创!
谢谢大家哈哈!
1分
给强很给力!
1分
感谢分享!
收藏
1分
很棒, 谢谢分享.
1分
新版怎么不能收藏帖子啊
1分
测试通过,支持分享
1分
收藏!。。。。。
1分
看起来不错,要了
1分
测试通过,很好的,
收藏下
1分
xiexi!
1分
测试通过,很好的,
收藏下 
1分
luguo
字符不够啊
1分
不错,GDI+只支持多帧GIF的解码,而不支持编码,这个再稍微优化优化也是很不错的。

只是那个变为索引色的算法需要进一步提高效果,不然转换后的视觉效果惨不忍睹。  一般用最优调色板+误差抖动效果比较好的。

其实GDI+1.1已经有了最有调色板和抖动的算法,但是我只在VB6里调用flat API实现过,VB2010的image和bitmap类里似乎没有看到这个函数。。。

Public Enum DitherType
    DitherTypeNone = 0
    DitherTypeSolid = 1
    DitherTypeOrdered4x4 = 2
    DitherTypeOrdered8x8 = 3
    DitherTypeOrdered16x16 = 4
    DitherTypeSpiral4x4 = 5
    DitherTypeSpiral8x8 = 6
    DitherTypeDualSpiral4x4 = 7
    DitherTypeDualSpiral8x8 = 8
    DitherTypeErrorDiffusion = 9
    DitherTypeMax = 10
End Enum

Public Enum PaletteType
    PaletteTypeCustom = 0
    PaletteTypeOptimal = 1
    PaletteTypeFixedBW = 2
    PaletteTypeFixedHalftone8 = 3
    PaletteTypeFixedHalftone27 = 4
    PaletteTypeFixedHalftone64 = 5
    PaletteTypeFixedHalftone125 = 6
    PaletteTypeFixedHalftone216 = 7
    PaletteTypeFixedHalftone252 = 8
    PaletteTypeFixedHalftone256 = 9
End Enum
Public Declare Function GdipBitmapConvertFormat Lib "gdiplus" (ByVal image As Long, ByVal Format As PixelFormatEnum, ByVal ADitherType As DitherType, ByVal APaletteType As PaletteType, ByRef palette As ColorPalette, ByVal alphaThresholdPercent As Single) As Long



1分
好贴,收藏了
mark…
不用装office,也可以打开access了,方便。还可以打开execl\vfox\dbase
引用 20 楼 laviewpbt 的回复:

不错,GDI+只支持多帧GIF的解码,而不支持编码,这个再稍微优化优化也是很不错的。

只是那个变为索引色的算法需要进一步提高效果,不然转换后的视觉效果惨不忍睹。  一般用最优调色板+误差抖动效果比较好的。

其实GDI+1.1已经有了最有调色板和抖动的算法,但是我只在VB6里调用flat API实现过,VB2010的image和bitmap类里似乎没有看到这个函……

有没有兴趣研究一下Win8MetroC#数字图像处理阿,这个很有搞头阿!

没装WIN8呢。
学习一下,顶楼主
好,非常好,经验,
引用 26 楼 laviewpbt 的回复:

没装WIN8呢。

搞一个阿,公司不让登QQ,回头加你 !

引用 4 楼 gac520 的回复:

嗯 !不过功能早就搞过了,GIF的合成和分解都可以

确实早就有了
我实现的彩信PC接收和发送gif中就有关这方面的代码
不过楼主的分享精神非常好

下载一下试一下。顺便学习一下。 
感谢分享
只为了积分啊
我之前只是有类似的思路,没做过,支持下
支持一下!

不错。

顶顶顶
好贴 收藏之~
很好支持下·····
很好,要支持
学习了 要支持 
efewfwfw
好东西。 只是代码部分没头绪。先收藏了再说。 
reterter[code=css]

[/code]
ffhgfhgf

学习了,很棒啊
这个先收藏了,然后去试试效果

原来这里有猴子的。。。

非常好,很强大
下载试了下,很好啊
hen bu cuo. wo ye ding yi xia…..
学习中,顶一帖支持。
学习了
收藏了 ,很好
这个非常有用~~~
一定要顶,太厉害了
赞赞,很不错的!

Win8MetroC#数字图像处理有特别之处吗?Win8 Metro程序还是写过一些。

看了 还是不懂啊  
好贴,收藏了 
搜藏
这个不错,可以有!
我还以为做的滤镜生成gif呢,给楼主顶了!
支持!
谢谢,,收藏了
楼主给一个开源协议啊
已经下载过 了   感觉挺好
下载  看看  用用  学习
嗯  好
要输入6个数字啊
引用 73 楼 Aoqun 的回复:

楼主给一个开源协议啊

什么开源协议阿?

刚来的没积分,不让下

楼主淫才

引用 78 楼 sbj480 的回复:

刚来的没积分,不让下

不用积分就可以下载的阿!!!

学习学习.
3 Q L Z !
嘿嘿!  打酱油 打酱油
打酱油 打酱油
谢谢提供源码,下载学习。
提醒一句,GIF的编码是有版权的,要商用请注意了。
Mark,是非常有必要的
是我的大学同学给我介绍的网上的【丽塔去痘茶】 我是在乐购时尚网 QQ:876931865 http://www.letgogo.com/#r-pqjj买的。当时我是向她诉一下苦,她以前也是痘痘很多的,但是现在痘痘没有了,而且整个人看上去都是很精神的。
引用 89 楼 ringphone 的回复:

提醒一句,GIF的编码是有版权的,要商用请注意了。

呵呵,尽供学习!!!

xc bnbfjdfbohojfjhouuormhob9
代码给力,妞更给力。
学习
我去~我积分就—13了~
我再看看我有多少积分了,我急需PLSQL Developer7.0中文绿色版阿
美女比代码漂亮!
bucuo..
学习….
果断顶起啊
很好很强大很给力
学习了
thanks…..
支持
感觉 还不错
瞧瞧…………………………….
支持下,谢谢分享…
不错  值得学习学习
不错,值得分享的
效果不错呀,
太棒了,顶起来,真的太有用了,谢谢楼主
哈哈哈这个好
好东西。。顶一个,学习学习
收藏了,顶。 
好给力。不错。!
挺好的。
顶一个。
很好的东西,顶!
不错 顶一个
顶一下,GIF制作
谢谢分享 我是新人!
拿人手短~赞一个~
学习了 顺便看了美女
谢谢分享.支持
好帖子呀,好好的看看
收藏先,在慢慢分解
谁有没有企业人事管理系统
支持,帮顶!
强贴,一定要观摩一下。
谢谢楼主,不错不错
不错,,,,,,,,,,。。。。,,,,,,
很好,支持下
好东西。赞!
下来看看,谢谢分享
好.学习了,,,,,
引用 95 楼 llyyqq123 的回复:

代码给力,妞更给力。

哈哈,妙

不错  不过好像图片得一张一张的添加  我已经改成可以一次添加多张了
引用 155 楼 cy531410602 的回复:

不错  不过好像图片得一张一张的添加  我已经改成可以一次添加多张了

不错!!!

按时打算打算阿萨德撒艾丝凡阿法斯蒂芬设定费说的
好东西
先收藏了,学习学习
为什么我就运行不了,说是少依赖数!
为什么??
字数咋就不够呢!
帅气啊  果断收藏了
不错!学习学习
     
学习  顶~~~
Mark,是非常有必要的 
非常感谢!lz碉堡了
学习了,谢谢。
达到顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
用美女做真的不错
感谢分享
支持一下。加油。
开眼界了!开眼界了!
美女比代码漂亮!
崇拜下。不想写代码,自己转行了。
留个脚印 ,收藏!
看看,谢谢!
好工具,收藏了
下来看看,谢谢分享 
果断收藏
谢谢
看不懂,学不会,我无用
学习
测试数据测试数据
good good good
good  good good
支持楼主了,很不错!
henhao
很好很强大,顶~~~~~
感谢楼主分享!
楼主太聪明了,我支持你
不错,学习了。
必须mark(ps:刚开始接触C#)
楼主有两下子
不错, 标记一下
楼主强大啊!1
挺好挺好挺好
真不错,c#强大无比啊。。楼主更强大
楼主好棒啊,加油
围观围观围观围观
3Q LL ~
美女比代码漂亮!
美女比代码漂亮!
好贴,收藏了~~~·
怎么才能算论坛可用分?
围观围观围观
谢楼主分享!
好难压,我等看不懂
俄特让他大概多少
先收藏了,楼主的图片 有点。。。。。。
这个我应该收藏过了吧,没有的话再收藏一下
给力 顶了啊
谢谢分享,收藏了
不错  真的不错
真的不过   很不错 
大s发发的手法十分
好好向你们学习
谢谢收藏了,主楼辛苦了
美女比代码漂亮!
好。。。。。。。。。。。。。。。。。。
学习了..收藏了.
谢谢楼主分享
好东东啊 哈哈
下来看看,谢谢分享
不错 赚积分不容易啊 
路过学习,很好很强大,LZ功德无量
说什么啊啊啊啊  
收藏!thx
菜鸟路过虽然不懂但是感觉很强大
支持分享~~
顶啊
分享精神可嘉
好东西!!顶!
很好 学习了
收藏了,顶。 
看了,挺好的!嘿嘿。。。
结贴喽。。。
收藏。。。。。。。。。。。。。
收藏了,顶顶顶顶顶顶顶顶
最近突然被boss召唤写这个,以前都没接触过,学习了
未能找到类型或命名空间名称“AnimatedGifEncoder”(是否缺少 using 指令或程序集引用?)
imageBox缺少定义
怎么改正啊,求救
收藏,支持原创,分享,哈哈哈
同测, 好用!

可惜用了Pinvoke 不能在mono上跨平台啊
求跨平台的调色板优化方法啊!!

太强了,强烈支持。
非常不错哟,很好。
留言,学习。
哈哈。感谢楼主分享~~学习了

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明看一看啦!给大家分享一个C#写的GIF制作工具!!
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!