百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

摄影中的“过曝”,您真的理解吗?

yuyutoo 2025-04-08 20:26 13 浏览 0 评论

在摄影与摄像领域,“过曝”是一个我们经常听到的术语。大多数情况下,我们需要避免过曝,以防止细节丢失,从而对图片产生负面影响。

那么,什么是过曝呢?过曝即过度曝光,当光线强度超出相机记录能力时,便会出现过曝现象。值得注意的是,过曝并非光的固有特性,而是由于记录设备(如相机)的动态范围限制所致。

那么,在过曝情况下,设备是否完全没有记录下任何信息呢?事实并非如此。此时记录的信息是明确的,而且异常丰富,远超我们的想象。

假设图像色彩空间为RGB,当三原色中的任何一个通道值达到255(在计算机中,每个颜色通道的表示范围为0-255)时,计算机便会判定图像过曝。

例如,当RGB中的R通道值为固定值255时,无论GB值如何变化,都会被视为过曝。从理论上讲,此时可能会有多达256×256=65536种色彩组合呈现过曝状态。同理,当G或B通道值为255时,也会出现过曝的色彩组合。其中,RGB值均为255的白色,是我们大多数人所理解的典型过曝情况。

笔者因此特意使用C#编写了一段程序来生成三张RGB通道分别取值为255的图片。运行程序后,按下WIN+Shift+S键进行截图并保存(请注意,保存图片时应使用PNG无损压缩格式,以避免JPG格式压缩图片色彩空间),得到如下图片:

随后,我们在Adobe Camera Raw(ACR)中打开这些图片。在关闭右上角的“高光裁剪警告”功能时,图片显示正常;而当我们打开该功能后,便会看到当三原色中某一通道值达到255时,出现了明显的大面积过曝提示。

最后总结:过曝是指光线强度超出了相机传感器所能记录的范围,这个范围非常广泛,并不仅限于白色。

附:文中所用的代码如下:

<Window x:Class="DrawColor.MainWindow"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

xmlns:local="clr-namespace:DrawColor"

mc:Ignorable="d"

Title="过曝色彩展示(在RGB三原色中,只要有一个值达到255,就被图像编辑软件判定为过曝)" Height="685" Width="1650" Background="#808080" >

R:255G:(0-255)B:(0-255)

R:(0-255)G:255B:(0-255)

R:(0-255)G:(0-255)B:255

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Navigation;

using System.Windows.Shapes;

namespace DrawColor

{

public partial class MainWindow : Window

{

const int SideLength = 2; // 每个方块的边长

const int GridSize = 256; // 整个网格的大小(包括0-255的范围)

public MainWindow()

{

InitializeComponent();

DrawRgbRed();

DrawRgbGreen();

DrawRgbBlue();

}

private void DrawRgbRed()

{


Canvas finalCanvas = new Canvas

{

Width = GridSize * SideLength,

Height = GridSize * SideLength

};

for (int y = 0; y < GridSize; y++)

{

for (int x = 0; x < GridSize; x++)

{

Rectangle rectangle = new Rectangle

{

Width = SideLength,

Height = SideLength,

Fill = new SolidColorBrush(Color.FromArgb(

255, // Alpha

255, // R

(byte)x, // G

(byte)y // B

))

};

Canvas.SetLeft(rectangle, x * SideLength);

Canvas.SetTop(rectangle, y * SideLength);

finalCanvas.Children.Add(rectangle);

}

}

this.colorGrid.Children.Add(finalCanvas);

}


private void DrawRgbGreen()

{

Canvas finalCanvas = new Canvas

{

Width = GridSize * SideLength,

Height = GridSize * SideLength

};

for (int y = 0; y < GridSize; y++)

{

for (int x = 0; x < GridSize; x++)

{

Rectangle rectangle = new Rectangle

{

Width = SideLength,

Height = SideLength,

Fill = new SolidColorBrush(Color.FromArgb(

255, // Alpha

(byte)x, // R

255, // G

(byte)y // B

))

};

Canvas.SetLeft(rectangle, x * SideLength);

Canvas.SetTop(rectangle, y * SideLength);

finalCanvas.Children.Add(rectangle);

}

}

this.colorGrid.Children.Add(finalCanvas);

}

private void DrawRgbBlue()

{

Canvas finalCanvas = new Canvas

{

Width = GridSize * SideLength,

Height = GridSize * SideLength

};

for (int y = 0; y < GridSize; y++)

{

for (int x = 0; x < GridSize; x++)

{

Rectangle rectangle = new Rectangle

{

Width = SideLength,

Height = SideLength,

Fill = new SolidColorBrush(Color.FromArgb(

255, // Alpha

(byte)y, // R

(byte)x, // G

255 // B

))

};

Canvas.SetLeft(rectangle, x * SideLength);

Canvas.SetTop(rectangle, y * SideLength);

finalCanvas.Children.Add(rectangle);

}

}

this.colorGrid.Children.Add(finalCanvas);

}

}

}

相关推荐

深度解读Spring框架的核心原理

深度解读Spring框架的核心原理在Java开发的世界里,提到Spring框架,就像提起一位久经沙场的老将,它几乎成了企业级应用开发的代名词。那么,这个被无数开发者膜拜的框架究竟有何独特之处?今天,我...

「Spring认证」Spring 框架概述

Spring是最流行的企业Java应用程序开发框架。全球数以百万计的开发人员使用SpringFramework来创建高性能、易于测试和可重用的代码。Spring框架是一个开源的Java...

学习Spring框架 这一篇就够了

1.spring概述1.1Spring是什么(理解)...

Spring框架双核解析:IOC与AOP的本质与实战

#Spring核心#IOC容器#AOP编程#Java框架设计...

Spring Boot与传统Spring框架的对比:探索Java开发的新境界

SpringBoot与传统Spring框架的对比:探索Java开发的新境界在Java生态系统中,Spring框架无疑是一个里程碑式的存在。从最初的简单依赖注入容器,到如今覆盖企业级开发方方面面的庞大...

Spring MVC框架源码深度剖析:从入门到精通

SpringMVC框架源码深度剖析:从入门到精通SpringMVC框架简介SpringMVC作为Spring框架的一部分,为构建Web应用程序提供了强大且灵活的支持。它遵循MVC(Model-V...

Spring框架入门

一.spring是什么?Spring是分层...

程序员必知必会技能之Spring框架基础——面向切面编程!

面向切面编程AOP(AspectOrientedProgramming)与OOP(ObjectOrientedProgramming,面向对象编程)相辅相成。AOP提供了与OOP不同的抽象软件结...

Spring Security安全框架深度解读:为你的应用穿上“钢铁铠甲”

SpringSecurity安全框架深度解读:为你的应用穿上“钢铁铠甲”在现代网络世界里,保护我们的应用程序免受各种威胁攻击至关重要。而在这个过程中,SpringSecurity框架无疑是我们最可...

Spring框架的设计哲学与实现:打造轻量级的企业级Java应用

Spring框架的设计哲学与实现:打造轻量级的企业级Java应用Spring框架自2003年诞生以来,已成为企业级Java应用开发的代名词。它不仅仅是一个框架,更是一种设计理念和哲学的体现。本文将带你...

Spring框架深度解析:从核心原理到底层实现的全方位避坑指南

一、Spring框架核心概念解析1.控制反转(IoC)与依赖注入(DI)Spring的核心思想是通过IoC容器管理对象的生命周期和依赖关系。传统开发中,对象通过new主动创建依赖对象,导致高耦合;而S...

Java框架 —— Spring简介

简介一般来说,Spring指的是SpringFramework,它提供了很多功能,例如:控制反转(IOC)、依赖注入...

Spring 框架概述,模块划分

Spring框架以控制反转(InversionofControl,IoC)和面向切面编程(Aspect-OrientedProgramming,AOP)为核心,旨在简化企业级应用开发,使开发者...

spring框架怎么实现依赖注入?

依赖注入的作用就是在使用Spring框架创建对象时,动态的将其所依赖的对象注入到Bean组件中,其实现方式通常有两种,一种是属性setter方法注入,另一种是构造方法注入。具体介绍如下:●属性set...

Spring框架详解

  Spring是一种开放源码框架,旨在解决企业应用程序开发的复杂性。一个主要优点就是它的分层体系结构,层次结构让你可以选择要用的组件,同时也为J2EE应用程序开发提供了集成框架。  Spring特征...

取消回复欢迎 发表评论: