C# 已将图像转换为Gif,是否部分工作?
我编写了一个简短的方法,用于将图像(图像类)转换为Gif编码器,并最终将Gif保存到文件中。但是,当我打开生成的Gif时,它有一些问题。1) Gif在浏览器中循环2次后停止播放。2) 当通过图像编辑器加载时,像素之间的颜色似乎有点混淆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
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;
}