티스토리 뷰

python lecture/project

[python] 스테가노그래피

burningrizen 2020. 5. 25. 23:33

원본, 히든 이미지

dog.jpg
0.06MB
hidden.jpg
0.02MB

 

 

스테가노그래피 설명

 

 

 

Pillow 라이브러리 설치

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

from PIL import Image as image


def encoding(dec, data):
    val = bin(dec)[:-1] + ("1" if data else "0")
    return int(val, 2)


def decoding(dec):
    return 255 if int(bin(dec)[-1]) else 0


def encoding_pixel(color_ori, color_data):
    r = encoding(color_ori[0], color_data[0] if isinstance(color_data, tuple) else color_data)
    g = encoding(color_ori[1], color_data[1] if isinstance(color_data, tuple) else color_data)
    b = encoding(color_ori[2], color_data[2] if isinstance(color_data, tuple) else color_data)
    return r, g, b


def decoding_pixel(color_ori):
    return decoding(color_ori[0]), decoding(color_ori[1]), decoding(color_ori[2])


def insert(ori_img, data_img):
    if ori_img.size != data_img.size:
        raise ValueError("Image size is difference")
    dst = image.new("RGB", ori_img.size, (0, 0, 0))
    width, height = ori_img.size
    pixels_ori = ori_img.load()
    pixels_dst = dst.load()
    pixels_data = data_img.load()
    for y in range(height):
        for x in range(width):
            color_ori = pixels_ori[x, y]
            color_data = pixels_data[x, y]
            encoding_pixel(color_ori, color_data)
            pixels_dst[x, y] = encoding_pixel(color_ori, color_data)
    return dst


def extract(ori):
    dst = image.new("RGB", ori.size, (0, 0, 0))
    width, height = ori.size
    pixels_dst = dst.load()
    pixels_ori = ori.load()
    for y in range(height):
        for x in range(width):
            color = pixels_ori[x, y]
            pixels_dst[x, y] = decoding_pixel(color)
    return dst


if __name__ == '__main__':
    ori = image.open("./img/dog.jpg")
    data = image.open("./img/hidden.png")
    ori.show()
    data.show()
    input("press and start encoding")
    new_img = insert(ori, data)
    new_img.save("./img/encoding.png")
    new_img.show()
    input("encoding is done\npress and start decoding")
    decoding_img = extract(new_img)
    decoding_img.show()
    decoding_img.save("./img/decoding.png")
    input("decoding is done")

'python lecture > project' 카테고리의 다른 글

[python] n 진수 바꾸기  (0) 2020.06.03
[python] 시간변환  (0) 2020.05.27
[python] 남/여 균일 매칭  (0) 2020.05.25
[python] # 연산 하기  (0) 2020.05.11
[python] 원소기호 맞추기  (0) 2020.05.09
댓글