New files: - LICENSE (MIT) - Required legal file - CHANGELOG.md - Version history following Keep a Changelog - CONTRIBUTING.md - Contributor guidelines - CODE_OF_CONDUCT.md - Community standards - .github/ISSUE_TEMPLATE/ - Bug report and feature request forms - .github/PULL_REQUEST_TEMPLATE.md - PR checklist - src/stegasoo/py.typed - PEP 561 type hint marker - examples/ - Usage examples (basic, file embedding, channel keys) Updated: - README.md - Added CI status badges 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
79 lines
2.1 KiB
Python
79 lines
2.1 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
File Embedding Example
|
|
|
|
This example demonstrates how to embed a file (like a document or image)
|
|
inside a carrier image using Stegasoo.
|
|
"""
|
|
|
|
from pathlib import Path
|
|
|
|
import stegasoo
|
|
from stegasoo.models import FilePayload
|
|
|
|
|
|
def main():
|
|
# Load images
|
|
reference_photo = Path("my_secret_photo.png").read_bytes()
|
|
carrier_image = Path("carrier.png").read_bytes()
|
|
|
|
# Load the file to embed
|
|
secret_file = Path("secret_document.pdf")
|
|
file_data = secret_file.read_bytes()
|
|
|
|
# Create a FilePayload
|
|
payload = FilePayload(
|
|
filename=secret_file.name,
|
|
data=file_data,
|
|
mime_type="application/pdf",
|
|
)
|
|
|
|
# Credentials
|
|
passphrase = "correct horse battery staple"
|
|
pin = "123456"
|
|
|
|
# Check capacity first
|
|
capacity = stegasoo.calculate_capacity(carrier_image)
|
|
print(f"Carrier capacity: {capacity['capacity_bytes']:,} bytes")
|
|
print(f"File size: {len(file_data):,} bytes")
|
|
|
|
if len(file_data) > capacity["capacity_bytes"]:
|
|
print("Error: File too large for this carrier!")
|
|
return
|
|
|
|
# Encode the file
|
|
print("\nEmbedding file...")
|
|
result = stegasoo.encode(
|
|
file_payload=payload,
|
|
reference_photo=reference_photo,
|
|
carrier_image=carrier_image,
|
|
passphrase=passphrase,
|
|
pin=pin,
|
|
)
|
|
|
|
output_path = Path(f"contains_file_{result.suggested_filename}")
|
|
output_path.write_bytes(result.stego_image)
|
|
print(f"Saved to: {output_path}")
|
|
|
|
# Decode and extract the file
|
|
print("\nExtracting file...")
|
|
decoded = stegasoo.decode(
|
|
stego_image=output_path.read_bytes(),
|
|
reference_photo=reference_photo,
|
|
passphrase=passphrase,
|
|
pin=pin,
|
|
)
|
|
|
|
if decoded.payload_type == "file":
|
|
extracted_path = Path(f"extracted_{decoded.filename}")
|
|
extracted_path.write_bytes(decoded.file_data)
|
|
print(f"Extracted: {extracted_path}")
|
|
print(f"Original filename: {decoded.filename}")
|
|
print(f"MIME type: {decoded.mime_type}")
|
|
else:
|
|
print(f"Unexpected payload type: {decoded.payload_type}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|