思い出した...鶏卵、ブートストラップ。ソレやるか? で昨日の
> 超てきとーいいかげんにパディングを貼り付けた結果、ながいブログエントリぃー。pack / unpack の使い方もわかっ
てないし、ムダな事ばっかじゃん。と思った方は是非メンテしてやってください。
コピペして bin2png.py とかで保存した後は、こちらも昨日のイメージを保存して
とかで。$ ./bin2png.py -d patch-2.6.38.2.gz.png -o patch-2.6.38.2.gz
サイズ大きいファイルはシャレになりませんが、ブログに貼り付ける程度なら...
#!/usr/bin/python
import sys, os, math, struct
import getopt, logging
import Image
log = logging.getLogger()
def sqrint(n):
r = math.ceil(math.sqrt(n) + 0.1)
return (int(r), int(math.pow(r, 2) - n))
def encode(srcfp, dstfp):
# calc sizes
fsize = os.fstat(srcfp.fileno()).st_size
log.debug("encode size: %d" % fsize)
qfsize = fsize / 4
sides, padlen = sqrint(qfsize)
tupad = struct.unpack('BBBB', struct.pack('!L', fsize))
# create data
data = [tupad]
for i in range(qfsize):
data.append(struct.unpack('BBBB', srcfp.read(4)))
nremain = fsize % 4
data.append(struct.unpack('BBBB', srcfp.read(nremain) + '\x00' * (4 - nremain)))
data.extend(((0, 0, 0, 0),) * (padlen / 4 - 1))
# write out
im = Image.new('RGBA', (sides, sides))
im.putdata(data)
im.save(dstfp, 'PNG')
def decode(srcfp, dstfp):
im = Image.open(srcfp)
imgcore = im.getdata() # needs checking mode?
fsize = struct.unpack("!L", struct.pack("BBBB", *imgcore[0]))[0]
log.debug("decode size: %d" % fsize)
data = list(imgcore)[1:]
b = bytearray()
[b.extend(d) for d in data]
dstfp.write(b[:fsize])
def usage():
print >> sys.stderr, '''%s - convert file to png image
-e | --encode specify encoding file
-d | --decode specify decoding file
-o | --outfile stdout if not specified
-h | --help show (this) usage message
-v | --verbose set logging level to DEBUG [default is INFO]
''' % sys.argv[0]
def main():
try:
opts, args = getopt.getopt(sys.argv[1:], 'e:d:o:hv',
['encode', 'decode', 'outfile',
'help', 'verbose'])
except getopt.GetoptError, err:
log.error(err)
usage()
sys.exit(2)
isencode = False
isdecode = False
srcfp = None
# 3.0: dstfp = sys.stdout.buffer?
dstfp = os.fdopen(sys.stdout.fileno(), 'wb')
for o, a in opts:
if o in ("-h", "--help"):
usage()
sys.exit(0)
elif o in ("-v", "--verbose"):
log.setLevel(logging.DEBUG)
elif o in ("-e", "--encode"):
isencode = True
srcfp = file(a, 'rb')
elif o in ("-d", "--decode"):
isdecode = True
srcfp = file(a, 'rb')
elif o in ("-o", "--outfile"):
dstfp = file(a, 'wb')
if not (isencode ^ isdecode):
log.error("invalid action")
usage()
sys.exit(1)
isencode and encode(srcfp, dstfp)
isdecode and decode(srcfp, dstfp)
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO,
format='%(asctime)s %(levelname)s %(message)s')
main()
0 件のコメント:
コメントを投稿