Hi everyone, Thanks for the comments Dave and Alan!
Based on these I have updated the code... I don't know if this is more readable. @Dave: I kept the original separate and combine function with bases as I thought I would move them to a math library if I need to work in other bases, however now I have followed your advice and made them more specific to the solution. I couldn't understand the bit about how to use format. Could you check it out in the context of the new code? Also didn't get the bit about zip() either, however it got me thinking and I used map instead. I am still not very happy about the separateToList function :( and I hope I haven't been overzealous in using map(). I have also changed the text concatenation. Here's the code: import Image ENDTEXT = '~~' def separateToList(num): """ changes an integer into a list with 0's padded to the left if the number is in tens or units """ assert(num <= 255) s = str(num) li = [] if len(s) > 2: li = [s[0:1], s[1:2], s[2:3]] elif len(s) > 1: li = [0, s[0:1], s[1:2]] elif len(s) > 0: li = [0, 0, s[0:1]] return map(int, li) def getCharFromRGB(rgb): """ takes an rgb tuple and changes it to an ascii char by taking the unit digits of each color """ rgb = map(lambda x: x %10, rgb) ordChar = int(''.join(map(str, rgb))) assert(ordChar <= 255) return chr(ordChar) def hidePartOfCharInColor(color, charDigit): """ take a color as integer not exceeding 255 and replace the unit digit with one of the ascii char's digit """ assert(color <= 255) color -= (color % 10) color += charDigit if (color > 255): color -= 10 return color def incrementRowCol(imgWidth, row, col): row += 1 if row == imgWidth: row, col = 0, col+1 return row, col def encode(img, text): """ Takes PIL image and any string, encodes the text in the image, saving the changes to the image Returns False if text size is greater than pixels """ x = 0 y = 0 height, width = img.size text = text + ENDTEXT if len(text) > height * width: return False pix = img.load() for c in text: ordAsList = separateToList(ord(c)) rgb = pix[x, y] pix[x,y] = tuple(map(hidePartOfCharInColor, rgb, ordAsList)) x, y = incrementRowCol(width, x, y) img.save(img.filename) return True def decode(img): x = 0 y = 0 charList = [] c = "" height, width = img.size pix = img.load() while True: lastc = c c = getCharFromRGB(pix[x, y]) charList.append(c) if (c + lastc == ENDTEXT): return ''.join(charList[:-2]) x, y = incrementRowCol(width, x, y)
_______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor