我写了一个简短的方法,用于将图像(Image类)转换为GifEncoder,最后将Gif保存到文件中。但是,当我打开生成的Gif时,它有一些问题。 1)Gif在浏览器中停止播放2个循环后停止播放。 2)当通过图像编辑器加载时,颜色似乎在像素之间混合了一点。
public void ConvertToGif( string DestinationPath , Image myImage , int myFrames ) {
Bitmap myBitmap = new Bitmap( myImage.Width / myFrames , myImage.Height );
GifBitmapEncoder myEncoder = new GifBitmapEncoder();
int i = 0;
while( i < myFrames ) {
Graphics GrDrw = Graphics.FromImage( myBitmap );
var DestRegion = new Rectangle( 0 , 0 , myBitmap.Width , myBitmap.Height );
var SrceRegion = new Rectangle( myBitmap.Width * i , 0 , myBitmap.Width , myBitmap.Height );
GrDrw.DrawImage( myImage , DestRegion , SrceRegion , GraphicsUnit.Pixel );
BitmapSource mySource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap( myBitmap.GetHbitmap() , IntPtr.Zero , Int32Rect.Empty , BitmapSizeOptions.FromEmptyOptions() );
myEncoder.Frames.Add( BitmapFrame.Create( mySource , mySource ) );
GrDrw.Dispose();
i += 1;
}
System.IO.FileStream myStream = new System.IO.FileStream( @DestinationPath , System.IO.FileMode.Create );
myEncoder.Save( myStream );
}
使用ConvertToGif()创建的图像中的帧数似乎也不会通过我的其他方法ConvertFromGif()运行生成的Gif时注册:
public Image ConvertFromGif( Image myImage ) {
var myDimensions = new FrameDimension( myImage.FrameDimensionsList[ 0 ] );
var myFrames = myImage.GetFrameCount( myDimensions );
var newImage = new Bitmap( myImage.Width * myFrames , myImage.Height );
for( int i = 0; i < myFrames; i ++ ) {
myImage.SelectActiveFrame( myDimensions , i );
var DestRegion = new Rectangle( myImage.Width * i , 0 , myImage.Width , myImage.Height );
var SrceRegion = new Rectangle( 0 , 0 , myImage.Width , myImage.Height );
Graphics GrDrw = Graphics.FromImage( newImage );
GrDrw.DrawImage( myImage , DestRegion , SrceRegion , GraphicsUnit.Pixel );
GrDrw.Dispose();
}
return newImage;
}
我可以通过我的ConvertFromGif()方法运行任何Gif,但我的ConvertToGif()方法生成的Gifs将无效。
答案 0 :(得分:1)
我看了一眼,发现GifBitmapEncoder只是为了读取GIF,所以它们可以在WPF中显示,这个类允许你创建多帧GIF但是它不提供允许你放置的元数据处理程序关键帧信息,如周期计数,帧间延迟等。他们已将元数据部分留给第三方实施
不幸的是,我们没有为GIF公开元数据阅读器或编写器 (动画或其他)。为了制作正确的动画GIF, 你需要用时序信息写出一些元数据。因为我们 没有提供GIF元数据处理程序,我们确实提供了一种机制 第三方写自己的。用于编写元数据的文档 处理程序可以在这里找到: http://msdn2.microsoft.com/en-us/library/ms737407.aspx以及。{ 本文 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnlong/html/wiccodec.asp
Gif有一些默认的时间信息,所以你得到了2个周期,但这也可能与其他浏览器不同等。
同时在线查看我看到其他用户在帧之间出现相同问题。
您有两种途径:使用第三方.Net库,它允许您编写Gif或自己编写。
从上一个问题Convert a List of Images to a GIf我建议你使用NGif - http://www.codeproject.com/Articles/11505/NGif-Animated-GIF-Encoder-for-NET
但是,如果您想为GifBitmapEncoder创建自己的元数据编写器,请按照上面帖子中提供的链接获取元数据读写器的文档。