GDI +中发生了一般性错误首先,我已阅读了有关此特定问题的现有StackOverflow答案。这些答案的共识似乎是关于权限或现有文件等...我已经消除了所有这些问题。在Bitmap.Save
基本上,这里的流程如下:
该应用程序需要一个24位的PNG文件和读取它变成一个位图对象时,bmpOriginal。
该应用保存bmpOriginal使用JPG编码器(从通过ImageCodecInfo.GetImageEncoders()循环,直到我发现了一个与“图像/ JPEG” Mime类型而获得的内存流。
该应用程序创建新的Bitmap,bmpOptimized,从步骤2中的内存流中显示出来,然后显示在PictureBox中。到目前为止,这么好 - 一切都按预期工作,我甚至可以在新的Bitmap中看到JPG压缩瑕疵,所以我知道编码器正在工作。
在代码流的后面,用户单击一个按钮,它应该将bmpOptimized保存到一个新文件中,使用Bitmap.Save()me的ThOD。
当我运行它时,它会抛出一个关于“GDI +中发生的一般性错误”的错误。
我仔细检查,确保文件夹是可写的,并且文件不存在。实际上,应用程序实际上确实在正确的位置创建了一个文件,但它是空的(0字节)。
,似乎奇怪唯一的其他事情是,bmpOriginal和bmpOptimized都具有相同的RawFormat值:
{[的imageformat:b96b3caf-0728-11d3-9d7b-0000f81ef32e]}
...即使bmpOriginal来自PNG,而bmpOptimized来自编码的JPEG。
编辑: 的代码看起来是这样的:
public Bitmap bmpOriginal;
public Bitmap bmpOptimized;
...
// Step 1
bmpOriginal = new Bitmap("foo.png");
// Step 2
using(MemoryStream ms = new MemoryStream())
{
ImageCodecInfo _jpgEncoder = _getEncoder("image/jpeg");
EncoderParameters _encoderParams = new EncoderParameters(1);
_encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, 70L);
bmpOriginal.Save(ms, _jpgEncoder, _encoderParams);
// Step 3
bmpOptimized = new Bitmap(ms);
}
再后来就当用户点击该按钮第4步:
bmpOptimized.Save("bar.jpg");
...这就是错误发生。
请注意,此编辑只是简单地添加流程的简化版本,因为人们显然由于缺乏源代码而低估了此问题。一个人评论实际上提供了正确的答案 - 我需要保留MemoryStream,直到我保存了优化后的位图。
请检查'内存流'是否'处置',直到'bmpOptimized'图像获取保存在所需的位置。此外,请参阅此[链接](https:// stackoverflow。com/questions/44592550 /无法解决-a-generic-error-in-gdi-when-save-image-in-web-api) –
这几乎肯定是问题所在。创建位图对象后,我没有保留内存流。我会在今天核实 - 谢谢! – jhilgeman
@BalagurunathanMarimuthu - 就是这样。我原来的代码有一个using()块中的MemoryStream,所以之后它就被清除了。一旦我保存了内存流,它工作得很好!你可以添加你的评论作为答案,所以我可以将其标记为答案并且赞成吗? – jhilgeman