Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- # -*- encoding: utf-8 -*-
- # Written by kenkeiras
- #########################################################################
- # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
- # Version 2, December 2004
- #
- # Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
- #
- # Everyone is permitted to copy and distribute verbatim or modified
- # copies of this license document, and changing it is allowed as long
- # as the name is changed.
- #
- # DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
- # TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
- #
- # 0. You just DO WHAT THE FUCK YOU WANT TO.
- #########################################################################
- #
- # Convierte una tupla en un array
- def tuple2arr( t ):
- a = []
- for i in t:
- a.append( i )
- return a
- # Convierte un array en una tupla
- def arr2tuple( a ):
- t = ( )
- for i in a:
- t += ( i, )
- return t
- # Manejo de bits
- # Extrae el LSB
- def extractLSB(byt):
- result = ( byt ) % 2
- return result
- # Junta un array de bits en un byte
- def composeByte( l ):
- out = []
- i = 0
- while i <= 7:
- out.append( l[ i ] )
- i += 1
- out = chr(out[ 7 ] + out[ 6 ] * 2 + out[ 5 ] * 4 + out[ 4 ] * 8 + \
- out[ 3 ] * 16 + out[ 2 ] * 32 + out[ 1 ] * 64 + out[ 0 ] * 128 )
- return out
- # Código en si
- import sys, os
- try:
- from PIL import Image
- except:
- print >>sys.stderr, "Necesitas PIL"
- print >>sys.stderr, "[ http://www.pythonware.com/products/pil/ ]"
- exit( 0 )
- # Comprueba los argumentos
- if ( len( sys.argv ) < 3 ):
- print >>sys.stderr, sys.argv[ 0 ], "<imágen> <salida>"
- exit( 0 )
- # Intenta leer la imágen
- img = None
- try:
- img = Image.open( sys.argv[ 1 ] )
- except:
- print >>sys.stderr, "Error leyendo", sys.argv[ 1 ]
- exit( 1 )
- dim = img.size
- # Lee el archivo a introducir
- f = None
- try:
- f = open( sys.argv[ 2 ], "wb" )
- except:
- print >>sys.stderr, "Error leyendo", sys.argv[ 2 ]
- exit( 1 )
- # Carga todo en memoria ( más rápido para cambiar muchos pixels )
- fst_img = img.load( )
- inp = [] # Bits de entrada
- bpp = len( img.getbands( ) ) # Bytes por pixel
- # Mientras quede mensaje
- for y in xrange( dim[ 1 ] ):
- for x in xrange( dim[ 0 ] ):
- # Se lee la siguiente tupla
- nxt_pix = tuple2arr( fst_img[ x, y ] )
- # Para cada byte
- for i in xrange( bpp ):
- # se extrae el LSB
- inp.append( extractLSB( nxt_pix[ i ] ) )
- # Si hay para un byte
- while len( inp ) > 8:
- # Se juntan los bits y se escriben
- f.write( composeByte( inp[ : 8 ] ) )
- inp = inp[ 8 : ]
- # Mientras quede para un byte
- while len( inp ) > 8:
- f.write( composeByte( inp[ : 8 ] ) )
- inp = inp[ 8 : ]
- f.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement