EMGU CV 如何保存与PictureBox设置分辨率一致的相机高分辨率图像
高分辨率图像保存画质损失问题解决方案
核心诱因是大部分场景下开发者会直接从PictureBox控件读取渲染后的图像保存,而非使用相机输出的原始帧,同时保存参数设置不当也会导致画质劣化,可按以下步骤排查修复:
- 优先保存相机原始采集帧,避免从PictureBox取图
你在将采集到的帧赋值给PictureBox用于显示的同时,需要单独留存相机输出的原始Bitmap对象,该对象本身就是1288*1024分辨率,直接对该原始对象执行保存操作,可完全规避控件渲染、缩放带来的画质损失。
C#示例代码:// 采集到原始帧后同时处理显示和存储源 Bitmap originalCapturedFrame = [相机SDK采集接口返回的原始帧对象]; pictureBox1.Image = originalCapturedFrame; // 保存时直接调用原始帧的Save方法 originalCapturedFrame.Save("D:\\capture.png", ImageFormat.Png); - 调整保存参数降低压缩损失
如果需要使用JPEG格式存储,不要使用默认保存参数,手动设置压缩质量为最高等级,避免过度压缩导致画质下降:
无特殊需求的话优先选择PNG、BMP等无损格式保存,不会出现画质损失。// 配置JPEG最高质量保存参数 EncoderParameter qualityParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L); ImageCodecInfo jpegEncoder = ImageCodecInfo.GetImageEncoders().First(codec => codec.FormatID == ImageFormat.Jpeg.Guid); EncoderParameters encoderParams = new EncoderParameters(1); encoderParams.Param[0] = qualityParam; // 用最高质量参数保存 originalCapturedFrame.Save("D:\\capture.jpg", jpegEncoder, encoderParams); - 特殊场景需从PictureBox取图的处理方案
如果确实没有留存原始帧只能从控件取图,需要先将PictureBox的SizeMode属性设置为Normal或AutoSize,避免控件自动缩放图像导致分辨率变化,再通过以下方式提取控件的完整分辨率图像:Bitmap captureFromControl = new Bitmap(pictureBox1.Width, pictureBox1.Height); pictureBox1.DrawToBitmap(captureFromControl, new Rectangle(0, 0, captureFromControl.Width, captureFromControl.Height)); captureFromControl.Save("D:\\capture.png", ImageFormat.Png);
内容的提问来源于stack exchange,提问作者Rohit Bakshi
相关产品推荐
相关产品推荐

