当前位置: 首页 > 编程语言 > C#

在C#中,这可能是Image.SaveAdd的一个错误,谁能帮我修复它?Share

时间:2023-04-10 11:38:42 C#

在C#中,可能是Image.SaveAdd的错误,谁能帮我修复一下?我正在尝试将两个不同的gif文件合并到一个文件中。首先,我学到了很多关于gif格式的知识。我知道延迟时间值是在图形控件扩展中设置的,是一个gif文件块。我保存了第一个gif并使用以下代码设置FrameDelay值:ImageCodecInfocodeInfo=GetEncoder(ImageFormat.Gif);System.Drawing.Imaging.EncodersaveEncoder=System.Drawing.Imaging.Encoder.SaveFlag;EncoderParameters参数=newEncoderParameters(1);parameters.Param[0]=newEncoderParameter(saveEncoder,(long)EncoderValue.MultiFrame);PropertyItemPropertyTagFrameDelay=img1.GetPropertyItem(0x5100);PropertyTagFrameDelay.Value=newbyte[]{0x96,0x00};//这是延迟值0x0096,表示1.5秒img1.SetPropertyItem(PropertyTagFrameDelay);PropertyItemLoopCount=img1.GetPropertyItem(0x5101);LoopCount.Value=newbyte[]{0x00,0x00};//这意味着gifless.SetPropertyItem(LoopCount);img1.Save(@"c:ddd.gif",codeInfo,参数);然后我尝试添加另一张图片作为第二帧。参数=新的编码器参数(1);parameters.Param[0]=newEncoderParameter(saveEncoder,(long)EncoderValue.FrameDimensionTime);PropertyTagFrameDelay=img2.GetPropertyItem(0x5100);PropertyTagFrameDelay.Value=newbyte[]{0x000,};//这是延迟值0x0096,表示1.5秒img2.SetPropertyItem(PropertyTagFrameDelay);最后,我应该终止这个图像。参数=新的编码器参数(1);parameters.Param[0]=newEncoderParameter(saveEncoder,(long)EncoderValue.Flush);img1.SaveAdd(参数);发现第二帧的延迟时间一直是0,试了很多方法,不知道是不是0x96。这有什么问题吗?.NET图像编码器都不支持这一点。System.Drawing.Bitmap和System.Windows.Media.Imaging.PngBitmapEncoder类的基础本机编解码器,无论是GDI+还是WIC。虽然这听起来像是一个非常奇怪的疏忽,但最可能的原因是GIF受到软件专利的阻碍。Unisys拥有LZW压缩算法的权利,并开始积极收取许可费。从能拿到最多钱的最明显的目标开始,微软总是名列前茅。他们也不是谦虚的非商业或私人网站,在他们的页面上使用GIF在1999年不得不掏出5000美元。这扼杀了图像格式。它们之前无处不在,几乎每个人都停止使用它们。也很快,只用了几个月。令人高兴的是,每个人都可以完全访问GIF动画,这在过去是多余的。您可能会在防御者机器上发现一些页面,其中所有内容都从您的眼角移开。这不是唯一的幸运巧合,而是PNG格式开源的核心原因。感谢我们的幸运星:)该专利大约在2004年到期,具体取决于您居住的地方,因此您不必再担心来自Unisys的信函。简而言之,您必须四处寻找另一个库才能将此功能添加到您的方案中。ThisexistingSOquestion很好地涵盖了它,不需要在这里重复。来自Microsoft开发人员中心:您不能使用SaveAdd将帧添加到动画gif文件。为了构建动画gif,您需要逐步浏览动画中的每一帧。VCSKicks或Stackoverflow上的相同代码就是一个很好的例子。更新:我做了更多研究,我认为这些ffmpeg和mplayer建议值得尝试:从一组jpeg图像创建动画gif更新2:RickvandenBosch的代码非常好,因为它可以让您访问延迟时间:。Net(至少1.1,他们可能将其合并到2.0)不提供通过GDI+创建动画GIF的可能性。//变量声明StringCollectionstringCollection;内存流内存流;二进制写入器二进制写入器;形象形象;字节[]buf1;字节[]buf2;字节[]buf3;//变量声明stringCollection=a_StringCollection_containing_images;Response.ContentType="图片/gif";内存流=新内存流();buf2=新字节[19];buf3=新字节[8];buf2[0]=33;//扩展引入器buf2[1]=255;//应用扩展buf2[2]=11;//块的大小buf2[3]=78;//Nbuf2[4]=69;//Ebuf2[5]=84;//Tbuf2[6]=83;//Sbuf2[7]=67;//Cbuf2[8]=65;//一个buf2[9]=80;//Pbuf2[10]=69;//Ebuf2[11]=50;//2buf2[12]=46;//。buf2[13]=48;//0buf2[14]=3;//块的大小buf2[15]=1;//buf2[16]=0;//buf2[17]=0;//buf2[18]=0;//块终结符buf3[0]=33;//扩展引入器buf3[1]=249;//图形控件扩展buf3[2]=4;//块的大小buf3[3]=9;//标志:保留,处理方法,用户输入,透明t颜色buf3[4]=10;//延时低字节buf3[5]=3;//延时时间高字节buf3[6]=255;//透明颜色索引buf3[7]=0;//块终止符binaryWriter=newBinaryWriter(Response.OutputStream);for(intpicCount=0;picCount正如Hans提到的,它不受支持,因此RenniePet建议的第三种解决方案是从两个Gif中提取帧,然后将所有帧组合在一起添加对System.Drawing.DLL的引用并使用此代码获取:usingSystem.Drawing;使用System.Drawing.Imaging;公共类GifImage{私人图像gifImage;私有FrameDimension维度;私有int帧计数;privateintcurrentFrame=-1;私人布尔反转;私人整数步骤=1;公共GifImage(字符串路径){gifImage=Image.FromFile(路径);//初始化维度=newFrameDimension(gifImage.FrameDimensionsList[0]);//获取GUID//动画中的总帧数frameCount=gifImage.GetFrameCount(dimension);}publicintGetFrameCount(){返回帧数;}publicboolReverseAtEnd{//gif到达末尾时是否向后播放get{returnreverse;}设置{反向=值;}}publicImageGetNextFrame(){currentFrame+=step;//如果动画到达边界...if(currentFrame>=frameCount||currentFrame我们可以像这样提取所有屏:privatestaticreadonlystringtempFolder=@"C:temp";staticvoidMain(string[]args){组合Gif(@"c:tempa.gif",@"c:tempb.gif");}publicstaticvoidCombineGifs(stringfirstImageFilePath,stringsecondImageFilePath){intframeCounter=ExtractGifFramesAndGetCount(firstImageFilePath,0);帧计数器);字符串filePathOfCombinedGif=CombineFramesIntoGif(0,secondframeCounter);}privatestaticintExtractGifFramesAndGetCount(stringfilePath,intimageNameStartNumber){////NGif在我尝试时出错//GifDecoder=newGifDecoder(//GifDecoder=new)GifDecoder;gifDecoder.Read(文件路径);//intframeCounter=imageNameStartNumber+gifDecoder.GetFrameCount();//for(inti=imageNameStartNumber;i接下来,我们使用NGif将所有帧组合成一个动画gif下载代码,打开解决方案并编译Components项目以获取DLLGif.Components.dll并在中引用该DLL解决方案privatestaticstringCombineFramesIntoGif(intstartFrameCount,intendFrameCount){ListimageFilePaths=newList();for(inti=startFrameCount;i如果你愿意使用第三方库,你可以使用Magick.NET。这是ImageMagick的C#包装器。以上是C#学习教程:在C#中,这可能是Image.SaveAdd的一个bug,谁能帮我解决一下?如果分享的内容对你有用,需要进一步了解C#学习教程,希望你多多关注---using(MagickImageCollectionimages=newMagickImageCollection()){MagickImagefirstFrame=newMagickImage("first.动图”);firstFrame.AnimationDelay=1500;images.Add(firstFrame);MagickImagesecondFrame=newMagickImage("second.gif");secondFrame.AnimationDelay=200;images.Add(secondFrame);//此方法将尝试使您的输出图像更小。images.OptimizePlus();images.Write(@"c:ddd.gif");}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: