看一看啦!给大家分享一个C#写的GIF制作工具!!
今天,自己做了一个GIF图像生成器,可以实现任意张图像生成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
[解决办法]
收藏了,顶。
[解决办法]
下来看看,谢谢分享
------解决方案--------------------
嗯 !!!不过功能早就搞过了,GIF的合成和分解都可以
[解决办法]
收藏了,顶。
[解决办法]
试过了,非常好.
[解决办法]
支持分享,支持原创!
[解决办法]
给强很给力!
[解决办法]
感谢分享!
收藏
[解决办法]
很棒, 谢谢分享.
[解决办法]
新版怎么不能收藏帖子啊
[解决办法]
测试通过,支持分享

[解决办法]
收藏!。。。。。
[解决办法]
看起来不错,要了
[解决办法]
测试通过,很好的,
收藏下
[解决办法]
xiexi!
[解决办法]
测试通过,很好的,
收藏下
[解决办法]
luguo
字符不够啊
[解决办法]
不错,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
[解决办法]
好贴,收藏了