Python
2019.07.17 15:01

Image 기반 Steganography 예제

조회 수 27890 댓글 1
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print


https://www.geeksforgeeks.org/image-based-steganography-using-python/



[Python 3]


# Python program implementing Image Steganography 

# PIL module is used to extract 
# pixels of image and modify it 
from PIL import Image 

# Convert encoding data into 8-bit binary 
# form using ASCII value of characters 
def genData(data): 
		
		# list of binary codes 
		# of given data 
		newd = [] 
		
		for i in data: 
			newd.append(format(ord(i), '08b')) 
		return newd 
		
# Pixels are modified according to the 
# 8-bit binary data and finally returned 
def modPix(pix, data): 
	
	datalist = genData(data) 
	lendata = len(datalist) 
	imdata = iter(pix) 

	for i in range(lendata): 
		
		# Extracting 3 pixels at a time 
		pix = [value for value in imdata.__next__()[:3] +
								imdata.__next__()[:3] +
								imdata.__next__()[:3]] 
									
		# Pixel value should be made 
		# odd for 1 and even for 0 
		for j in range(0, 8): 
			if (datalist[i][j]=='0') and (pix[j]% 2 != 0): 
				
				if (pix[j]% 2 != 0): 
					pix[j] -= 1
					
			elif (datalist[i][j] == '1') and (pix[j] % 2 == 0): 
				pix[j] -= 1
				
		# Eigh^th pixel of every set tells 
		# whether to stop ot read further. 
		# 0 means keep reading; 1 means the 
		# message is over. 
		if (i == lendata - 1): 
			if (pix[-1] % 2 == 0): 
				pix[-1] -= 1
		else: 
			if (pix[-1] % 2 != 0): 
				pix[-1] -= 1

		pix = tuple(pix) 
		yield pix[0:3] 
		yield pix[3:6] 
		yield pix[6:9] 

def encode_enc(newimg, data): 
	w = newimg.size[0] 
	(x, y) = (0, 0) 
	
	for pixel in modPix(newimg.getdata(), data): 
		
		# Putting modified pixels in the new image 
		newimg.putpixel((x, y), pixel) 
		if (x == w - 1): 
			x = 0
			y += 1
		else: 
			x += 1
			
# Encode data into image 
def encode(): 
	img = input("Enter image name(with extension): ") 
	image = Image.open(img, 'r') 
	
	data = input("Enter data to be encoded : ") 
	if (len(data) == 0): 
		raise ValueError('Data is empty') 
		
	newimg = image.copy() 
	encode_enc(newimg, data) 
	
	new_img_name = input("Enter the name of new image(with extension): ") 
	newimg.save(new_img_name, str(new_img_name.split(".")[1].upper())) 

# Decode the data in the image 
def decode(): 
	img = input("Enter image name(with extension) :") 
	image = Image.open(img, 'r') 
	
	data = '' 
	imgdata = iter(image.getdata()) 
	
	while (True): 
		pixels = [value for value in imgdata.__next__()[:3] +
								imgdata.__next__()[:3] +
								imgdata.__next__()[:3]] 
		# string of binary data 
		binstr = '' 
		
		for i in pixels[:8]: 
			if (i % 2 == 0): 
				binstr += '0'
			else: 
				binstr += '1'
				
		data += chr(int(binstr, 2)) 
		if (pixels[-1] % 2 != 0): 
			return data 
			
# Main Function		 
def main(): 
	a = int(input(":: Welcome to Steganography ::\n"
						"1. Encode\n 2. Decode\n")) 
	if (a == 1): 
		encode() 
		
	elif (a == 2): 
		print("Decoded word- " + decode()) 
	else: 
		raise Exception("Enter correct input") 
		
# Driver Code 
if __name__ == '__main__' : 
	
	# Calling main function 
	main() 



[Python 2]


# Python program implementing Image Steganography

# PIL module is used to extract
# pixels of image and modify it
from PIL import Image
import sys, os

# Convert encoding data into 8-bit binary
# form using ASCII value of characters
def genData(data):
    # list of binary codes
    # of given data
    newd = []

    for i in data:
        newd.append(format(ord(i), '08b'))
    return newd


# Pixels are modified according to the
# 8-bit binary data and finally returned
def modPix(pix, data):
    datalist = genData(data)
    lendata = len(datalist)
    imdata = iter(pix)

    for i in range(lendata):

        # Extracting 3 pixels at a time
        pix = [value for value in imdata.next()[:3] +
               imdata.next()[:3] +
               imdata.next()[:3]]

        # Pixel value should be made
        # odd for 1 and even for 0
        for j in range(0, 8):
            if (datalist[i][j] == '0') and (pix[j] % 2 != 0):

                if (pix[j] % 2 != 0):
                    pix[j] -= 1

            elif (datalist[i][j] == '1') and (pix[j] % 2 == 0):
                pix[j] -= 1

        # Eigh^th pixel of every set tells
        # whether to stop ot read further.
        # 0 means keep reading; 1 means the
        # message is over.
        if (i == lendata - 1):
            if (pix[-1] % 2 == 0):
                pix[-1] -= 1
        else:
            if (pix[-1] % 2 != 0):
                pix[-1] -= 1

        pix = tuple(pix)
        yield pix[0:3]
        yield pix[3:6]
        yield pix[6:9]


def encode_enc(newimg, data):
    w = newimg.size[0]
    (x, y) = (0, 0)

    for pixel in modPix(newimg.getdata(), data):

        # Putting modified pixels in the new image
        newimg.putpixel((x, y), pixel)
        if (x == w - 1):
            x = 0
            y += 1
        else:
            x += 1


# Encode data into image
def encode(orgfilename, msg, outfilename):
    img = orgfilename
    image = Image.open(img, 'r')

    data = msg
    if (len(data) == 0):
        raise ValueError('Data is empty')

    newimg = image.copy()
    encode_enc(newimg, data)

    new_img_name = outfilename
    newimg.save(new_img_name, str(new_img_name.split(".")[1].upper()))


# Decode the data in the image
def decode(filename):
    img = filename
    image = Image.open(img, 'r')

    data = ''
    imgdata = iter(image.getdata())

    while (True):
        pixels = [value for value in imgdata.next()[:3] +
                  imgdata.next()[:3] +
                  imgdata.next()[:3]]
        # string of binary data
        binstr = ''

        for i in pixels[:8]:
            if (i % 2 == 0):
                binstr += '0'
            else:
                binstr += '1'

        data += chr(int(binstr, 2))
        if (pixels[-1] % 2 != 0):
            print data
            return data

        # Main Function

def printUsage():
    print " This program Encode / Decode hidden message into image."
    print " <Usage>"
    print "   Encode: steg_test.py -a [input_filename] [message] [out_filename]"
    print "   Decode: steg_test.py -b [out_filename]"

if __name__ == '__main__':
    if len(sys.argv) < 3:
        printUsage()
        exit(0)

    if sys.argv[1] == '-a':
        if len(sys.argv) == 5:
            encode(sys.argv[2], sys.argv[3], sys.argv[4])
        else:
            printUsage()
    elif sys.argv[1] == '-b':
        if len(sys.argv) == 3:
            decode(sys.argv[2])
        else:
            printUsage()
    else:
        printUsage()



Dreamy의 코드 스크랩

내가 모으고 내가 보는

List of Articles
번호 분류 제목 날짜 조회 수 추천 수
» Python Image 기반 Steganography 예제 1 2019.07.17 27890 0
34 Python 디렉토리 없으면 만들기 2019.03.30 8182 0
33 Python 줄 바꿈 없이 출력하는 방법 2019.03.30 9430 0
32 Python Google Colab에서 파일 업로드/다운로드 팁 2019.03.06 39417 0
31 Python pandas, matplot 자주사용하는 코드 2019.03.06 7344 0
30 Python matplot에서 한글이 보이도록 하는 코드 2019.03.06 8352 0
29 Python [tensorflow] 텐서플로우 문서 한글번역본 2018.03.22 7417 0
28 Python [tensorflow] 선형회귀 예제 2018.02.05 7595 0
27 Python json 데이터 핸들링 2017.03.09 11073 0
26 Python pygoogle 파이썬으로 구글 검색결과 가져오기 library 2016.01.20 12038 0
25 Python pyBest 소스 secret 2016.01.20 0 0
24 Python 커맨드 라인에서 컬러로 출력하기 termcolor 2014.06.27 12454 0
23 Python [Sconscript] Install method 2014.05.29 10522 0
22 Python C, Python and swig on Windows with Visual Studio 2014.05.29 13738 0
21 Python Python 유용한 코드 모음 2014.05.20 16974 0
목록
Board Pagination ‹ Prev 1 2 3 Next ›
/ 3

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5