You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript调用摄像头拍照后画质下降如何保留图像清晰度?

核心原因

你当前出现画质下降的核心原因是硬编码了400*400的绘制尺寸,强制压缩了摄像头采集的原始高分辨率视频帧,导致像素信息丢失。

解决方案

  • 匹配canvas尺寸与摄像头原始分辨率
    不要固定绘制尺寸,读取视频流的实际输出宽高设置canvas的画布像素尺寸(注意区分画布像素尺寸和CSS展示尺寸,前者决定实际画质,后者仅控制页面展示大小)
  • 避免强制拉伸压缩
    绘制时使用视频原始宽高,不做等比缩放外的强制变形,保证像素点一一对应
  • 导出参数优化
    当前使用的image/png为无损导出格式,本身不会带来额外画质损失;如果后续切换为JPEG格式,需手动设置最高质量参数toDataURL('image/jpeg', 1.0)
  • 采集阶段指定高分辨率
    请求摄像头权限时配置理想分辨率参数,保证采集阶段就能拿到高清晰度的视频流

修改后的代码示例

drawImageToCanvas(image: HTMLVideoElement) {
  // 获取摄像头输出的原始分辨率
  const originWidth = image.videoWidth;
  const originHeight = image.videoHeight;
  const canvas = this.canvas.nativeElement;
  // 调整canvas画布像素尺寸匹配原始视频
  canvas.width = originWidth;
  canvas.height = originHeight;
  // 1:1绘制无压缩
  return canvas.getContext('2d').drawImage(image, 0, 0, originWidth, originHeight);
}

takePhoto(): void {
  this.drawImageToCanvas(this.video.nativeElement);
  const imgData = this.canvas.nativeElement.toDataURL('image/png');
  this.img = imgData;
  this.DownloadFile(imgData, 'image');
}

采集阶段高分辨率配置示例(getUserMedia阶段)

const streamConstraints = {
  video: {
    width: { ideal: 2560 }, // 可根据业务需求调整理想分辨率
    height: { ideal: 1440 },
    facingMode: 'environment' // 移动端默认后置摄像头,按需配置
  }
}
// 调用摄像头时传入配置
const stream = await navigator.mediaDevices.getUserMedia(streamConstraints);

内容的提问来源于stack exchange,提问作者Mr Coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 09:57:04