Advertisement
nac13k

mensajes de texto en una imagen

Jul 8th, 2013
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.45 KB | None | 0 0
  1. from PIL import Image
  2. from sys import argv
  3. from random import uniform
  4.  
  5. class esteganografia:
  6.  
  7.     def __init__(self, img):
  8.         try:
  9.             self.original = Image.open('./'+img).convert('RGB')
  10.             (self.w, self.h) = self.original.size
  11.             self.existeImg = True
  12.         except:
  13.             print 'No se encontro la imagen en la ruta indicada'
  14.             self.existeImg = False
  15.  
  16.     def charBinario(self, char):
  17.         num = ord(char)
  18.         return self.binario(num, 8)
  19.  
  20.     def binario(self, num, cantidad):
  21.         bits = []
  22.         for i in range(cantidad):
  23.             bits.insert(0, num % 2)
  24.             num >>= 1
  25.         return bits
  26.    
  27.     def binVal(self, nb):
  28.         m = ''.join(nb)
  29.         return int(m, 2)
  30.    
  31.     def mensajeAbits(self, mensaje):
  32.         lista = self.binario(len(mensaje), 12)
  33.         for i in mensaje:
  34.             lista += self.charBinario(i)
  35.         print len(lista)
  36.         print lista
  37.         return lista
  38.  
  39.     def bitsAmensaje(self, bits):
  40.         bloques = self.binVal(bits[0:12])
  41.         mensaje = ''
  42.         c = ''
  43.         for i in xrange(12, len(bits)):
  44.             c += bits[i]
  45.             if len(c) == 8:
  46.                 mensaje += chr(int(c, 2))
  47.                 c = ''
  48.         return mensaje
  49.            
  50.     def variableAditiva(self):
  51.         num = 1 if uniform(0,1) > 0.5 else -1
  52.         return num
  53.            
  54.     def modCanal(self, c, bit):
  55.         m = c % 2
  56.         va = self.variableAditiva()
  57.         if bit == 1:
  58.             if not(m == 0) and not(c == 0):
  59.                 c += va
  60.         elif bit == 0:
  61.             if m == 0:
  62.                 c += va
  63.         if c > 255:
  64.             c = 254
  65.         elif c < 0:
  66.             c = 1
  67.         return c
  68.    
  69.     def encriptar(self, mbit, archivo='output.png'):
  70.         if self.existeImg:
  71.             pixel = self.original.load()
  72.             destino = Image.new('RGB', (self.w, self.h))
  73.             lienzo = destino.load()
  74.             contador = 0
  75.             for x in xrange(self.w):
  76.                 for y in xrange(self.h):
  77.                     rgb = list(pixel[x, y])
  78.                     for i in xrange(len(rgb)):
  79.                         if len(mbit) > 0:
  80.                             rgb[i] = self.modCanal(rgb[i], mbit.pop(0))
  81.                     lienzo[x, y] = tuple(rgb)
  82.             destino.save(archivo)
  83.         return
  84.  
  85.     def recuperar(self):
  86.         if self.existeImg:
  87.             pixel = self.original.load()
  88.             mbits = []
  89.             bloques = 0
  90.             for x in xrange(self.w):
  91.                 for y in xrange(self.h):
  92.                     rgb = pixel[x, y]
  93.                     for c in rgb:
  94.                         if c % 2 == 0:
  95.                             mbits.append('1')
  96.                         else:
  97.                             mbits.append('0')
  98.                         if ((len(mbits)-12)/8) >= bloques and not(bloques == 0):
  99.                             return mbits
  100.                     if len(mbits) >= 12:
  101.                         if bloques == 0:
  102.                             bloques = int(''.join(mbits[0:12]),2)
  103. #                            bloques = self.binVal(mbits[0:12])
  104.         return mbits
  105.  
  106. if __name__ == '__main__':
  107.     m = raw_input('mensaje > ')
  108.     e = esteganografia('mario.png')
  109.     ct = e.mensajeAbits(m)
  110.     e.encriptar(ct)
  111.     r = esteganografia('output.png')
  112.     bits = r.recuperar()
  113.     print len(bits)
  114.     print bits
  115.     print r.bitsAmensaje(bits)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement