讲师中心 微信公众号

工具推荐

视频效率加速
Seko
Seko

AI短剧一键生成成片

剧云
剧云

中文短剧剧本制作平台

Laper
Laper

剧本策划到成片协作

updream

一键生成高质量推广成片

C# 文件内容水印嵌入 C#如何将隐形水印嵌入到图片或音频文件中

冬墨酱_9755

冬墨酱_9755

发布时间:2026-02-23 10:30:12

|

309人浏览过

|

来源于php中文网

原创

隐形水印是将数据嵌入文件冗余位(如BMP的LSB、WAV的PCM末位)而不改变外观或听感的技术;C#需手动操作字节,用LockBits或直接读写WAV样本,禁用Graphics等可视化方法。

c# 文件内容水印嵌入 c#如何将隐形水印嵌入到图片或音频文件中

什么是隐形水印,它在 C# 里根本不是“加一层透明图”

隐形水印(Steganography)和可视化水印完全不是一回事。它不改变文件外观或听感,而是把数据藏进文件的冗余位里——比如 Bitmap 的最低有效位(LSB),或 WAV 的 PCM 样本末位。C# 没有内置 API 做这个,得自己操作原始字节或像素。别用 Graphics 或 DrawString,那只是明水印。

  • 图像常用载体:24 位 BMP 或未压缩的 Bitmap(PNG 行为不可控,JPEG 会破坏 LSB)
  • 音频常用载体:WAV(PCM 编码、16-bit、单/双声道),避免 MP3/AAC —— 它们是破坏性压缩,藏进去秒丢
  • 核心操作对象是 byte[] 或 int[](像素值),不是 Image 对象本身

用 Bitmap.LockBits 写入 LSB 水印(图像场景)

LockBits 是唯一靠谱的路径:它绕过 GDI+ 封装,直接拿到内存中像素的原始字节指针。用 GetPixel/SetPixel 不仅慢,还会触发颜色空间转换,导致 LSB 错乱。

  • 只支持 PixelFormat.Format24bppRgb 或 Format32bppArgb;其他格式(如 8bpp)需先转换
  • 水印文本必须转成字节流(Encoding.UTF8.GetBytes()),再逐 bit 填进每个像素的 R、G、B 通道最低位
  • 务必在写入前检查图像容量:总像素 × 3(RGB) ≥ 水印字节数 × 8(bit);否则截断或报错
  • 示例关键片段:
    var bits = bitmap.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
    unsafe {
        byte* ptr = (byte*)bits.Scan0.ToPointer();
        for (int i = 0; i < data.Length; i++) {
            for (int b = 0; b < 8; b++) {
                int pixelOffset = (i * 8 + b) * 3;
                ptr[pixelOffset + 0] = (byte)((ptr[pixelOffset + 0] & 0xFE) | ((data[i] >> (7 - b)) & 0x01));
            }
        }
    }
    bitmap.UnlockBits(bits);

从 WAV 文件读取 PCM 数据并嵌入(音频场景)

WAV 头部固定 44 字节,之后是纯 PCM 样本。16-bit 单声道下,每样本占 2 字节;LSB 隐藏就改这 2 字节的最低位。别碰头部,也别用 SoundPlayer 或 NAudio 的高级封装——它们不暴露原始样本缓冲区。

C#
C#

"避开 C# 常见错误——空陷阱、异步陷阱、LINQ 陷阱及资源泄漏。"

下载
  • 用 File.ReadAllBytes() 读整个文件,跳过前 44 字节,剩余部分就是样本数据
  • 样本是小端序 Int16,用 BitConverter.ToInt16() 解包;改完最低位后用 BitConverter.GetBytes() 写回
  • 双声道要交错处理:左声道样本在偶数索引,右声道在奇数索引;水印 bit 流需均匀分给左右
  • 错误现象:System.ArgumentException: Parameter is not valid —— 很可能是 WAV 头部解析错,或样本长度没对齐 2 字节

提取水印时最常踩的三个坑

藏进去容易,取出来失败率极高。90% 的问题出在“以为藏哪就能从哪原样读回来”。

  • 图像:保存为 JPEG 后再读取 → 所有 LSB 全乱,因为 DCT 量化会抹掉最低位;必须保持 BMP 或用 Save(..., ImageFormat.Bmp)
  • 音频:用不同采样率/位深重采样过的 WAV → 样本值已变,LSB 不再对应原始嵌入位置
  • 通用:没嵌入结束标记(如 0xFF 0xFF)→ 提取时不知道水印在哪结束,容易读出乱码;建议在数据前加 4 字节长度头

LSB 隐写本质脆弱,它不抗编辑、不抗转码、不抗剪切。真要防扩散,得结合加密(先 Aes.Encrypt 再嵌入)和校验(加 CRC32),但那是另一层事了。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

相关专题

更多
string转int
string转int

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

7299

2023.08.02

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

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

3465

2024.08.29

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

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

4568

2025.08.29

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

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

3065

2025.08.29

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

379

2026.04.23

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

20

2026.11.06

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

20

2026.11.06

Postman接口请求发送教程
Postman接口请求发送教程

详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。

20

2026.11.06

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

40

2026.11.05

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn