0

0

C#怎么实现图片灰度化处理_C#如何通过像素操作修改色彩【实战】

尼克

尼克

发布时间:2026-03-16 15:50:04

|

353人浏览过

|

来源于php中文网

原创

必须调用 LockBits 才能高效操作像素;直接使用 GetPixel/SetPixel 效率极低;需根据 PixelFormat 区分 BGR/ARGB 布局、正确计算 Stride 和灰度公式;操作后务必调用 UnlockBits 防止资源泄漏。

c#怎么实现图片灰度化处理_c#如何通过像素操作修改色彩【实战】

Bitmap 锁定像素前必须调用 LockBits

直接读写 Bitmap.GetPixel / SetPixel 看似简单,但实际是逐像素触发 GDI+ 内部拷贝,1000×1000 图片可能慢 100 倍以上。灰度化这种密集像素操作,必须走指针路径。

关键点:调用 LockBits 后拿到的是内存起始地址(Scan0),不是图像左上角坐标;行字节数(Stride)往往大于宽度 × 字节/像素,因为 Windows 要求每行按 4 字节对齐。

  • PixelFormat.Format24bppRgb 最常用,但 Stride 可能是 width×3 + 补零字节,不能直接用 width * 3 计算下一行地址
  • 务必检查 BitmapData.PixelFormat,有些图片加载后是 Format32bppArgb(带 Alpha),灰度公式得适配四通道
  • 操作完必须调用 UnlockBits,否则资源泄漏,多次调用后程序可能卡死或抛出 OutOfMemoryException

灰度公式别硬背,按输入格式选 Y = 0.299R + 0.587G + 0.114B 还是平均值

人眼对绿色最敏感,标准加权灰度公式是 Y = 0.299R + 0.587G + 0.114B,但前提是 R/G/B 是 0–255 的整数且无 Alpha。如果图像是 Format32bppArgb,首字节是 Alpha,RGB 顺序仍是 BGR(Windows 小端排布),取值时容易错位。

  • Format24bppRgb:每行从 Scan0 + y * Stride 开始,每像素 3 字节,顺序为 B、G、R
  • Format32bppArgb:每像素 4 字节,顺序为 B、G、R、A;Alpha 不参与灰度计算,但影响 Stride(通常是 width×4)
  • 若只要快速预览,用 (B + G + R) / 3 也行,但暗部细节会发灰,尤其在低光照区域

unsafe 代码里指针偏移别越界,StrideHeight 要一起校验

byte* 遍历像素时,常见错误是只判断 y ,却忽略 <code>Stride 可能比逻辑宽度大。比如 3 像素宽的图,Stride 是 12(补了 3 字节对齐),第 0 行末尾地址是 scan0 + 12,第 1 行起点是 scan0 + 12,但如果误用 scan0 + y * width * 3,第 1 行就直接跳到 scan0 + 9——访问非法内存,Debug 模式下可能崩,Release 下行为不可预测。

Seed-Music
Seed-Music

字节跳动推出的AI音乐生成与编辑工具

下载
  • 安全遍历方式:for (int y = 0; y
  • 不要假设 Stride == Width * BytesPerPixel,打印 bmpData.StridebmpData.Width 看一眼更稳
  • 启用 unsafe 需在项目文件加 <AllowUnsafeBlocks>true</AllowUnsafeBlocks>,否则编译不过

输出灰度图时,PixelFormat 要匹配,别让 GDI+ 自动转成彩色

即使你把每个像素都设成了 R=G=B,如果保存时用的是 Format24bppRgb,它还是彩色图(只是看起来灰)。真正节省体积、符合语义的做法是输出为 Format8bppIndexed —— 但 .NET 的 Bitmap 对索引色支持有限,构造时需手动建调色板,稍麻烦。

  • 最简方案:保持原格式(如 Format24bppRgb),仅把 R/G/B 设为相同值,兼容性最好
  • 想真正存为 8 位灰度:必须用 Format8bppIndexed,并调用 bitmap.Palette 设置 256 级灰阶调色板,否则保存后仍是 24 位
  • Image.Save 保存 PNG 时,Format8bppIndexed 能被正确识别;但 JPEG 不支持索引色,强行保存会自动转回 24 位

灰度化本身不难,难的是 Bitmap 内存布局和 GDI+ 的隐式转换规则——很多人卡在 Stride 和字节序上,反复调试半天才发现 BGR 当成了 RGB。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1071

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

617

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

335

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

235

2025.08.29

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1518

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1172

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

837

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

463

2023.08.02

minimax入口地址汇总
minimax入口地址汇总

本专题整合了minimax相关入口合集,阅读专题下面的文章了解更多详细地址。

3

2026.03.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.4万人学习

C 教程
C 教程

共75课时 | 5.5万人学习

C++教程
C++教程

共115课时 | 22.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号