I'm having some issues with my program, basically what I'm trying to do is Stenography, insert an image into another image and then extract the secret image.
My program is able to insert just fine, but extracting it I get this error.
It was working fine the other day, I was able to read and write perfectly. I am also using the same BMP images as the other day as well. Anyone know the issue? I didn't change any of the code from it's working state, I even uploaded to github to make sure that version worked.
There are 3 files of code that is on my github.
https://github.com/am3ience/Steganography/blob/master/dcstego.py
https://github.com/am3ience/Steganography/blob/master/dcimage.py
https://github.com/am3ience/Steganography/blob/master/dcutils.py
The problem seems to be happening in dcutils.py in my read function. Any help would be amazing, i'm stumped.
#examine the lsb of each pixel, grouping into bytes
#check for nulls to signify if we are dealing with data or header info
#bytes determined to be data result in the hidden file
#---------------------------------------------------------------
def read(mainimage, output, password):lsbByte_Array = []dataString = ""secretFileName = ""lsbString = ""count = 0#iteratorheaderReceived=0#flagssizeReceived=0imageObject = dcimage.openFile(mainimage)pixels = imageObject.load()imageWidth, imageHeight = imageObject.size#cycle through each pixelfor x in range(imageWidth):for y in range(imageHeight):r, g, b = pixels[x, y]#trim so we are dealing with only the least significant bitredPixel = str(bin(r)[2:].zfill(8))[7]greenPixel = str(bin(g)[2:].zfill(8))[7]bluePixel = str(bin(b)[2:].zfill(8))[7]secretBits = [redPixel, greenPixel, bluePixel]#for each of rgbfor i in range(0,3):#check if our flags are setif (headerReceived == 0 or sizeReceived == 0):lsbString += secretBits[i]#verify each byteif len(lsbString) == 8:lsbByte_Array.append(lsbString)#check if we have received a NULL byteif lsbString == "00000000":if headerReceived == 0:#convert the the bit array into an ascii String#set flag when header and size was receivedfileName = ''.join(binascii.unhexlify('%x' % int(b,2)) for b in lsbByte_Array[0:len(lsbByte_Array) - 1])print "File name: " + str(fileName)headerReceived = 1elif sizeReceived == 0:fileSize = ''.join(binascii.unhexlify('%x' % int(b,2)) for b in lsbByte_Array[0:len(lsbByte_Array) - 1])print "File size: " + fileSizesizeReceived=1#reset the valueslsbByte_Array = []lsbString = ""#once headers received, resulting data is hidden dataelif (headerReceived == 1 and sizeReceived == 1):if int(count) < int(fileSize):#keep appending secret bits to the dataString until depleteddataString += secretBits[i]count += 1else:#send to have hidden file created
return dcimage.saveImage(output, dataString)