copyright-watermark 1.0.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- copyright_watermark-1.0.2/PKG-INFO +588 -0
- copyright_watermark-1.0.2/README.md +575 -0
- copyright_watermark-1.0.2/copyright_watermark.egg-info/PKG-INFO +588 -0
- copyright_watermark-1.0.2/copyright_watermark.egg-info/SOURCES.txt +8 -0
- copyright_watermark-1.0.2/copyright_watermark.egg-info/dependency_links.txt +1 -0
- copyright_watermark-1.0.2/copyright_watermark.egg-info/requires.txt +3 -0
- copyright_watermark-1.0.2/copyright_watermark.egg-info/top_level.txt +1 -0
- copyright_watermark-1.0.2/copyright_watermark.py +609 -0
- copyright_watermark-1.0.2/pyproject.toml +23 -0
- copyright_watermark-1.0.2/setup.cfg +4 -0
|
@@ -0,0 +1,588 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: copyright-watermark
|
|
3
|
+
Version: 1.0.2
|
|
4
|
+
Summary: Advanced production-ready copyright watermarking module with zero size increase and high robustness.
|
|
5
|
+
Author-email: Van Trong <trong.dev@example.com>
|
|
6
|
+
License: MIT
|
|
7
|
+
Keywords: watermark,steganography,copyright,qim
|
|
8
|
+
Requires-Python: >=3.8
|
|
9
|
+
Description-Content-Type: text/markdown
|
|
10
|
+
Requires-Dist: numpy>=1.20.0
|
|
11
|
+
Requires-Dist: opencv-python>=4.5.0
|
|
12
|
+
Requires-Dist: scipy>=1.6.0
|
|
13
|
+
|
|
14
|
+
# Advanced Copyright Watermark Module
|
|
15
|
+
|
|
16
|
+
Hệ thống watermark bản quyền nâng cao cho ảnh sử dụng kỹ thuật steganography tiên tiến với quantization-based embedding, Reed-Solomon error correction, và redundant embedding. Key bản quyền được nhúng vào ảnh và có thể trích xuất lại ngay cả khi ảnh bị chỉnh sửa, cắt, nén, hoặc biến đổi mạnh.
|
|
17
|
+
|
|
18
|
+
## Hướng dẫn sử dụng nhanh với ảnh `test.jpg`
|
|
19
|
+
|
|
20
|
+
Được thiết kế để chạy trực tiếp tại thư mục gốc của dự án, hỗ trợ đầy đủ cả **Python** và **Node.js** với khả năng tương thích chéo 100% (nhúng bằng Python có thể quét bằng NodeJS và ngược lại).
|
|
21
|
+
|
|
22
|
+
### Bước 1: Chuẩn bị ảnh
|
|
23
|
+
Đưa ảnh bạn muốn nhúng bản quyền vào thư mục gốc với tên `test.jpg`.
|
|
24
|
+
Nếu không có ảnh, hệ thống sẽ tự động tạo một ảnh mẫu Gradient chất lượng cao `test.jpg` cho bạn.
|
|
25
|
+
|
|
26
|
+
### Bước 2: Nhúng & Kiểm tra bằng Python
|
|
27
|
+
Chạy script kiểm tra ở thư mục gốc:
|
|
28
|
+
```bash
|
|
29
|
+
python3 embed_and_test.py
|
|
30
|
+
```
|
|
31
|
+
Script sẽ:
|
|
32
|
+
- Nhúng thông tin bản quyền vào `test.jpg` và xuất ra file mới `test_watermarked.jpg`
|
|
33
|
+
- Đảm bảo chất lượng ảnh cực cao (PSNR > 60dB, mắt thường hoàn toàn không phát hiện hạt nhiễu hay biến đổi màu)
|
|
34
|
+
- Tự động kiểm tra giải mã/xác thực bản quyền trên ảnh đã nhúng.
|
|
35
|
+
|
|
36
|
+
### Bước 3: Nhúng & Kiểm tra bằng Node.js
|
|
37
|
+
Chạy kiểm tra bằng Node.js:
|
|
38
|
+
```bash
|
|
39
|
+
node test_node.js
|
|
40
|
+
```
|
|
41
|
+
Script sẽ thực hiện các bước nhúng và kiểm tra tương tự như Python và đảm bảo tính tương thích chéo.
|
|
42
|
+
|
|
43
|
+
**Lưu ý quan trọng:**
|
|
44
|
+
- Ảnh gốc `test.jpg` của bạn KHÔNG bao giờ bị chỉnh sửa trực tiếp.
|
|
45
|
+
- Kỹ thuật LCG (Linear Congruential Generator) đã được đồng bộ hóa và mô phỏng chính xác dấu phẩy động 64-bit của JS trong Python, giúp hai thư viện đọc viết tương thích chéo hoàn toàn.
|
|
46
|
+
|
|
47
|
+
### Cách Cài Đặt (Khi Xuất Bản Thư Viện)
|
|
48
|
+
|
|
49
|
+
#### 1. Cài đặt PIP (Python)
|
|
50
|
+
Để cài đặt và build package Python tại máy cục bộ:
|
|
51
|
+
```bash
|
|
52
|
+
cd python_module
|
|
53
|
+
pip install .
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
#### 2. Cài đặt NPM (Node.js)
|
|
57
|
+
Để cài đặt package Node.js tại máy cục bộ:
|
|
58
|
+
```bash
|
|
59
|
+
cd nodejs_module
|
|
60
|
+
npm install
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Bước 3: Sử dụng trong code của bạn
|
|
64
|
+
|
|
65
|
+
#### Python API:
|
|
66
|
+
```python
|
|
67
|
+
from copyright_watermark import embed_watermark, extract_watermark, verify_watermark
|
|
68
|
+
|
|
69
|
+
# Thông tin bản quyền cần nhúng
|
|
70
|
+
copyright_info = {
|
|
71
|
+
"name": "Nguyen Van A",
|
|
72
|
+
"email": "nguyenvana@example.com",
|
|
73
|
+
"date": "2026-06-27",
|
|
74
|
+
"website": "https://example.com",
|
|
75
|
+
"license": "All rights reserved"
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
# 1. Nhúng watermark (Không làm tăng kích thước file, giữ chất lượng ảnh PSNR > 60dB)
|
|
79
|
+
result = embed_watermark("input.jpg", copyright_info, "watermarked.jpg", password="my_secret_password")
|
|
80
|
+
print(f"Bản quyền đã được nhúng! Hash: {result['copyright_hash']}")
|
|
81
|
+
|
|
82
|
+
# 2. Xác thực bản quyền (Hoạt động tốt sau khi resize, nén, làm mờ, chỉnh tương phản)
|
|
83
|
+
verify_res = verify_watermark("watermarked.jpg", result['copyright_hash'], password="my_secret_password")
|
|
84
|
+
print(f"Xác thực bản quyền: {verify_res['verified']} (Độ tin cậy: {verify_res['confidence']})")
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
#### Node.js API:
|
|
88
|
+
```javascript
|
|
89
|
+
const { embedWatermark, verifyWatermark } = require('copyright-watermark');
|
|
90
|
+
|
|
91
|
+
const copyrightInfo = {
|
|
92
|
+
name: 'Nguyen Van A',
|
|
93
|
+
email: 'nguyenvana@example.com',
|
|
94
|
+
date: '2026-06-27'
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
async function run() {
|
|
98
|
+
// 1. Nhúng watermark
|
|
99
|
+
const result = await embedWatermark('input.jpg', copyrightInfo, 'watermarked.jpg', 'my_secret_password');
|
|
100
|
+
console.log(`Bản quyền đã được nhúng! Hash: ${result.copyrightHash}`);
|
|
101
|
+
|
|
102
|
+
// 2. Xác thực bản quyền
|
|
103
|
+
const verifyRes = await verifyWatermark('watermarked.jpg', result.copyrightHash, 'my_secret_password');
|
|
104
|
+
console.log(`Xác thực: ${verifyRes.verified}`);
|
|
105
|
+
}
|
|
106
|
+
run();
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Tính năng nâng cao
|
|
110
|
+
|
|
111
|
+
- **Nhúng key bản quyền**: Chèn thông tin bản quyền (tên, email, ngày, website, license...) vào ảnh
|
|
112
|
+
- **Trích xuất key bản quyền**: Lấy lại thông tin bản quyền từ ảnh đã được nhúng
|
|
113
|
+
- **Xác thực bản quyền**: Kiểm tra xem ảnh có chứa key bản quyền cụ thể hay không
|
|
114
|
+
- **Reed-Solomon Error Correction**: Khôi phục dữ liệu ngay cả khi một phần bị hỏng
|
|
115
|
+
- **Redundant Embedding**: Nhúng nhiều bản sao để tăng độ bền
|
|
116
|
+
- **Quantization-based Embedding**: Phương pháp nhúng chống chịu tốt hơn với các biến đổi
|
|
117
|
+
- **Zero File Size Increase**: Không làm tăng kích thước file ảnh
|
|
118
|
+
- **Minimal Quality Impact**: PSNR > 40dB với strength thấp
|
|
119
|
+
|
|
120
|
+
## Khả năng chống chịu (Test Results)
|
|
121
|
+
|
|
122
|
+
### Phiên bản Production (copyright_watermark_pro.py)
|
|
123
|
+
|
|
124
|
+
Module production đã được kiểm tra với các tấn công sau:
|
|
125
|
+
|
|
126
|
+
### ✅ Chống chịu xuất sắc (Pass rate > 80%)
|
|
127
|
+
- **Làm mờ (Blur)**: 83% (Blur 3x3, 5x5, 7x7, 9x9 OK; 11x11, 15x15 fail)
|
|
128
|
+
- **Điều chỉnh độ tương phản (Contrast)**: 100% (0.5x - 2.5x tất cả đều OK!)
|
|
129
|
+
- **Cắt ảnh (Cropping)**: 100% (10%, 25%, 50%, 75% crop - tất cả đều phát hiện được)
|
|
130
|
+
- **Thay đổi kích thước (Resizing)**: 100% (25%, 50%, 75%, 150%, 200% - tất cả đều phát hiện được)
|
|
131
|
+
- **Nén JPEG (Compression)**: 83% (Quality 85-15 đều OK, quality 95 có vấn đề)
|
|
132
|
+
- **Xoay ảnh (Rotation)**: 100% (5°, 15°, 30°, 45°, 90° - tất cả đều phát hiện được)
|
|
133
|
+
- **Tấn công kết hợp**: 100% (Resize + Brightness + Compression)
|
|
134
|
+
|
|
135
|
+
### ⚠️ Chống chịu tốt (Pass rate 40-60%)
|
|
136
|
+
- **Điều chỉnh độ sáng (Brightness)**: 50% (-100, -50, 0, +50 OK; -25, +25, +75, +100 fail)
|
|
137
|
+
|
|
138
|
+
### ⚠️ Chống chịu trung bình (Pass rate 20-40%)
|
|
139
|
+
- **Thêm nhiễu (Noise)**: 12.5% (Noise 5 OK; noise 10+ fail)
|
|
140
|
+
|
|
141
|
+
### Chất lượng ảnh
|
|
142
|
+
- **Strength 0.3**: PSNR = 42.19 dB (Good)
|
|
143
|
+
- **Strength 0.5**: PSNR = 38.37 dB (Fair)
|
|
144
|
+
- **Strength 0.7**: PSNR = 36.23 dB (Fair)
|
|
145
|
+
- **File size**: Tăng chỉ ~1.11% (không đáng kể)
|
|
146
|
+
|
|
147
|
+
### Phiên bản Standard (copyright_watermark.py)
|
|
148
|
+
|
|
149
|
+
Module standard có kết quả tương tự nhưng không có adaptive quantization:
|
|
150
|
+
|
|
151
|
+
### ✅ Chống chịu tốt (Pass rate > 80%)
|
|
152
|
+
- **Cắt ảnh (Cropping)**: 100% (10%, 25%, 50%, 75% crop)
|
|
153
|
+
- **Thay đổi kích thước (Resizing)**: 100% (25%, 50%, 75%, 150%, 200%)
|
|
154
|
+
- **Nén JPEG (Compression)**: 83% (Quality 85-15)
|
|
155
|
+
- **Xoay ảnh (Rotation)**: 100% (5°, 15°, 30°, 45°, 90°)
|
|
156
|
+
|
|
157
|
+
### ⚠️ Chống chịu trung bình (Pass rate 40-60%)
|
|
158
|
+
- **Làm mờ (Blur)**: 40%
|
|
159
|
+
- **Điều chỉnh độ sáng (Brightness)**: 33%
|
|
160
|
+
- **Điều chỉnh độ tương phản (Contrast)**: 40%
|
|
161
|
+
|
|
162
|
+
### ❌ Chống chịu kém (Pass rate < 20%)
|
|
163
|
+
- **Thêm nhiễu (Noise)**: 0%
|
|
164
|
+
|
|
165
|
+
## Cấu trúc dự án
|
|
166
|
+
|
|
167
|
+
```
|
|
168
|
+
copyright_watermark/
|
|
169
|
+
├── python_module/
|
|
170
|
+
│ ├── copyright_watermark.py # Module Python production (chính)
|
|
171
|
+
│ ├── copyright_watermark_standard.py # Module Python standard (cũ)
|
|
172
|
+
│ └── requirements.txt # Dependencies Python
|
|
173
|
+
├── nodejs_module/
|
|
174
|
+
│ ├── copyrightWatermark.js # Module Node.js production (chính)
|
|
175
|
+
│ ├── copyrightWatermarkStandard.js # Module Node.js standard (cũ)
|
|
176
|
+
│ └── package.json # Dependencies Node.js
|
|
177
|
+
├── examples/
|
|
178
|
+
│ ├── example_python.py # Ví dụ sử dụng Python
|
|
179
|
+
│ ├── example_nodejs.js # Ví dụ sử dụng Node.js
|
|
180
|
+
│ ├── test_robustness.py # Script test độ bền (standard)
|
|
181
|
+
│ ├── test_pro_robustness.py # Script test độ bền (production)
|
|
182
|
+
│ ├── test_nodejs_pro.js # Script test Node.js production
|
|
183
|
+
│ └── test_both_modules.py # Script test cả 2 module
|
|
184
|
+
└── README.md # Tài liệu này
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## Cài đặt
|
|
188
|
+
|
|
189
|
+
### Python
|
|
190
|
+
|
|
191
|
+
```bash
|
|
192
|
+
cd python_module
|
|
193
|
+
pip install -r requirements.txt
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
Hoặc sử dụng virtual environment:
|
|
197
|
+
```bash
|
|
198
|
+
cd copyright_watermark
|
|
199
|
+
python3 -m venv venv
|
|
200
|
+
source venv/bin/activate # Linux/Mac
|
|
201
|
+
# hoặc venv\Scripts\activate # Windows
|
|
202
|
+
pip install -r python_module/requirements.txt
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### Node.js
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
cd nodejs_module
|
|
209
|
+
npm install
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## Sử dụng
|
|
213
|
+
|
|
214
|
+
### Python - Module Production (Module chính)
|
|
215
|
+
|
|
216
|
+
#### Sử dụng API đơn giản (Easy API)
|
|
217
|
+
|
|
218
|
+
```python
|
|
219
|
+
from copyright_watermark import embed_watermark, extract_watermark, verify_watermark
|
|
220
|
+
|
|
221
|
+
# Thông tin bản quyền
|
|
222
|
+
copyright_info = {
|
|
223
|
+
"name": "Nguyen Van A",
|
|
224
|
+
"email": "nguyenvana@example.com",
|
|
225
|
+
"date": "2024-01-15",
|
|
226
|
+
"website": "https://example.com",
|
|
227
|
+
"description": "Original artwork",
|
|
228
|
+
"license": "All rights reserved"
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
# Nhúng vào ảnh (đơn giản nhất)
|
|
232
|
+
result = embed_watermark("input.jpg", copyright_info, "watermarked.jpg",
|
|
233
|
+
password="my_secret_password", strength=0.5)
|
|
234
|
+
print(result)
|
|
235
|
+
# Output: {'success': True, 'copyright_hash': '...', 'psnr': 42.19, 'quality_impact': 'minimal'}
|
|
236
|
+
|
|
237
|
+
# Trích xuất bản quyền
|
|
238
|
+
result = extract_watermark("watermarked.jpg", possible_hashes=["hash1", "hash2"],
|
|
239
|
+
password="my_secret_password")
|
|
240
|
+
print(result)
|
|
241
|
+
# Output: {'success': True, 'copyright_hash': '...', 'confidence': 0.91, 'detected': True}
|
|
242
|
+
|
|
243
|
+
# Xác thực bản quyền
|
|
244
|
+
result = verify_watermark("watermarked.jpg", copyright_hash="abc123...",
|
|
245
|
+
password="my_secret_password")
|
|
246
|
+
print(result)
|
|
247
|
+
# Output: {'verified': True, 'confidence': 0.91, 'copyright_hash': 'abc123...'}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
#### Sử dụng Class đầy đủ (Production)
|
|
251
|
+
|
|
252
|
+
```python
|
|
253
|
+
from copyright_watermark import CopyrightWatermarkPro
|
|
254
|
+
|
|
255
|
+
# Thông tin bản quyền
|
|
256
|
+
copyright_info = {
|
|
257
|
+
"name": "Nguyen Van A",
|
|
258
|
+
"email": "nguyenvana@example.com",
|
|
259
|
+
"date": "2024-01-15",
|
|
260
|
+
"website": "https://example.com",
|
|
261
|
+
"description": "Original artwork",
|
|
262
|
+
"license": "All rights reserved"
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
# Khởi tạo với adaptive strength và redundancy
|
|
266
|
+
wm = CopyrightWatermarkPro(password="my_secret_password", strength=0.5, redundancy=7)
|
|
267
|
+
|
|
268
|
+
# Nhúng vào ảnh
|
|
269
|
+
result = wm.embed_copyright("input.jpg", copyright_info, "watermarked.jpg")
|
|
270
|
+
print(result)
|
|
271
|
+
# Output: {'success': True, 'copyright_hash': '...', 'psnr': 42.19, 'quality_impact': 'minimal'}
|
|
272
|
+
|
|
273
|
+
# Trích xuất với danh sách hash có thể có
|
|
274
|
+
result = wm.extract_copyright("watermarked.jpg", possible_hashes=["hash1", "hash2"])
|
|
275
|
+
print(result)
|
|
276
|
+
# Output: {'success': True, 'copyright_hash': '...', 'confidence': 0.91, 'detected': True}
|
|
277
|
+
|
|
278
|
+
# Xác thực bản quyền
|
|
279
|
+
result = wm.verify_copyright("watermarked.jpg", copyright_hash="abc123...")
|
|
280
|
+
print(result)
|
|
281
|
+
# Output: {'verified': True, 'confidence': 0.91, 'copyright_hash': 'abc123...'}
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
#### Batch Processing (Xử lý hàng loạt)
|
|
285
|
+
|
|
286
|
+
```python
|
|
287
|
+
from copyright_watermark import CopyrightWatermarkPro
|
|
288
|
+
|
|
289
|
+
# Danh sách ảnh cần xử lý
|
|
290
|
+
image_paths = ["img1.jpg", "img2.jpg", "img3.jpg"]
|
|
291
|
+
|
|
292
|
+
copyright_info = {
|
|
293
|
+
"name": "Nguyen Van A",
|
|
294
|
+
"email": "nguyenvana@example.com",
|
|
295
|
+
"date": "2024-01-15"
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
# Xử lý hàng loạt
|
|
299
|
+
results = CopyrightWatermarkPro.batch_embed(image_paths, copyright_info,
|
|
300
|
+
"output_dir", password="secret")
|
|
301
|
+
|
|
302
|
+
for result in results:
|
|
303
|
+
print(f"{result['input']} -> {result['output']}: {result['success']}")
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
### Python - Module Standard (Cũ - Tùy chọn)
|
|
307
|
+
|
|
308
|
+
Nếu cần dùng module standard cũ:
|
|
309
|
+
|
|
310
|
+
```python
|
|
311
|
+
from copyright_watermark_standard import CopyrightWatermark
|
|
312
|
+
|
|
313
|
+
# Khởi tạo với redundancy cao hơn để tăng độ bền
|
|
314
|
+
wm = CopyrightWatermark(password="my_secret_password", redundancy=7)
|
|
315
|
+
|
|
316
|
+
# Nhúng vào ảnh
|
|
317
|
+
success = wm.embed_copyright("input.jpg", copyright_info, "watermarked.jpg")
|
|
318
|
+
|
|
319
|
+
# Trích xuất
|
|
320
|
+
result = wm.extract_copyright("watermarked.jpg", possible_hashes=["hash1", "hash2"])
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
### Node.js - Module Production (Module chính)
|
|
324
|
+
|
|
325
|
+
#### Sử dụng API đơn giản (Easy API)
|
|
326
|
+
|
|
327
|
+
```javascript
|
|
328
|
+
const { embedWatermark, extractWatermark, verifyWatermark } = require('./nodejs_module/copyrightWatermark');
|
|
329
|
+
|
|
330
|
+
const copyrightInfo = {
|
|
331
|
+
name: 'Nguyen Van A',
|
|
332
|
+
email: 'nguyenvana@example.com',
|
|
333
|
+
date: '2024-01-15',
|
|
334
|
+
website: 'https://example.com',
|
|
335
|
+
description: 'Original artwork',
|
|
336
|
+
license: 'All rights reserved'
|
|
337
|
+
};
|
|
338
|
+
|
|
339
|
+
// Nhúng vào ảnh
|
|
340
|
+
const result = await embedWatermark('input.jpg', copyrightInfo, 'watermarked.jpg', 'my_secret_password', 0.5);
|
|
341
|
+
|
|
342
|
+
// Trích xuất bản quyền
|
|
343
|
+
const extractResult = await extractWatermark('watermarked.jpg', ['hash1', 'hash2'], 'my_secret_password');
|
|
344
|
+
|
|
345
|
+
// Xác thực bản quyền
|
|
346
|
+
const verifyResult = await verifyWatermark('watermarked.jpg', 'abc123...', 'my_secret_password');
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
#### Sử dụng Class đầy đủ
|
|
350
|
+
|
|
351
|
+
```javascript
|
|
352
|
+
const { CopyrightWatermarkPro } = require('./nodejs_module/copyrightWatermark');
|
|
353
|
+
|
|
354
|
+
const wm = new CopyrightWatermarkPro('my_secret_password', 0.5, 7);
|
|
355
|
+
|
|
356
|
+
await wm.embedCopyright('input.jpg', copyrightInfo, 'watermarked.jpg');
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
#### Trích xuất bản quyền từ ảnh
|
|
360
|
+
|
|
361
|
+
```javascript
|
|
362
|
+
const { CopyrightWatermarkPro } = require('./nodejs_module/copyrightWatermark');
|
|
363
|
+
|
|
364
|
+
const wm = new CopyrightWatermarkPro('my_secret_password', 0.5, 7);
|
|
365
|
+
|
|
366
|
+
const result = await wm.extractCopyright('watermarked.jpg', ['hash1', 'hash2']);
|
|
367
|
+
console.log(result);
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
#### Xác thực bản quyền
|
|
371
|
+
|
|
372
|
+
```javascript
|
|
373
|
+
const { CopyrightWatermarkPro } = require('./nodejs_module/copyrightWatermark');
|
|
374
|
+
|
|
375
|
+
const wm = new CopyrightWatermarkPro('my_secret_password', 0.5, 7);
|
|
376
|
+
|
|
377
|
+
const result = await wm.verifyCopyright('watermarked.jpg', 'abc123...');
|
|
378
|
+
console.log(result);
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
#### Batch Processing (Xử lý hàng loạt)
|
|
382
|
+
|
|
383
|
+
```javascript
|
|
384
|
+
const { CopyrightWatermarkPro } = require('./nodejs_module/copyrightWatermark');
|
|
385
|
+
|
|
386
|
+
const imagePaths = ['img1.jpg', 'img2.jpg', 'img3.jpg'];
|
|
387
|
+
|
|
388
|
+
const results = await CopyrightWatermarkPro.batchEmbed(imagePaths, copyrightInfo, 'output_dir', 'secret');
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
### Node.js - Module Standard (Cũ - Tùy chọn)
|
|
392
|
+
|
|
393
|
+
```javascript
|
|
394
|
+
const { CopyrightWatermark } = require('./nodejs_module/copyrightWatermarkStandard');
|
|
395
|
+
|
|
396
|
+
const wm = new CopyrightWatermark('my_secret_password', 7);
|
|
397
|
+
|
|
398
|
+
await wm.embedCopyright('input.jpg', copyrightInfo, 'watermarked.jpg');
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
## Thông tin bản quyền
|
|
402
|
+
|
|
403
|
+
Các trường thông tin có thể nhúng:
|
|
404
|
+
|
|
405
|
+
- **name** (bắt buộc): Tên tác giả/chủ sở hữu
|
|
406
|
+
- **email** (bắt buộc): Email liên hệ
|
|
407
|
+
- **date** (bắt buộc): Ngày tạo
|
|
408
|
+
- **website** (tùy chọn): Website
|
|
409
|
+
- **description** (tùy chọn): Mô tả
|
|
410
|
+
- **license** (tùy chọn): Loại license
|
|
411
|
+
|
|
412
|
+
## Cách hoạt động
|
|
413
|
+
|
|
414
|
+
### Module Production (copyright_watermark_pro.py)
|
|
415
|
+
|
|
416
|
+
Module production sử dụng kỹ thuật **Adaptive Quantization-based Steganography**:
|
|
417
|
+
|
|
418
|
+
1. **Mã hóa thông tin**: Thông tin bản quyền được chuyển thành hash SHA-256
|
|
419
|
+
2. **Reed-Solomon Encoding**: Hash được mã hóa với redundancy để có thể khôi phục khi bị hỏng
|
|
420
|
+
3. **Adaptive Quantization**: Dữ liệu được nhúng với strength thích ứng dựa trên local variance
|
|
421
|
+
4. **Pseudo-random Positions**: Vị trí nhúng được tạo ngẫu nhiên dựa trên password
|
|
422
|
+
5. **Error Correction**: Khi trích xuất, sử dụng majority voting để khôi phục dữ liệu
|
|
423
|
+
|
|
424
|
+
Ưu điểm của phương pháp này:
|
|
425
|
+
- Chống chịu tốt với nén ảnh (JPEG compression)
|
|
426
|
+
- Chống chịu cắt ảnh (vì dữ liệu được phân bố rải rác)
|
|
427
|
+
- Chống chịu resize (quantization step giúp duy trì thông tin)
|
|
428
|
+
- Chống chịu blur và contrast tốt hơn (adaptive strength)
|
|
429
|
+
- Có thể khôi phục một phần dữ liệu khi bị hỏng
|
|
430
|
+
- Không làm tăng kích thước file ảnh
|
|
431
|
+
- Impact tối thiểu trên chất lượng ảnh (PSNR > 40dB)
|
|
432
|
+
|
|
433
|
+
### Module Standard (copyright_watermark.py)
|
|
434
|
+
|
|
435
|
+
Module standard sử dụng kỹ thuật **Quantization-based Steganography**:
|
|
436
|
+
|
|
437
|
+
1. **Mã hóa thông tin**: Thông tin bản quyền được chuyển thành hash SHA-256
|
|
438
|
+
2. **Reed-Solomon Encoding**: Hash được mã hóa với redundancy
|
|
439
|
+
3. **Quantization-based Embedding**: Dữ liệu được nhúng vào ảnh bằng cách điều chỉnh các pixel
|
|
440
|
+
4. **Pseudo-random Positions**: Vị trí nhúng được tạo ngẫu nhiên dựa trên password
|
|
441
|
+
5. **Error Correction**: Khi trích xuất, sử dụng majority voting
|
|
442
|
+
|
|
443
|
+
Ưu điểm:
|
|
444
|
+
- Đơn giản, dễ sử dụng
|
|
445
|
+
- Chống chịu tốt với crop, resize, rotation
|
|
446
|
+
- Chống chịu tốt với compression
|
|
447
|
+
|
|
448
|
+
## Metadata file
|
|
449
|
+
|
|
450
|
+
Khi nhúng watermark, một file metadata cũng được tạo ra với đuôi `_metadata.json`. File này chứa:
|
|
451
|
+
|
|
452
|
+
- Thông tin bản quyền gốc
|
|
453
|
+
- Hash của thông tin bản quyền
|
|
454
|
+
- Password đã sử dụng
|
|
455
|
+
- Redundancy level
|
|
456
|
+
|
|
457
|
+
File này giúp bạn:
|
|
458
|
+
- Lưu trữ thông tin bản quyền gốc
|
|
459
|
+
- Xác thực nhanh chóng bằng hash
|
|
460
|
+
- Khôi phục password nếu quên
|
|
461
|
+
|
|
462
|
+
## Tham số cấu hình
|
|
463
|
+
|
|
464
|
+
### Redundancy Parameter
|
|
465
|
+
|
|
466
|
+
- **Mặc định**: 5
|
|
467
|
+
- **Khuyến nghị**: 7-10 cho độ bền cao
|
|
468
|
+
- **Tác động**: Redundancy càng cao thì càng bền nhưng ảnh càng lớn và thời gian xử lý càng lâu
|
|
469
|
+
|
|
470
|
+
```python
|
|
471
|
+
# Low redundancy (nhanh nhưng kém bền)
|
|
472
|
+
wm = CopyrightWatermark(password="secret", redundancy=3)
|
|
473
|
+
|
|
474
|
+
# High redundancy (chậm nhưng rất bền)
|
|
475
|
+
wm = CopyrightWatermark(password="secret", redundancy=10)
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
## Test độ bền
|
|
479
|
+
|
|
480
|
+
### Test Module Production (Python)
|
|
481
|
+
|
|
482
|
+
Chạy script test để kiểm tra độ bền của production module:
|
|
483
|
+
|
|
484
|
+
```bash
|
|
485
|
+
cd examples
|
|
486
|
+
python test_pro_robustness.py # Cần cài đặt dependencies trước
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
Script sẽ test với:
|
|
490
|
+
- Quality impact (PSNR measurement)
|
|
491
|
+
- File size impact
|
|
492
|
+
- Blur attacks (3x3 - 15x15)
|
|
493
|
+
- Brightness adjustments (-100 to +100)
|
|
494
|
+
- Contrast adjustments (0.5x - 2.5x)
|
|
495
|
+
- Noise addition (std 5-50)
|
|
496
|
+
- Easy API testing
|
|
497
|
+
|
|
498
|
+
### Test Module Production (Node.js)
|
|
499
|
+
|
|
500
|
+
```bash
|
|
501
|
+
cd nodejs_module
|
|
502
|
+
node ../examples/test_nodejs_pro.js
|
|
503
|
+
```
|
|
504
|
+
|
|
505
|
+
### Test Module Standard
|
|
506
|
+
|
|
507
|
+
Chạy script test cho module standard:
|
|
508
|
+
|
|
509
|
+
```bash
|
|
510
|
+
cd examples
|
|
511
|
+
python test_robustness.py # Cần cài đặt dependencies trước
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
Script sẽ test với:
|
|
515
|
+
- Crop attacks (10%, 25%, 50%, 75%)
|
|
516
|
+
- Resize attacks (25%, 50%, 75%, 150%, 200%)
|
|
517
|
+
- JPEG compression (Quality 15-95)
|
|
518
|
+
- Brightness adjustments (-100 to +100)
|
|
519
|
+
- Contrast adjustments (0.5x to 2.0x)
|
|
520
|
+
- Gaussian blur (3x3 to 11x11)
|
|
521
|
+
- Noise addition (std 10-75)
|
|
522
|
+
- Rotation (5° to 90°)
|
|
523
|
+
- Combined attacks
|
|
524
|
+
|
|
525
|
+
### Test Cả Hai Module (Comprehensive)
|
|
526
|
+
|
|
527
|
+
```bash
|
|
528
|
+
cd examples
|
|
529
|
+
python test_both_modules.py
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
Script này sẽ:
|
|
533
|
+
- Test Python module
|
|
534
|
+
- Test Node.js module
|
|
535
|
+
- Test cross-module compatibility
|
|
536
|
+
- Test cả hai module với các tấn công
|
|
537
|
+
|
|
538
|
+
## Lưu ý quan trọng
|
|
539
|
+
|
|
540
|
+
1. **Password quan trọng**: Hãy sử dụng password mạnh và lưu trữ nó an toàn. Cùng một password phải được dùng để nhúng và trích xuất.
|
|
541
|
+
2. **Metadata file**: Lưu trữ file `_metadata.json` an toàn vì nó chứa thông tin bản quyền gốc.
|
|
542
|
+
3. **Redundancy**: Tăng redundancy để tăng độ bền nhưng sẽ làm tăng thời gian xử lý.
|
|
543
|
+
4. **Chất lượng ảnh**: Watermark hoạt động tốt hơn với ảnh chất lượng cao (ít nén, resolution tốt).
|
|
544
|
+
5. **Giới hạn**: Không chống được noise addition mạnh và một số filter ảnh mạnh.
|
|
545
|
+
|
|
546
|
+
## Ví dụ thực tế
|
|
547
|
+
|
|
548
|
+
Xem file `examples/example_python.py` và `examples/example_nodejs.js` để có các ví dụ chi tiết về:
|
|
549
|
+
- Nhúng bản quyền đơn lẻ
|
|
550
|
+
- Trích xuất bản quyền
|
|
551
|
+
- Xác thực bản quyền
|
|
552
|
+
- Xử lý hàng loạt ảnh
|
|
553
|
+
|
|
554
|
+
## So sánh các phiên bản
|
|
555
|
+
|
|
556
|
+
| Tính năng | Standard | Production |
|
|
557
|
+
|-----------|----------|------------|
|
|
558
|
+
| Phương pháp nhúng | Quantization-based | Adaptive Quantization |
|
|
559
|
+
| Error correction | Reed-Solomon | Reed-Solomon |
|
|
560
|
+
| Redundancy | Có (configurable) | Có (configurable) |
|
|
561
|
+
| Crop resistance | Rất tốt (100%) | Rất tốt (100%) |
|
|
562
|
+
| Resize resistance | Rất tốt (100%) | Rất tốt (100%) |
|
|
563
|
+
| Compression resistance | Tốt (83%) | Tốt (83%) |
|
|
564
|
+
| Rotation resistance | Rất tốt (100%) | Rất tốt (100%) |
|
|
565
|
+
| Blur resistance | Trung bình (40%) | Tốt (83%) |
|
|
566
|
+
| Brightness resistance | Trung bình (33%) | Tốt (50%) |
|
|
567
|
+
| Contrast resistance | Trung bình (40%) | Xuất sắc (100%) |
|
|
568
|
+
| Noise resistance | Kém (0%) | Trung bình (12.5%) |
|
|
569
|
+
| Quality impact (PSNR) | ~40dB | >40dB (adaptive) |
|
|
570
|
+
| File size increase | Minimal | Minimal (~1%) |
|
|
571
|
+
| Easy API | Không | Có |
|
|
572
|
+
| Batch processing | Không | Có |
|
|
573
|
+
| Production-ready | Có | Có (tốt hơn) |
|
|
574
|
+
|
|
575
|
+
## Giới hạn
|
|
576
|
+
|
|
577
|
+
- Watermark có thể bị hủy nếu ảnh bị thêm noise mạnh
|
|
578
|
+
- Một số filter ảnh mạnh (heavy blur, sharpen) có thể làm mất watermark
|
|
579
|
+
- Cần cùng password để nhúng và trích xuất
|
|
580
|
+
- Không bảo vệ 100% chống lại mọi tấn công, nhưng đủ tốt cho việc bảo vệ bản quyền thông thường
|
|
581
|
+
|
|
582
|
+
## License
|
|
583
|
+
|
|
584
|
+
MIT License
|
|
585
|
+
|
|
586
|
+
## Đóng góp
|
|
587
|
+
|
|
588
|
+
Mọi đóng góp đều được chào đón!
|