[pukiwiki]
急に、Flash(SWF)のヘッダを調べたくなったのだけれど、バイナリエディタだけだと大変なので、ビット単位で調べるための関数を書いてみました
で、そもそも、何で今更FlashをPythonでいじろうと思ったかといいますと。。。
*[[【動画】世界初 3Dデジカメ:http://www.tv-tokyo.co.jp/emorning/contents/2009-04/03/028652.html]]
こちらの立体カメラの静止画、左右2枚を ”「マウスドラッグすると微妙に向きが変わって見えるFlash」”に変換したいな、と。
(できれば、左右の画像の中割も行いたい)
[/pukiwiki]
—-
どこかで作ってた人が居たはずなのですが、ちょっと判らなかったので、自分で作ることに
ここまでで気力が尽きたので、SWFの調査はまた今度(汗
# -*- coding: utf-8 -*-
"bit.py"
def bitreader(s):
u"""文字列をビット単位で調べるためのジェネレータ"""
for i in s :
i=ord(i)
for j in xrange(8):
ret= 1 if ( i & 0x80) else 0
i<<=1
yield ret
def bit2str(blist):
bit_length=len(blist)
#print "bit_length",bit_length
byte_length=bit_length//8
#print "byte_length",byte_length
ret=[]
i=0
for i in xrange(0,byte_length*8,8):
ret.append( chr(bit2int(blist[i:i+8])))
if bit_length%8 :
remain=blist[i+8:]
#print "len(remain)",len(remain)
remain+=[0 for x in xrange(8-len(remain))]
#print "len(remain)",len(remain)
ret.append( chr(bit2int(remain)))
ret="".join(ret)
return ret
def bit2int(blist,endian="big"):
u""" bit2int([0,0,0,0, 0,0,0,0,1]) -> 1
bit2int([0,0,0,0, 0,0,0,0,1],endian="little") -> 256
"""
ret=0
blist1=list(blist[:])
if endian=="big":
blist2=blist1[:]
else:
blist2=[]
for i in xrange(0,len(blist1),8):
blist2=blist1[i:i+8]+blist2
for b in blist2:
ret<<=1
ret+=b
return ret
from math import log
def int2bit(i):
u"""int2bit(32) -> [1, 0, 0, 0, 0, 0]
i>0
"""
ret=[]
if not i :return [0,]
for j in xrange( log(i) /log(2)+1):
ret.append(1 if i& 0x01 else 0)
i>>=1
ret.reverse()
return ret
def str2int(s,endian="big"):
"str2int("\x03\x02\x01") -> 0x010203 big endian"
t=0
if endian=="big":
s=reversed(s)
for i in s:
t<<=8
t+=ord(i)
return t
if __name__=="__main__":
#ひととおり テスト
s="".join([chr(x) for x in range(255)])
bits=[x for x in bitreader(s)]
bits.append(1)
s+="\x80"
s2=bit2str(bits)
if s!=s2 :
print """
bits=[x for x in bitreader(s)]
s2=bit2str(bits]
"""
raise Exception
s2=[]
for c in s :
c2=chr(bit2int([x for x in bitreader(c)]))
if c2!=c :
print "%s"% ord(c)
raise Exception
s2.append(c2)
s2="".join(s2)
if s2!=s :
print "s2!=s"
raise Exception
blist=[x for x in bitreader(s)]
s3=[]
b2=range(8)
for i,b in enumerate(blist):
m=i%8
b2[m]=b
if m==7 :
s3.append(chr(bit2int(b2)))
s3="".join(s3)
if s3!=s :
print "s3!=s"
raise Exception
if True :
for i in xrange(65536,65536*256,65535):
if (bit2int(int2bit(i)))!=i:
print i
raise Exception
print "OK"
[pukiwiki]
*その他 関連3Dデジカメ関連
[[裸眼で立体映像を楽しむことが可能な世界初の立体3Dデジタルカメラ「FinePix Real3D」の実機を触ってきました:http://gigazine.net/index.php?/news/comments/20090326_fuji_real3dsystem/]]
—-
-[[『クラシック立体写真(ステレオカメラとステレオビュアー)の秘蔵展』:http://fujifilmsquare.jp/detail/08032802.html]]
-[[ステレオカメラ(ウィキペディア):http://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%86%E3%83%AC%E3%82%AA%E3%82%AB%E3%83%A1%E3%83%A9]]
-[[私が所有しているステレオカメラの色々について(Yossy’s World):http://ww2.tiki.ne.jp/~yossy/main1.html]]
こういうレトロなデザインを期待してたので、ちょっと違ったかなー
ただ、こういうキワモノは、売ってるときに買わないと、次はいつ製品化されるか判らないので、一応、定額給付金を貯金しておくことに(をぃ
でも、定額給付金に、どれぐらい足せば買えるのかしらん?あまり高いと買えない。。。
*写真の寿命はOSよりも長い
“ちなみに、3Dデジタルカメラで記録された3D映像のファイルは独自形式となる。
[[ITmedia:http://plusd.itmedia.co.jp/lifestyle/articles/0809/24/news100.html]]
それは激しく抗議したいかも
JPEG2枚使って、関連付けデータはコメントとして記録すれば十分なのではないかしらん?
将来、OSが変わって、ドライバなどのソフトが使えなくなって、写真データが扱えなくなったら困っちゃいますし。
HDRイメージに変換できるRAWフォーマットなどが使えるなら、それはそれでうれしいですが。
[/pukiwiki]