奇怪的GDI +行为

时间:2009-10-10 10:07:33

标签: c# .net dispose

我根据图像质量制作了一个CompressImageSize方法。它的代码是

public static Image CompressImage(string imagePath, long quality)
{
    Image srcImg = LoadImage(imagePath);
    //Image srcImg = Image.FromFile(imagePath);

    EncoderParameters parameters = new EncoderParameters(1);
    parameters.Param[0] = new EncoderParameter(Encoder.Quality, quality);

    ImageCodecInfo encoder = GetCodecInfo("image/jpeg");

    srcImg.Save("d:\\creatives\\abcd123.jpg", encoder, parameters);
}

public static Image LoadImage(string filename)
{
    using (FileStream fs = new FileStream(filename, FileMode.Open))
    {
        return(Image.FromStream(fs));
    }
}

现在,当我运行此代码时,它会在保存srcImg(func#1中的最后一行)时给出“通用GDI +异常”,但是当我取消注释第二行并使用Image.FromFile加载图像时工作正常。

为什么??

6 个答案:

答案 0 :(得分:3)

根据MSDN

  

<强>说明:   您必须在图像的生命周期内保持流打开。

此处您的信息流位于使用区块中,因此在图像生命周期结束之前关闭。

答案 1 :(得分:0)

疯狂猜测...图像是IDisposable。你是在循环中调用它还是什么?尝试将您的Image本身放在using()块中?

答案 2 :(得分:0)

LoadImage的末尾,处理包含Image的FileStream。这太早了;文件流需要处于活动状态,以供调用LoadImage的方法使用。

请参阅MSDN上的using

答案 3 :(得分:0)

您应该重写代码:

public static Image LoadImage(string filename)
{
    FileStream fs = new FileStream(filename, FileMode.Open);        
    return Image.FromStream(fs);        
}

构造using在这种情况下是错误的,因为使用您的图片需要FileStream

答案 4 :(得分:0)

Image.FromFile()...

存在各种问题
Image srcImg = Image.FromFile(imagePath);

上述语句不会关闭文件流,如果您想再次访问文件或将其删除,将会产生问题。我会这样写你的功能。

public static Image CompressImage(string imagePath, long quality)
{
    using(FileStream fs = File.OpenRead(imagePath)){
       Image srcImg = Image.FromStream(fs);    

       EncoderParameters parameters = new EncoderParameters(1);    
       parameters.Param[0] = new EncoderParameter(Encoder.Quality, quality);    
       ImageCodecInfo encoder = GetCodecInfo("image/jpeg");    
       srcImg.Save("d:\\creatives\\abcd123.jpg", encoder, parameters);
    }
}

这将保证我的文件将在使用范围结束时关闭。

答案 5 :(得分:0)

修复,但对我来说,Dispose调用是.net框架中的一个错误......

public static Image CompressImage(string imagePath, long quality)
{
    Image srcImg = LoadImage(imagePath);
    //Image srcImg = Image.FromFile(imagePath);

    EncoderParameters parameters = new EncoderParameters(1);
    parameters.Param[0] = new EncoderParameter(Encoder.Quality, quality);

    ImageCodecInfo encoder = GetCodecInfo("image/jpeg");

    srcImg.Save("d:\\creatives\\abcd123.jpg", encoder, parameters);
srcImg.Dispose();
}