bitmap.save期间的GDI 发生了通用错误



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

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

  1. 该应用程序取24位PNG文件并将其读取为bmporiginal的位图对象。

  2. 该应用程序使用JPG编码器将BMPORIGINAL保存到存储器流(通过通过ImageCodeCinfo.getImageEncoders()循环获得,直到我找到了带有" Image/jpeg" MimeType的一个。

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

  4. 稍后在代码流中,用户单击一个按钮,并使用bitmap.save()方法。

当我运行此操作时,它会出现关于" GDI 中发生的通用错误"的错误。

i进行了仔细检查,以确保文件夹可以写入并且该文件尚未存在。实际上,该应用程序确实确实在正确的位置创建了一个文件,但是它是空的(0字节)。

唯一奇怪的另一件事是Bmporiginal和Bmpoptimiend都具有相同的原始形式值:

{[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");

...这就是错误发生的地方。

请注意,此编辑只是添加了流程的简化版本,因为人们显然因缺乏源代码而下降了此问题。发表评论的一个人实际提供了正确的答案 - 我需要保留记忆线,直到我保存了优化的位图后。

尝试以下

请检查memory stream是否没有disposed,直到bmpOptimized图像在所需的位置保存。如果问题持续存在,请检查路径是否存在。

相关内容

最新更新