Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 已将图像转换为Gif,是否部分工作?_C#_Image Processing_Animated Gif - Fatal编程技术网

C# 已将图像转换为Gif,是否部分工作?

C# 已将图像转换为Gif,是否部分工作?,c#,image-processing,animated-gif,C#,Image Processing,Animated Gif,我编写了一个简短的方法,用于将图像(图像类)转换为Gif编码器,并最终将Gif保存到文件中。但是,当我打开生成的Gif时,它有一些问题。1) Gif在浏览器中循环2次后停止播放。2) 当通过图像编辑器加载时,像素之间的颜色似乎有点混淆 public void ConvertToGif( string DestinationPath , Image myImage , int myFrames ) { Bitmap myBitmap = new Bitmap( myImage.Width

我编写了一个简短的方法,用于将图像(图像类)转换为Gif编码器,并最终将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 );
}
public void ConvertToGif(字符串DestinationPath、Image myImage、int myFrames){
位图myBitmap=新位图(myImage.Width/myFrames,myImage.Height);
GifBitmapEncoder myEncoder=新的GifBitmapEncoder();
int i=0;
而(i
通过我的另一个方法ConvertFromGif()运行生成的Gif时,使用ConvertToGif()创建的图像的帧数似乎也没有注册:

public Image ConvertFromGif(Image myImage){
var myDimensions=新的FrameDimension(myImage.FrameDimensionsList[0]);
var myFrames=myImage.GetFrameCount(myDimensions);
var newImage=新位图(myImage.Width*myFrames,myImage.Height);
对于(int i=0;i

我可以通过ConvertFromGif()方法运行任何Gif,但Gif是由ConvertToGif()生成的方法不起作用。

我环顾四周,发现GifBitmapEncoder实际上只用于读取GIF,以便它们可以显示在WPF中。该类允许您创建多帧GIF,但它不提供元数据处理程序,允许您放置关键帧信息,如循环计数,帧之间的延迟等。他们将元数据部分留给第三方来实现

不幸的是,我们没有公开GIF的元数据读取器或写入器 (动画或其他)。为了制作正确的动画GIF, 您需要写出一些带有时间信息的元数据。自从我们 我们不提供GIF元数据处理程序,而是为 第三方自己写。用于编写元数据的文档 处理程序可在此处找到: 以及 本文

引自:

GIF有一些默认的时间信息,所以你得到的是2个周期,但这是所有它也可能不同于其他浏览器等

另外,当我在网上查看时,我看到其他用户也有相同的问题,即帧间颜色溢出

有两种方法可供选择:使用第三方.Net库,该库允许您编写GIF或编写自己的GIF

根据您之前的问题,我建议您使用NGif-

但是,如果您想为GifBitmapEncoder创建自己的元数据编写器,请遵循上面文章中提供的元数据读取和编写器文档链接

    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;
    }