首先,我已经阅读了有关此特定问题的现有StackOverflow答案。这些答案的共识似乎是关于权限或现有文件等...我已经消除了所有这些问题。
基本上,这里的流程如下:
该应用程序采用24位PNG文件并将其读入Bitmap对象,bmpOriginal。
应用程序使用JPG编码器将bmpOriginal保存到内存流中(通过ImageCodecInfo.GetImageEncoders()循环获取,直到找到带有" image / jpeg" MimeType的那个。
该应用程序在步骤2中从内存流创建一个新的位图bmpOptimized,并将其显示在PictureBox中。到目前为止,一切都很好 - 一切都按预期工作,我甚至可以在新的Bitmap中看到JPG压缩工件,所以我知道编码器正在工作。
稍后在代码流程中,用户单击一个按钮,它应该使用Bitmap.Save()方法将bmpOptimized保存到新文件。
当我运行它时,它会抛出一个关于&#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。
答案 0 :(得分:1)
请尝试以下
请检查memory stream
在disposed
图像保存到所需位置之前是否bmpOptimized
是否var_dump($row)
。如果问题仍然存在,则Check if path exists.