当前位置:首页 > JavaScript

js实现HDR

2026-04-06 17:29:12JavaScript

HDR 实现原理

高动态范围(HDR)通过合成多张不同曝光的图像,保留亮部和暗部细节。核心步骤包括曝光序列拍摄、图像对齐、色调映射。

多曝光图像合成

使用 canvasWebGL 合并不同曝光度的图像。以下代码演示通过加权平均合成:

function blendExposures(images) {
  const canvas = document.createElement('canvas');
  const ctx = canvas.getContext('2d');
  canvas.width = images[0].width;
  canvas.height = images[0].height;

  // 初始化像素数据
  const blended = ctx.createImageData(canvas.width, canvas.height);
  const data = blended.data;

  // 加权混合(示例:简单平均)
  for (let i = 0; i < data.length; i += 4) {
    let r = 0, g = 0, b = 0;
    images.forEach(img => {
      const imgData = getImageData(img);
      r += imgData[i];
      g += imgData[i + 1];
      b += imgData[i + 2];
    });
    data[i] = r / images.length;     // R
    data[i + 1] = g / images.length; // G
    data[i + 2] = b / images.length; // B
    data[i + 3] = 255;               // Alpha
  }

  ctx.putImageData(blended, 0, 0);
  return canvas.toDataURL();
}

色调映射算法

将高动态范围压缩到显示器可呈现的范围,常用 Reinhard 算子:

js实现HDR

[ L{d} = \frac{L}{1 + L} \cdot L{\text{white}}^2 ]

JavaScript 实现:

js实现HDR

function reinhardToneMapping(hdrData, whiteLevel) {
  const mapped = new Float32Array(hdrData.length);
  for (let i = 0; i < hdrData.length; i++) {
    const L = hdrData[i];
    mapped[i] = (L / (1 + L)) * Math.pow(whiteLevel, 2);
  }
  return mapped;
}

WebGL 加速方案

使用 Three.js 等库实现高效 GPU 处理:

import * as THREE from 'three';

// 创建HDR渲染器
const renderer = new THREE.WebGLRenderer();
renderer.toneMapping = THREE.ReinhardToneMapping;
renderer.toneMappingExposure = 2.5;

// 加载HDR纹理
new THREE.RGBELoader().load('path/to/hdr.hdr', texture => {
  const material = new THREE.MeshStandardMaterial({ envMap: texture });
});

浏览器兼容性处理

检测 HDR 显示支持:

const isHDRSupported = window.matchMedia(
  '(dynamic-range: high) and (color-gamut: p3)'
).matches;

性能优化建议

  • 使用 Worker 线程处理图像合成
  • 对移动端设备降级使用低分辨率混合
  • 预生成不同曝光度的图像金字塔

完整实现需结合具体场景调整参数,现代浏览器已原生支持 HDR 视频(<video> 标签的 hdr 属性),静态图像处理仍依赖上述技术方案。

标签: jsHDR
分享给朋友:

相关文章

js实现轮播

js实现轮播

实现基础轮播效果 使用HTML结构创建轮播容器和图片元素: <div class="carousel"> <div class="carousel-inner">…

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的HT…

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

js实现菜单

js实现菜单

实现基本HTML结构 使用HTML创建菜单的基本框架,通常包含<ul>和<li>元素。示例结构如下: <ul id="menu"> <li><…

js图片轮播的实现

js图片轮播的实现

基础图片轮播实现 使用HTML、CSS和JavaScript实现一个简单的图片轮播效果。HTML部分定义轮播容器和图片,CSS负责样式和过渡效果,JavaScript处理逻辑。 <div cl…

js 实现跳转

js 实现跳转

使用 window.location.href 进行跳转 通过修改 window.location.href 可以跳转到指定 URL,浏览器会加载新页面: window.location.hre…