将图像转换为GIF,部分工作?

时间:2014-04-14 14:32:55

标签: c# image-processing animated-gif

我写了一个简短的方法,用于将图像(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将无效。

1 个答案:

答案 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

引自:http://social.msdn.microsoft.com/Forums/en-US/6ef358a7-d1ac-4267-91d9-166024aad8ca/creating-animated-gif-files-in-wpf?forum=wpf

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创建自己的元数据编写器,请按照上面帖子中提供的链接获取元数据读写器的文档。