我根据图像质量制作了一个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加载图像时工作正常。
为什么??
答案 0 :(得分:3)
答案 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();
}