在Bitmap.Save期间GDI +中发生了一般错误

时间:2017-09-25 07:24:00

标签: c# bitmap

首先,我已经阅读了有关此特定问题的现有StackOverflow答案。这些答案的共识似乎是关于权限或现有文件等...我已经消除了所有这些问题。

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

  1. 该应用程序采用24位PNG文件并将其读入Bitmap对象,bmpOriginal。

  2. 应用程序使用JPG编码器将bmpOriginal保存到内存流中(通过ImageCodecInfo.GetImageEncoders()循环获取,直到找到带有" image / jpeg" MimeType的那个。

  3. 该应用程序在步骤2中从内存流创建一个新的位图bmpOptimized,并将其显示在PictureBox中。到目前为止,一切都很好 - 一切都按预期工作,我甚至可以在新的Bitmap中看到JPG压缩工件,所以我知道编码器正在工作。

  4. 稍后在代码流程中,用户单击一个按钮,它应该使用Bitmap.Save()方法将bmpOptimized保存到新文件。

  5. 当我运行它时,它会抛出一个关于&#34的错误; 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。

1 个答案:

答案 0 :(得分:1)

请尝试以下

请检查memory streamdisposed图像保存到所需位置之前是否bmpOptimized是否var_dump($row)。如果问题仍然存在,则Check if path exists.