繁体   English   中英

Bitmap.Save 期间 GDI+ 中出现一般错误

[英]A generic error occurred in GDI+ during Bitmap.Save

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

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

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

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

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

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

当我运行它时,它会抛出一个关于“GDI+ 中发生一般错误”的错误。

我再次检查以确保该文件夹可写并且该文件尚不存在。 事实上,该应用程序确实在正确的位置创建了一个文件,但它是空的(0 字节)。

唯一看起来很奇怪的另一件事是 bmpOriginal 和 bmpOptimized 都具有相同的 RawFormat 值:

{[图像格式: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 直到我保存优化的位图。

下面试试这个

请检查是否memory stream没有disposed直到bmpOptimized图像获取保存在所需位置。 如果问题仍然存在,则检查路径是否存在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM