视频亮度对比度

亮度/对比度/饱和度/gamma

420 次访问
☀️
BRIGHTNESS/CONTRAST

视频亮度对比度

调整亮度 / 对比度 / 饱和度 / 色温

FFmpeg 命令行(推荐)

视频处理涉及复杂的解码 / 编码 / 滤镜操作,桌面 FFmpeg(开源 / 免费)是业界事实标准。安装 5 分钟,运行如下命令一次解决:

# 亮度对比度饱和度 ffmpeg -i input.mp4 -vf "eq=brightness=0.1:contrast=1.2:saturation=1.3" -c:a copy output.mp4 # 调白平衡(色温) ffmpeg -i input.mp4 -vf "colorbalance=rs=.3:gs=0:bs=-.2" output.mp4 # Lift / Gamma / Gain(专业调色) ffmpeg -i input.mp4 -vf "colorlevels=rimin=0:rimax=0.95" output.mp4 # HDR 转 SDR ffmpeg -i hdr.mp4 -vf "zscale=t=linear,tonemap=hable,zscale=t=bt709,format=yuv420p" sdr.mp4

桌面 FFmpeg 安装

macOS

brew install ffmpeg

用 Homebrew,5 秒安装

Linux

sudo apt install ffmpeg # 或 sudo dnf install ffmpeg

Debian/Ubuntu/Fedora

Windows

下载 Gyan FFmpeg builds

解压后将 bin 目录加入 PATH

Docker

docker run --rm -v $PWD:/work \ jrottenberg/ffmpeg -i input.mp4 ...

无需本地安装

操作步骤

步骤 1:安装 FFmpeg

按上方系统对应的命令安装。验证:ffmpeg -version 应输出版本号。

步骤 2:复制本页面提供的命令

input.mp4 改为你的实际视频文件路径。

步骤 3:在视频所在目录运行

用终端 (Terminal / cmd / PowerShell) 切到视频所在目录,粘贴命令并回车。

步骤 4:等待处理完成

短视频几秒,长视频几分钟。输出文件出现在同目录。

提示

参数范围:brightness -1 到 1;contrast 0 到 4(1=原始);saturation 0 到 3。

关于本工具

了解工具定位 · 使用场景 · 对比优势

使用场景

🎬

老片画质修复

老旧监控视频或家庭录像因曝光不足导致画面过暗,人脸细节完全淹没在阴影中。使用本工具同时提升亮度(+30%)和对比度(+20%),并微调 gamma 至 1.2,可在不产生明显噪点的情况下恢复暗部纹理,让被摄主体轮廓清晰可辨。

🎨

电商主图调色

电商摄影师拍摄的静物照片因环境光色温偏差导致饱和度不足,商品颜色偏灰。通过本工具将饱和度从 0.7 提升至 1.2,配合对比度 +15%,使产品色彩更鲜艳、边缘更锐利,无需进入 Photoshop 即可快速产出符合平台要求的白底图。

📺

直播画面校准

主播在室内补光灯下录制时,面部高光区域过曝、背景暗部细节丢失。使用本工具降低亮度(-10%)并提高对比度(+25%),同时将 gamma 设为 0.9 以压缩高光、提亮阴影,使主播面部肤色均匀,背景道具纹理可辨。

🎞

手机视频去灰

阴天或逆光环境下拍摄的短视频,整体画面发灰、缺乏层次感。本工具通过同时增加对比度(+30%)和饱和度(+15%),并调整 gamma 至 1.1,可有效去除雾感,使天空蓝色更纯净、人物肤色更自然,无需专业调色软件。

对比矩阵本工具 vs 竞品 vs 传统方法

维度本工具竞品 A(Adobe Premiere Pro)传统方法(视频编辑软件)
数据隐私纯浏览器处理,视频不上传服务器需上传至 Adobe 云或本地处理,涉及 Adobe 账户完全本地处理,无网络传输
处理速度1-3 秒(取决于视频大小和浏览器性能)数秒至数分钟(取决于渲染设置和项目复杂度)数分钟至数小时(取决于软件渲染效率和手动操作)
离线可用完全离线(WASM 在浏览器本地运行)需联网启动和验证许可证完全离线(软件安装后)
大小限制受浏览器内存限制(通常 2GB 以内视频)无严格限制(取决于存储和硬件)无严格限制(取决于存储和硬件)
收费免费按月/年订阅(约 ¥150+/月)一次性购买或订阅(如 Final Cut Pro ¥1998)
注册无需注册需要 Adobe ID 登录通常需要购买许可证,无需在线注册
操作门槛拖拽即用,无学习成本需要学习专业剪辑软件操作需要学习专业剪辑软件操作

使用指南

上手步骤 · 输入输出 · 避坑提示

输入输出示例7 个典型场景,覆盖常规、边界与易错

输入输出说明
亮度=10, 对比度=1.2, 饱和度=1.5, gamma=0.8画面整体提亮,色彩更鲜艳,暗部细节增强典型常规场景:视频偏暗偏灰,需要提亮和增色
亮度=0, 对比度=1.0, 饱和度=1.0, gamma=1.0画面无任何变化,与原视频一致边界 case:所有参数设为默认值,验证无副作用
亮度=255, 对比度=2.0, 饱和度=2.0, gamma=0.5画面严重过曝,色彩失真,暗部完全消失边界 case:参数最大值组合,测试极端效果
亮度=-255, 对比度=0.0, 饱和度=0.0, gamma=3.0画面全黑,无任何可见内容边界 case:参数最小值组合,输出全黑帧
亮度=30, 对比度=1.0, 饱和度=0.0, gamma=1.0画面变为灰度,但整体偏亮易错 case:饱和度设为0得到黑白效果,但亮度仍生效
亮度=0, 对比度=1.0, 饱和度=1.0, gamma=2.2画面暗部更暗,亮部更亮,对比感增强典型场景:gamma校正用于调整显示器色温匹配
亮度=50, 对比度=0.5, 饱和度=1.2, gamma=1.0画面柔和,细节保留,色彩轻微增强典型场景:老旧视频修复,避免过度处理

常见错误对照7 个常踩的坑 · 错误 → 修复

1. Gamma 值调成负数

错误
gamma=-0.5
修复
gamma=1.2

Gamma 校正公式为输出 = 输入^(1/gamma),负值在数学上无意义,FFmpeg 会报错或输出全黑画面。有效范围通常 0.1-10.0,1.0 为原始值。

2. 亮度增量用百分比而非绝对范围

错误
brightness=50%
修复
brightness=0.3

FFmpeg 的 eq 滤镜中 brightness 取值范围是 -1.0 到 1.0,0 为原始。写成百分比会被解析为字符串而非数值,导致滤镜静默失败。

3. 对比度与亮度顺序颠倒

错误
eq=brightness=0.2:contrast=1.5:gamma=1.0
修复
eq=contrast=1.5:brightness=0.2:gamma=1.0

FFmpeg eq 滤镜内部按 contrast→brightness→gamma 顺序处理。先调亮度再调对比度会使亮度偏移被对比度放大,产生过曝。

4. 饱和度设为 0 后无法恢复

错误
saturation=0
修复
saturation=1.0(原始)或 0.5(半灰度)

饱和度 0 输出完全灰度视频,但 FFmpeg 不保留原始色度信息。后续再调高饱和度也不会恢复颜色,需重新处理原视频。

5. Gamma 与亮度同时大幅调整

错误
gamma=2.5:brightness=0.8
修复
gamma=1.8:brightness=0.2

Gamma 改变中灰亮度,brightness 线性偏移整体。两者同时大幅调整会导致暗部或亮部严重裁切(clipping),细节丢失不可逆。

6. 输入视频色彩空间不匹配

错误
对 BT.709 视频直接套用 BT.2020 的 Gamma 值
修复
先通过 setparams=color_primaries=bt709:color_trc=bt709 明确色彩空间

不同色彩空间(BT.601/BT.709/BT.2020)的 Gamma 曲线不同。直接套用 Gamma 值会导致色彩偏移,尤其红色和肤色。

7. 用整数而非浮点数

错误
brightness=1
修复
brightness=1.0

FFmpeg 的 eq 滤镜参数为浮点型。整数 1 会被隐式转为 1.0,但后续对比度等参数若用整数(如 contrast=2)可能因类型推断导致精度丢失。

工作原理

公式推导 · 流程图解 · 依据出处

核心公式

O = (I - 128) × C + 128 + B

变量说明

  • O — 输出像素值(0-255)
  • I — 输入像素值(0-255)
  • C — 对比度增益系数(≥0)
  • B — 亮度偏移量(-255 到 255)

示例

原图某像素值 I=100,设置对比度 C=1.5、亮度 B=20。则 O = (100-128)×1.5 + 128 + 20 = (-28)×1.5 + 148 = -42 + 148 = 106。输出像素值 106,比原图更亮且对比增强。

