Refacto lsbset.hide to use less memory

This commit is contained in:
Flavien 2022-11-08 21:41:10 +01:00
parent cf7209f94c
commit 257d2c2f68

View file

@ -25,6 +25,7 @@ __date__ = "$Date: 2016/03/13 $"
__revision__ = "$Date: 2019/05/31 $"
__license__ = "GPLv3"
import sys
from typing import IO, Iterator, Union
from PIL import Image
@ -56,7 +57,7 @@ def hide(
raise Exception("Not a RGB image.")
img = img.convert("RGB")
img_list = list(img.getdata())
encoded = img.copy()
width, height = img.size
index = 0
@ -76,7 +77,12 @@ def hide(
while index + 3 <= len_message_bits:
generated_number = next(generator)
r, g, b, *a = img_list[generated_number]
col = generated_number % width
row = int(generated_number / width)
coordinate = (col, row)
r, g, b, *a = encoded.getpixel(coordinate)
# Change the Least Significant Bit of each colour component.
r = tools.setlsb(r, message_bits[index])
@ -85,18 +91,12 @@ def hide(
# Save the new pixel
if img.mode == "RGBA":
img_list[generated_number] = (r, g, b, *a)
encoded.putpixel(coordinate, (r, g, b, *a))
else:
img_list[generated_number] = (r, g, b)
encoded.putpixel(coordinate, (r, g, b))
index += 3
# create empty new image of appropriate format
encoded = Image.new(img.mode, (img.size))
# insert saved data into the image
encoded.putdata(img_list)
return encoded