c# 图片压缩内存溢出
时间: 2023-10-28 14:29:53 浏览: 138
图片过大引起的内存溢出解决方案
3星 · 编辑精心推荐
图片压缩时可能会出现内存溢出的问题,特别是当处理大型图片时。为了避免这个问题,可以尝试使用以下方法:
1. 逐行读取:不要一次性读取整张图片,而是按行读取,然后逐行进行处理。这样可以降低内存占用。
2. 使用流:可以使用 MemoryStream 来读取和写入图片数据,这样可以避免频繁的文件读写操作。
3. 调整压缩质量:压缩质量越高,生成的图片文件越大,占用的内存也越多。因此,可以适当调整压缩质量,来减小内存占用。
4. 使用 using 语句:在使用完 Bitmap、Graphics 和 Image 对象后,应该及时释放它们所占用的资源。可以使用 using 语句来自动释放资源,以避免内存泄漏。
下面是一个示例代码,演示如何使用流来进行图片压缩:
```csharp
public static void CompressImage(string sourcePath, string destinationPath, int maxWidth, int maxHeight, int quality)
{
using (var sourceStream = new FileStream(sourcePath, FileMode.Open, FileAccess.Read))
{
using (var sourceImage = Image.FromStream(sourceStream))
{
int sourceWidth = sourceImage.Width;
int sourceHeight = sourceImage.Height;
// 计算压缩比例
double ratio = Math.Min((double)maxWidth / sourceWidth, (double)maxHeight / sourceHeight);
int newWidth = (int)(sourceWidth * ratio);
int newHeight = (int)(sourceHeight * ratio);
// 创建新图片
using (var bitmap = new Bitmap(newWidth, newHeight))
{
using (var graphics = Graphics.FromImage(bitmap))
{
// 设置画布的质量
graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
// 绘制新图片
graphics.DrawImage(sourceImage, new Rectangle(0, 0, newWidth, newHeight));
}
// 保存新图片
using (var destinationStream = new FileStream(destinationPath, FileMode.Create))
{
var encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, quality);
var jpegEncoder = ImageCodecInfo.GetImageEncoders().FirstOrDefault(x => x.FormatID == ImageFormat.Jpeg.Guid);
bitmap.Save(destinationStream, jpegEncoder, encoderParams);
}
}
}
}
}
```
在这个方法中,我们使用 FileStream 来读取源图片,使用 MemoryStream 来写入新图片,使用 using 语句来自动释放资源。同时,我们还可以通过调整 quality 参数来控制压缩质量。
阅读全文