适用范围

适用于 8 位 RGB 或灰度图像(0-255 整数像素值)。超出 0-255 范围时会被截断。Gamma 校正和饱和度调整需额外公式,不在此式覆盖范围。

原理图

上传视频原始帧序列FFmpeg 滤镜链eq=亮度:对比度:饱和度:gamma输出视频调整后帧序列参数映射亮度[-1.0,1.0] → brightness对比度[-2.0,2.0] → contrast
用户输入 FFmpeg 处理 输出结果 参数说明

开发者集成

3 种主流语言 · 复制即用

import cv2
import numpy as np

# 读取图像
img = cv2.imread('input.jpg')

# 亮度(+50)、对比度(1.5)、饱和度(1.3)、Gamma(0.8)
alpha = 1.5  # 对比度
beta = 50    # 亮度

# 亮度和对比度
adjusted = cv2.convertScaleAbs(img, alpha=alpha, beta=beta)

# 饱和度(HSV空间)
hsv = cv2.cvtColor(adjusted, cv2.COLOR_BGR2HSV).astype(np.float32)
hsv[:,:,1] = np.clip(hsv[:,:,1] * 1.3, 0, 255)
adjusted = cv2.cvtColor(hsv.astype(np.uint8), cv2.COLOR_HSV2BGR)

# Gamma校正
gamma = 0.8
lookup = np.array([(i / 255.0) ** (1.0 / gamma) * 255 for i in range(256)]).astype(np.uint8)
adjusted = cv2.LUT(adjusted, lookup)

cv2.imwrite('output.jpg', adjusted)
package main

import (
	"image"
	"image/color"
	"image/jpeg"
	"math"
	"os"
)

func main() {
	file, _ := os.Open("input.jpg")
	defer file.Close()
	src, _, _ := image.Decode(file)

	bounds := src.Bounds()
	dst := image.NewRGBA(bounds)

	alpha := 1.5   // 对比度
	beta := 50.0   // 亮度
	gamma := 0.8   // Gamma
	sat := 1.3     // 饱和度

	for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
		for x := bounds.Min.X; x < bounds.Max.X; x++ {
			r, g, b, a := src.At(x, y).RGBA()
			// 转为0-255
			rf := float64(r>>8) * alpha + beta
			gf := float64(g>>8) * alpha + beta
			bf := float64(b>>8) * alpha + beta

			// Gamma
			rf = math.Pow(rf/255.0, 1.0/gamma) * 255
			gf = math.Pow(gf/255.0, 1.0/gamma) * 255
			bf = math.Pow(bf/255.0, 1.0/gamma) * 255

			// 饱和度(简化:RGB转HSV再转回)
			// 此处省略完整HSV转换,实际可用colorful库
			dst.Set(x, y, color.RGBA{
				R: uint8(math.Min(math.Max(rf, 0), 255)),
				G: uint8(math.Min(math.Max(gf, 0), 255)),
				B: uint8(math.Min(math.Max(bf, 0), 255)),
				A: uint8(a >> 8),
			})
		}
	}

	out, _ := os.Create("output.jpg")
	defer out.Close()
	jpeg.Encode(out, dst, nil)
}
// 浏览器端 Canvas 实现(无需外部库)
function adjustVideoFrame(canvas, brightness, contrast, saturation, gamma) {
  const ctx = canvas.getContext('2d');
  const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
  const data = imageData.data;

  for (let i = 0; i < data.length; i += 4) {
    let r = data[i];
    let g = data[i + 1];
    let b = data[i + 2];

    // 亮度和对比度
    r = r * contrast + brightness;
    g = g * contrast + brightness;
    b = b * contrast + brightness;

    // Gamma
    r = Math.pow(r / 255, 1 / gamma) * 255;
    g = Math.pow(g / 255, 1 / gamma) * 255;
    b = Math.pow(b / 255, 1 / gamma) * 255;

    // 饱和度(简化:加权平均转灰度再插值)
    const gray = 0.299 * r + 0.587 * g + 0.114 * b;
    r = gray + (r - gray) * saturation;
    g = gray + (g - gray) * saturation;
    b = gray + (b - gray) * saturation;

    data[i] = Math.min(255, Math.max(0, r));
    data[i + 1] = Math.min(255, Math.max(0, g));
    data[i + 2] = Math.min(255, Math.max(0, b));
  }

  ctx.putImageData(imageData, 0, 0);
}

