如何获取.Net来保存此图像?我有这个jpeg,可以在picasa、photoshop、网络浏览器等中正常打开,但在.Net中它只是拒绝工作。图片image=Image.FromFile(@"myimage.jpg");image.Save(@"myimage2.jpg");//ExternalException-GDI+中发生一般性错误。没有办法在.Net中恢复它,所以我可以使用它(我需要调整它)而不是从源头上解决问题吗?完整异常详细信息:来源:System.Drawing类型:System.Runtime.InteropServices.ExternalException消息:GDI+中发生一般错误。堆栈跟踪:在C中的System.Drawing.Image.Save(字符串文件名,ImageCodecInfo编码器,EncoderParametersencoderParams)在System.Drawing.Image.Save(字符串文件名,ImageFormat格式)在System.Drawing.Image.Save(字符串文件名):ConsoleApplication20.Program.Main(String[]args)inUserssamDesktopSourceConsoleApplication20ConsoleApplication20Program.cs:line16此问题在Windows7上重现。它似乎在WindowsXP和Vista上运行良好,但在Windows7上运行不正常。我能够在MicrosoftConnect上找到这个问题。它与您的问题不同,但看起来非常相似-尝试重新保存JPEG文件时出现ExternalException。目前有16个代表,包括一些评论,这个问题在最终版本中仍然存在。所以它看起来不是.NETFramework中的错误,而是Windows7中的错误-特别是GdipSaveImageToStreamAPI中的错误。正如其他人所提到的,解决方法是转换为另一种格式。这就是Marc和Darin的回答所做的。JPEG文件中显然有一些“额外”信息触发了Win7中的错误。当您转换为不同的格式或进行位图复制时,该信息(可能是EXIF?)将被消除。这似乎可行:.Jpeg);}反正image其实就是Bitmap,应该差不多吧。奇怪的是myimage2小了5k-jpegfunmyimage2一个好处是你可以同时调整大小(你的实际意图):使用(Imageimage=Image.FromFile(@"c:dumpmyimage.jpg"))使用(Imageclone=newBitmap(image,newSize(image.Size.Width/2,image.Size.Height/2))){clone.Save(@"c:dumpmyimage2.jpg",ImageFormat.Jpeg);}尝试明确指定格式:使用(Imageimage=Image.FromFile(@"test.jpg")){image.Save(@"myimage2.gif",ImageFormat.Gif);对于所有ImageFormat.Png、ImageFormat.Bmp和ImageFormatThe.Gif工作正常。ImageFormat.Jpeg抛出异常。原始图像是JFIF格式,因为它以FFD8FFE0字节开头。这是.NETFramework本身的一个长期存在的错误,我不希望它很快得到修复。我还遇到了一些相关的错误,它们会抛出“GDI+中发生一般错误”,包括如果您访问某些JPEG的PropertyItem集合(检查EXIF代码),那么从那时起您将不会能够保存图像。此外,没有韵律或原因,有些JPEG,就像你在这里的那些,根本不会保存。请注意,仅保存为不同的格式并不总是有效,但在这种情况下确实有效。我在我的应用程序中使用的解决方法是使用来自网络的图片(因此看到的不仅仅是这些类型问题的公平份额)是捕获ExternalException并将图像复制到新的位图中,就像Answer之前的位图一样,但是简单地将其保存为新的JPEG会降低质量,因此我使用类似这样的方法来保持质量:namespaceImageConversionTest{usingSystem.Drawing;使用System.Runtime.InteropServices;使用System.Drawing.Imaging;使用System.Globalization;classProgram{staticvoidMain(string[]args){using(Imageim=Image.FromFile(@"C:20128X.jpg")){stringsaveAs=@"C:output.jpg";编码器参数encoderParams=null;ImageCodecInfo编解码器=GetEncoderInfo("image/jpeg");如果(编解码器!=null){intquality=100;//最高质量EncoderParameterqualityParam=newEncoderParameter(System.Drawing.Imaging.Encoder.Qualquality);encoderParams=new编码器参数(1);encoderParams.Param[0]=质量参数;}try{if(encoderParams!=null){im.Save(saveAs,codec,encoderParams);}else{im.Save(saveAs,ImageFormat.Jpeg);}}catch(ExternalException){//复制和保存分开yusing(Imagetemp=newBitmap(im)){if(encoderParams!=null){temp.Save(saveAs,codec,encoderParams);}else{temp.Save(saveAs,ImageFormat.Jpeg);}}}}}privatestaticImageCodecInfoGetEncoderInfo(stringmimeType){//获取所有图像格式的图像编解码器ImageCodecInfo[]codecs=ImageCodecInfo.GetImageEncoders();//找到正确的图像编解码器foreach(ImageCodecInfocodecincodecs){if(string.Compare(codec.MimeType,mimeType,true,CultureInfo.InvariantCulture)==0){returncodec;}}返回空值;注意,你会丢失EXIF信息,但我暂时不会这样做(即使保存源图像失败,你通常仍然可以读取EXIF代码)我早就放弃尝试了找出.NET不喜欢特定图像的地方(如果有人想接受挑战,有各种失败案例的样本),但上面的工作很好,很好。尝试使用WPF的BitmapSource而不是WinForm的Image,它支持更多的像素、图像和文件格式。我昨天在32位XP上试过,但无法重现问题。今天试了下Win764bit,得到的正是你描述的错误,这对我的调试非常有用。我查看了标题,JPEG是标准的JPEG,但带有EXIF标题。据我所知,EXIF标头损坏的情况并不少见,有些程序会忽略它。在.NET中,它允许读取和(有时甚至可能允许写入)但不允许写入。你可以在这里读更多关于它的内容。http://blogs.msdn.com/calvin_hsia/archive/2005/07/24/442873.aspx删除它的一种方法是像Marc建议的那样克隆图像,这将创建一个没有EXIF标头的新图像,所以这解释了为什么文件大小实际上更小。有一种以编程方式删除EXIF标头的方法,一些已在StackOverflow中建议如下:SimplewaytoremoveEXIFdatafromJPEGusing.NETReadthebytemarkandskipthestream建议的问题不起作用,因为我们正在处理损坏的EXIF标头。我尝试使用RemovePropertyItem作为选项,但它仍然不起作用,我的猜测是因为引用了损坏的属性项(当我检查JPEG标头有6个属性时,.NET只加载4个)。他们是可以探索的其他库,例如exiv2net,但我怀疑结果是否相似。简而言之,答案是按照Marc的建议克隆图像。这可能不是解决方案,而是对问题的洞察。尝试检查您的权限。保存失败可能是因为没有正确的写入/修改权限,并可能产生此错误。当您有一个时会发生此错误。没有写入文件的权限b.您正在尝试编写一个被锁定的图像(通常,通过UI控件,即picturebox)您需要处理原始文件,然后使用resize克隆保存它,如Marc的回答。我想我会告诉你为什么会这样。以上就是C#学习教程:Howtolet.Netsavethisimage?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
