作者ya790206 (残云夺月)
看板Python
标题[问题] 有关写档的问题
时间Mon Nov 5 00:25:55 2007
下面是程式码,问题在程式码後
def byteToInt(data):
sum=0
k=0
for i in data:
sum+=ord(i)*pow(2,k)
k+=8
return sum
def intToByte(data):
string=''
while data!=0:
string+=chr(data%256)
data/=256
return string
fileName=raw_input()
ftr=open(fileName,"rb")
BMPData=ftr.read()
ftr.close()
position=[0,2,6,8,10,14,18,22,26,28,30,34,38,42,46,50,54]
i=0
BMPHeader=[]
while i<len(position)-1:
BMPHeader.append(byteToInt(BMPData[position[i]:position[i+1]]))
i+=1
space=4-((3*BMPHeader[6])%4);
if space==4:
space=0
i=54
j=-1
k=0
pixel=[]
while i<len(BMPData):
if k==0:
pixel.append([])
j+=1
pixel[j].append(byteToInt(BMPData[i:i+3]))
i+=3
k+=1
if k==BMPHeader[6]:
k=0
i+=space
ftr=open("123.bmp",'w')
k=0
for i in BMPData:
ftr.write(i)
for i in pixel:
for j in i:
ftr.write(intToByte(j))
print [(intToByte(j))]
k+=1
if space!=0:
ftr.write('\x00'*space)
print [('\x00'*space)]
ftr.close()
以这个图档为例
http://ya790206.googlepages.com/12.bmp
他的pixel data应该是
06 12 0F 06 12 0F 00 00
06 12 0F 06 12 0F 00 00
而这程式的萤幕输出亦为如此
可是他写到档案里面的却是
06 12 0F 06 12 0F 00 00
06 12 0F 06 12 0F 00 00
06 12 0F 06 12 0F 00 00
06 12 0F 06 12 0F 00 00
为啥他会重覆输入??
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.120.222.46
2F:→ Lucemia:for i in BMPData: 11/05 02:17
3F:→ Lucemia:那行看起来有可能有问题 11/05 02:17
4F:→ Lucemia:btw .. 你要不要说说看想要做什麽? 11/05 02:17
5F:→ Lucemia:这code看起来有恐怖到 11/05 02:17
6F:推 Tiberius:处理二元资料请善用 struct 模组 ... 11/05 02:20
7F:→ Tiberius:你 BMPData 写了一次, 後面又写了一次吧 11/05 02:22
8F:推 ya790206:这程式只是读入BMP的HEADER和pixel data,之後再写入别的 11/05 10:19
9F:→ ya790206:档案。还有要怎样才不会让自己的程式码看起来不会恐怖? 11/05 10:20
10F:推 yungyuc:如果不是作业的话,拉 PIL 来用就不恐怖了 (误 11/05 12:26
11F:推 ya790206:可是用PIL就不刺激了XD(这不是作业) 11/05 14:16
12F:→ ya790206:感谢Tiberius建议,我刚看了一下struct模组,的确很方便 11/05 14:27
13F:→ ya790206:突然发现,我不会用struct模组...,要怎麽用才能达到我定 11/05 14:43
14F:→ ya790206:义的byteToInt功能? 11/05 14:44
15F:→ ya790206:我知道了,我用反了XD 11/05 14:46