首先,我已经阅读了此特定问题的现有stackoverflow答案。这些答案的共识似乎是关于权限或现有文件等...我已经消除了所有这些问题。
基本上,这里的流量如下:
-
该应用程序取24位PNG文件并将其读取为bmporiginal的位图对象。
-
该应用程序使用JPG编码器将BMPORIGINAL保存到存储器流(通过通过ImageCodeCinfo.getImageEncoders()循环获得,直到我找到了带有" Image/jpeg" MimeType的一个。
-
该应用程序从步骤2中的内存流创建了一个新的位图,即BMPoptimized,并将其显示在Picturebox中。到目前为止,一切都很好 - 一切正常工作,我甚至可以在新的位图中看到JPG压缩工件,所以我知道编码器正在工作。
-
稍后在代码流中,用户单击一个按钮,并使用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
图像在所需的位置保存。如果问题持续存在,请检查路径是否存在。