mirror of
https://github.com/cedricbonhomme/Stegano.git
synced 2025-05-12 17:18:30 +02:00
Add option to either pass a path or an Image instance
This commit is contained in:
parent
538316c722
commit
93de151025
5 changed files with 27 additions and 8 deletions
|
@ -26,7 +26,10 @@ __revision__ = "$Date: 2017/01/18 $"
|
||||||
__license__ = "GPLv3"
|
__license__ = "GPLv3"
|
||||||
|
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
|
|
||||||
import piexif
|
import piexif
|
||||||
|
from stegano import tools
|
||||||
|
|
||||||
|
|
||||||
def hide(input_image_file, img_enc, secret_message = None, secret_file = None, img_format = None):
|
def hide(input_image_file, img_enc, secret_message = None, secret_file = None, img_format = None):
|
||||||
"""Hide a message (string) in an image.
|
"""Hide a message (string) in an image.
|
||||||
|
@ -43,7 +46,7 @@ def hide(input_image_file, img_enc, secret_message = None, secret_file = None, i
|
||||||
except:
|
except:
|
||||||
text = compress(b64encode(secret_message))
|
text = compress(b64encode(secret_message))
|
||||||
|
|
||||||
img = Image.open(input_image_file)
|
img = tools.open_image(input_image_file)
|
||||||
|
|
||||||
if img_format is None:
|
if img_format is None:
|
||||||
img_format = img.format
|
img_format = img.format
|
||||||
|
@ -66,7 +69,8 @@ def reveal(input_image_file):
|
||||||
from base64 import b64decode
|
from base64 import b64decode
|
||||||
from zlib import decompress
|
from zlib import decompress
|
||||||
|
|
||||||
img = Image.open(input_image_file)
|
img = tools.open_image(input_image_file)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if img.format in ['JPEG', 'TIFF']:
|
if img.format in ['JPEG', 'TIFF']:
|
||||||
if 'exif' in img.info:
|
if 'exif' in img.info:
|
||||||
|
|
|
@ -42,7 +42,7 @@ def hide(input_image: Union[str, IO[bytes]],
|
||||||
message_length = len(message)
|
message_length = len(message)
|
||||||
assert message_length != 0, "message length is zero"
|
assert message_length != 0, "message length is zero"
|
||||||
|
|
||||||
img = Image.open(input_image)
|
img = tools.open_image(input_image)
|
||||||
|
|
||||||
if img.mode not in ['RGB', 'RGBA']:
|
if img.mode not in ['RGB', 'RGBA']:
|
||||||
if not auto_convert_rgb:
|
if not auto_convert_rgb:
|
||||||
|
@ -96,7 +96,7 @@ def hide(input_image: Union[str, IO[bytes]],
|
||||||
def reveal(input_image: Union[str, IO[bytes]], encoding='UTF-8'):
|
def reveal(input_image: Union[str, IO[bytes]], encoding='UTF-8'):
|
||||||
"""Find a message in an image (with the LSB technique).
|
"""Find a message in an image (with the LSB technique).
|
||||||
"""
|
"""
|
||||||
img = Image.open(input_image)
|
img = tools.open_image(input_image)
|
||||||
width, height = img.size
|
width, height = img.size
|
||||||
buff, count = 0, 0
|
buff, count = 0, 0
|
||||||
bitab = []
|
bitab = []
|
||||||
|
|
|
@ -45,7 +45,7 @@ def hide(input_image: Union[str, IO[bytes]],
|
||||||
message_length = len(message)
|
message_length = len(message)
|
||||||
assert message_length != 0, "message length is zero"
|
assert message_length != 0, "message length is zero"
|
||||||
|
|
||||||
img = Image.open(input_image)
|
img = tools.open_image(input_image)
|
||||||
|
|
||||||
if img.mode not in ['RGB', 'RGBA']:
|
if img.mode not in ['RGB', 'RGBA']:
|
||||||
if not auto_convert_rgb:
|
if not auto_convert_rgb:
|
||||||
|
@ -105,7 +105,7 @@ def reveal(input_image: Union[str, IO[bytes]],
|
||||||
encoding: str = 'UTF-8'):
|
encoding: str = 'UTF-8'):
|
||||||
"""Find a message in an image (with the LSB technique).
|
"""Find a message in an image (with the LSB technique).
|
||||||
"""
|
"""
|
||||||
img = Image.open(input_image)
|
img = tools.open_image(input_image)
|
||||||
img_list = list(img.getdata())
|
img_list = list(img.getdata())
|
||||||
width, height = img.size
|
width, height = img.size
|
||||||
buff, count = 0, 0
|
buff, count = 0, 0
|
||||||
|
|
|
@ -29,6 +29,7 @@ import sys
|
||||||
|
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
from typing import Union, IO
|
from typing import Union, IO
|
||||||
|
from stegano import tools
|
||||||
|
|
||||||
def hide(input_image: Union[str, IO[bytes]], message: str):
|
def hide(input_image: Union[str, IO[bytes]], message: str):
|
||||||
"""
|
"""
|
||||||
|
@ -41,7 +42,7 @@ def hide(input_image: Union[str, IO[bytes]], message: str):
|
||||||
message_length = len(message)
|
message_length = len(message)
|
||||||
assert message_length != 0, "message message_length is zero"
|
assert message_length != 0, "message message_length is zero"
|
||||||
assert message_length < 255, "message is too long"
|
assert message_length < 255, "message is too long"
|
||||||
img = Image.open(input_image)
|
img = tools.open_image(input_image)
|
||||||
# Use a copy of image to hide the text in
|
# Use a copy of image to hide the text in
|
||||||
encoded = img.copy()
|
encoded = img.copy()
|
||||||
width, height = img.size
|
width, height = img.size
|
||||||
|
@ -70,7 +71,7 @@ def reveal(input_image: Union[str, IO[bytes]]):
|
||||||
hidden message characters (ASCII values).
|
hidden message characters (ASCII values).
|
||||||
The red value of the first pixel is used for message_length of string.
|
The red value of the first pixel is used for message_length of string.
|
||||||
"""
|
"""
|
||||||
img = Image.open(input_image)
|
img = tools.open_image(input_image)
|
||||||
width, height = img.size
|
width, height = img.size
|
||||||
message = ""
|
message = ""
|
||||||
index = 0
|
index = 0
|
||||||
|
|
|
@ -29,6 +29,9 @@ import base64
|
||||||
import itertools
|
import itertools
|
||||||
from typing import List, Iterator, Tuple, Union
|
from typing import List, Iterator, Tuple, Union
|
||||||
from functools import reduce
|
from functools import reduce
|
||||||
|
from typing import IO, Iterator, List, Tuple, Union
|
||||||
|
|
||||||
|
from PIL import Image
|
||||||
|
|
||||||
ENCODINGS = {
|
ENCODINGS = {
|
||||||
'UTF-8': 8,
|
'UTF-8': 8,
|
||||||
|
@ -99,3 +102,14 @@ def base642binary(b64_fname: str) -> bytes:
|
||||||
"""
|
"""
|
||||||
b64_fname += '==='
|
b64_fname += '==='
|
||||||
return base64.b64decode(b64_fname)
|
return base64.b64decode(b64_fname)
|
||||||
|
|
||||||
|
def open_image(fname_or_instance: Union[str, IO[bytes]]):
|
||||||
|
"""Opens a Image and returns it.
|
||||||
|
|
||||||
|
:param fname_or_instance: Can either be the location of the image as a
|
||||||
|
string or the Image.Image instance itself.
|
||||||
|
"""
|
||||||
|
if isinstance(fname_or_instance, Image.Image):
|
||||||
|
return fname_or_instance
|
||||||
|
|
||||||
|
return Image.open(fname_or_instance)
|
||||||
|
|
Loading…
Add table
Reference in a new issue