内存泄漏陷阱
使用System.Drawing处理图片时,未正确释放Bitmap或Graphics对象会导致内存泄漏。即使代码看似调用了Dispose(),异常中断也可能阻止资源释放。推荐使用using语句包裹相关对象:
using (Bitmap bmp = new Bitmap("input.jpg"))
{
// 处理逻辑
} // 自动调用Dispose()
色彩空间误解陷阱
图片在保存为JPEG格式时,默认使用YCbCr色彩空间而非RGB,导致颜色信息被压缩转换。显式指定色彩模式可减少损失:
var jpegEncoder = ImageCodecInfo.GetImageEncoders()
.First(e => e.FormatID == ImageFormat.Jpeg.Guid);
var encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = new EncoderParameter(Encoder.ColorDepth, 24); // 保持24位色深
伪无损压缩陷阱
重复保存同一JPEG文件会累积压缩损失。解决方案包括:
- 始终保留原始文件副本
- 使用PNG格式处理中间步骤
- 通过
Encoder.Quality参数控制压缩比(100表示最高质量):
encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, 100L);
像素格式陷阱
Bitmap的默认像素格式可能不符合实际需求。例如处理透明通道时需指定PixelFormat.Format32bppArgb:
Bitmap processed = new Bitmap(source.Width, source.Height, PixelFormat.Format32bppArgb);
EXIF数据丢失陷阱
图片旋转、裁剪等操作会破坏原始EXIF元数据。需手动读取并重新写入:
PropertyItem[] exifItems = source.PropertyItems; // 读取原图元数据
foreach (var item in exifItems)
{
processed.SetPropertyItem(item); // 写入新图
}
650

被折叠的 条评论
为什么被折叠?



