2017-09-25 28 views
1

GDI +中发生了一般性错误首先,我已阅读了有关此特定问题的现有StackOverflow答案。这些答案的共识似乎是关于权限或现有文件等...我已经消除了所有这些问题。在Bitmap.Save

基本上,这里的流程如下:

  1. 该应用程序需要一个24位的PNG文件和读取它变成一个位图对象时,bmpOriginal。

  2. 该应用保存bmpOriginal使用JPG编码器(从通过ImageCodecInfo.GetImageEncoders()循环,直到我发现了一个与“图像/ JPEG” Mime类型而获得的内存流。

  3. 该应用程序创建新的Bitmap,bmpOptimized,从步骤2中的内存流中显示出来,然后显示在PictureBox中。到目前为止,这么好 - 一切都按预期工作,我甚至可以在新的Bitmap中看到JPG压缩瑕疵,所以我知道编码器正在工作。

  4. 在代码流的后面,用户单击一个按钮,它应该将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,直到我保存了优化后的位图。

+2

请检查'内存流'是否'处置',直到'bmpOptimized'图像获取保存在所需的位置。此外,请参阅此[链接](https:// stackoverflow。com/questions/44592550 /无法解决-a-generic-error-in-gdi-when-save-image-in-web-api) –

+0

这几乎肯定是问题所在。创建位图对象后,我没有保留内存流。我会在今天核实 - 谢谢! – jhilgeman

+0

@BalagurunathanMarimuthu - 就是这样。我原来的代码有一个using()块中的MemoryStream,所以之后它就被清除了。一旦我保存了内存流,它工作得很好!你可以添加你的评论作为答案,所以我可以将其标记为答案并且赞成吗? – jhilgeman

回答

1

尝试以下

此请检查是否memory stream没有disposed直到bmpOptimized图像获取保存在所需位置。如果问题仍然存在,那么Check if path exists.

相关问题