// 使用示例:adjustVideoFrame(canvas, 50, 1.5, 1.3, 0.8);

常见问题

8 个高频疑问

亮度、对比度、饱和度、Gamma 这几个参数分别调什么?
亮度:整体画面明暗,调高让暗部变亮,但容易让黑色发灰。对比度:亮部和暗部的差异程度,调高画面更锐利,但高光或阴影细节可能丢失。饱和度:颜色鲜艳程度,调高颜色更浓,调低变灰。Gamma:非线性调整中间调亮度,调高让中间调变亮而暗部/亮部变化较小,调低则中间调变暗。建议先调亮度到合适明暗,再调对比度增强层次,最后微调饱和度和 Gamma 平衡肤色或整体观感。
为什么我调完亮度后视频变灰了,怎么恢复?
单纯提高亮度会把原本的黑色区域也提亮,导致黑色发灰、对比度下降。解决方法:调亮度的同时适量增加对比度(10-20%),把亮部拉亮、暗部压暗。如果画面依然偏灰,可以微调 Gamma(降低 0.1-0.2)让中间调更扎实。本工具的参数调整是实时预览的,建议先小幅拖动亮度滑块(每次 ±5),配合对比度同步调整,观察画面变化。
调完参数后视频画质会不会变差?
本工具基于 FFmpeg 处理,调整亮度/对比度/饱和度/Gamma 属于线性或非线性像素级运算,不会引入额外的压缩伪影或色块。但如果原视频本身是低码率(如 1 Mbps 以下),大幅提高对比度或饱和度会放大原本的压缩瑕疵(如色块、噪点),看起来像画质变差。建议:原视频码率建议 ≥ 2 Mbps;如果必须处理低质视频,调整幅度控制在 ±20% 以内。
这个工具支持哪些视频格式?
支持的输入格式取决于 FFmpeg 编译时包含的解码器,一般覆盖主流格式:MP4 (H.264/H.265)、AVI、MOV、MKV、WebM、FLV、WMV 等。输出格式默认 MP4 (H.264),兼容性最广。如果上传后提示「不支持的格式」,可能是容器或编码过于老旧(如 DivX 3 / 某些专业摄像机格式),建议先转码为 H.264 MP4 再用本工具调参数。
处理后的视频为什么比原视频大很多?
这是正常的,因为 FFmpeg 在调整参数后会重新编码视频。默认输出码率可能高于原视频码率(尤其原视频码率很低时)。如果你希望文件尽量小,可以在工具界面找到「输出质量」或「码率」选项(如果有),选择「平衡」或「较低」档位;如果没有该选项,可以先用其他工具把原视频压缩到合适码率再导入本工具调整参数。另外,如果原视频是 H.265 编码,输出转成 H.264 也会增大体积。
调 Gamma 和调亮度有什么区别,什么时候用 Gamma?
亮度是线性调整——所有像素加/减同样的值,暗部变化明显、亮部容易过曝。Gamma 是非线性调整,主要影响中间调(约 20%-80% 亮度区域),对纯黑和纯白影响很小。适用场景:画面整体偏暗但亮部细节正常时,用 Gamma 提亮中间调比用亮度更自然,不会让天空等亮部过曝。例如人物面部偏暗但背景天空正常,降低 Gamma(0.8-0.9)可让面部变亮而不影响天空。
视频上传后处理速度很慢,大概要等多久?
处理速度取决于视频分辨率、时长和服务器负载。以 1080p 30fps 视频为例,1 分钟的视频在一般服务器上约需 30-60 秒。4K 视频或时长超过 10 分钟的视频,处理时间可能达到 5-10 分钟。如果长时间无响应,可能是文件过大(建议单文件 ≤ 500MB),或临时服务器排队。你可以尝试:① 把视频裁剪成短片段分别处理;② 降低分辨率(如 1080p→720p)再上传;③ 避开晚高峰时段。
调完参数后可以预览效果再下载吗?
本工具提供实时预览功能:调整任意滑块后,预览画面会同步更新,让你看到当前参数下的效果。但注意预览画面通常经过缩小或抽帧处理,最终下载的视频效果可能略有差异(尤其是细节锐度和颜色过渡)。建议:先拖动滑块观察预览,确定满意后点击「处理/下载」,等待完整处理完成。如果预览和最终结果差距明显,可以反馈给站长。
选择 打开 +新窗口 esc关闭