# php_blind_watermark **Repository Path**: web/php_blind_watermark ## Basic Information - **Project Name**: php_blind_watermark - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-27 - **Last Updated**: 2026-07-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # PHP 5.6+ 盲水印系统实现 基于原Python盲水印项目的思想,在PHP 5.6+环境下实现的简化版盲水印系统。 ## 特点 - **盲水印**: 水印在图像中视觉上不可见,只能通过特定方法提取 - **密码保护**: 使用双重密码(图像密码和水印密码)保护水印 - **灵活配置**: 通过配置数组传参,支持多种模式和强度 - **兼容性强**: 完全兼容PHP 5.6+,仅依赖GD库 - **轻量级**: 单一类文件实现,易于集成 ## 文件清单 - `PhpBlindWatermark.php` - 核心盲水印类 - `demo_blind_watermark.php` - 功能演示脚本 ## 核心功能 - **stringToBinary() / binaryToString()**: 文本与二进制转换 - **embed()**: 在图像中嵌入盲水印 - **extract()**: 从图像中提取盲水印 - **configure()**: 动态更新配置 ## 配置选项详解 ```php $config = [ 'password_img' => 12345, // 图像密码 - 用于生成水印嵌入位置的随机序列 'password_wm' => 67890, // 水印密码 - 用于生成水印加密密钥序列 'mode' => 'simple', // 模式 - 'simple'(简单模式) 或 'robust'(鲁棒模式) 'strength' => 5, // 水印强度 (1-10) - 控制嵌入密度,默认5 'redundancy_factor' => 4 // 冗余因子(仅robust模式使用)- 每个位的重复次数 ]; ``` ### 参数详细说明 #### 1. password_img(图像密码) - **类型**: 整数 - **默认值**: 1 - **说明**: 用于生成水印嵌入位置的伪随机序列,决定水印位在图像中的分布位置。相同的图像密码会在相同图像上产生相同的嵌入位置序列。 #### 2. password_wm(水印密码) - **类型**: 整数 - **默认值**: 1 - **说明**: 用于生成水印加密的密钥序列,对水印数据进行XOR加密。相同的水印密码会生成相同的加密密钥序列。 #### 3. mode(模式) - **类型**: 字符串 - **可选值**: 'simple', 'robust' - **默认值**: 'simple' - **说明**: - **simple**: 简单模式,直接将水印数据嵌入图像 - **robust**: 鲁棒模式,通过冗余机制提高水印的抗干扰能力 #### 4. strength(强度) - **类型**: 整数 - **取值范围**: 1-10 - **默认值**: 5 - **说明**: 控制水印的嵌入强度,影响LSB修改的程度。数值越大,嵌入越密集,但可能对图像质量影响更大。 #### 5. redundancy_factor(冗余因子) - **类型**: 整数 - **默认值**: 4 - **说明**: 仅在robust模式下使用,指定每个水印位在图像中重复嵌入的次数。较高的值提供更好的鲁棒性,但会减少可嵌入的总字符数。 ## 嵌入字符支持的最大长度 ### 最大长度计算公式 最大支持的水印长度(位数)= 图像总像素数 × 0.1 例如: - 一张 500×500 的图像(250,000 像素)最多支持 25,000 位水印数据 - 一位代表一个二进制位,一个ASCII字符占用8位 ### 不同模式下的字符限制 #### Simple模式 - 最大字符数 ≈ (图像总像素数 × 0.1) ÷ 8 - 例如:500×500图像 ≈ 25,000 ÷ 8 = 3,125 字符 #### Robust模式 - 最大字符数 ≈ (图像总像素数 × 0.1) ÷ (8 × redundancy_factor) - 例如:500×500图像,redundancy_factor=4 ≈ 25,000 ÷ (8 × 4) = 781 字符 ### 实际使用建议 - **短文本水印**(1-5个字符):✅ 高准确性 - **中等文本水印**(6-15个字符):⚠️ 中等准确性(部分场景可能有误) - **长文本水印**(>15个字符):⚠️ 较低准确性(准确性随长度递减) - **密码保护**:✅ 完全有效(错误密码无法提取正确内容) ## 算法原理 使用LSB(最低有效位)替换技术,将加密后的水印信息嵌入到图像像素的最低几位中,确保: 1. 视觉上几乎不可察觉 2. 需要正确密码才能提取 3. 具备一定的抗攻击能力 ## 使用建议 1. **推荐使用短文本水印**(少于10个字符)以获得最佳准确性 2. **使用较大图像**(建议大于100x100像素)以容纳更多水印位 3. **妥善保管密码**,确保只有授权人员知道正确的图像密码和水印密码 4. **鲁棒模式**可在一定程度上提高提取准确性,特别是在图像可能受到轻微修改的情况下 5. **优先使用PNG格式**,因为JPEG的有损压缩可能影响水印的完整性 6. **合理设置冗余因子**,更高的值提供更好的鲁棒性但会减少最大支持的字符数 ## 使用方法 ```php // 创建水印对象 $wm = new PhpBlindWatermark([ 'password_img' => 12345, 'password_wm' => 67890, 'mode' => 'simple' ]); // 嵌入水印 $wm->embed('input.jpg', 'SECRET', 'output.jpg', 'str'); // 提取水印(需要知道水印的二进制长度) $binary = $wm->stringToBinary('SECRET'); $length = count($binary); $extracted = $wm->extract('output.jpg', $length, 'str'); ``` 此实现遵循了原Python项目的核心思想,即创建视觉上不可见的盲水印,只能通过特定方法和密码提取。