Python
2019.07.17 15:01

Image 기반 Steganography 예제

조회 수 1059 댓글 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
번호 분류 제목 날짜 조회 수 추천 수
483 Android Android Studio 안드로이드 스튜디오 단축키 2020.03.16 417 0
482 일반 전기적 스펙에 관한 용어, 약자 정리 2020.02.24 605 0
481 PHP SQL 일정 시간단위로 데이터 검색하기 2020.02.12 525 0
480 LINUX Ubuntu php5.6 , php7.1 설치 및 셋팅하기 2020.02.11 561 0
479 LINUX Ubuntu apt-get 명령어 정리 2020.02.11 677 0
478 LINUX 우분투(Ubuntu) 설치된 패키지 목록 확인하기 2020.02.11 551 0
477 일반 온습도, 미세먼지 정보 받아오기 secret 2020.01.10 0 0
476 Pi 아두이노 데이터 저장하기(Arduino EEPROM 사용하기) 2019.12.24 1660 0
475 LINUX mutt Gmail 설치, 사용 / Ubuntu 18.04 환경 2019.11.25 935 0
474 LINUX 리눅스 명령행에서 메일 보내기(send mail from linux command line) 2019.11.25 1448 0
473 LINUX Ubuntu TFTP 서버 2019.10.30 1560 0
472 Pi 레귤레이터(3.3V 1A) KA78R33 데이터시트 file 2019.08.20 678 0
471 Pi 회로부품 메모 1 secret 2019.08.09 1 0
470 Pi OP AMP의 활용 2019.08.05 1962 0
» Python Image 기반 Steganography 예제 1 2019.07.17 1059 0
목록
Board Pagination ‹ Prev 1 2 3 4 5 6 7 8 9 10 ... 33 Next ›
/ 33

나눔글꼴 설치 안내


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

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

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5