作者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
→ Lucemia:for i in BMPData: 11/05 02:17
→ Lucemia:那行看起來有可能有問題 11/05 02:17
→ Lucemia:btw .. 你要不要說說看想要做什麼? 11/05 02:17
→ Lucemia:這code看起來有恐怖到 11/05 02:17
推 Tiberius:處理二元資料請善用 struct 模組 ... 11/05 02:20
→ Tiberius:你 BMPData 寫了一次, 後面又寫了一次吧 11/05 02:22
推 ya790206:這程式只是讀入BMP的HEADER和pixel data,之後再寫入別的 11/05 10:19
→ ya790206:檔案。還有要怎樣才不會讓自己的程式碼看起來不會恐怖? 11/05 10:20
推 yungyuc:如果不是作業的話,拉 PIL 來用就不恐怖了 (誤 11/05 12:26
推 ya790206:可是用PIL就不刺激了XD(這不是作業) 11/05 14:16
→ ya790206:感謝Tiberius建議,我剛看了一下struct模組,的確很方便 11/05 14:27
→ ya790206:突然發現,我不會用struct模組...,要怎麼用才能達到我定 11/05 14:43
→ ya790206:義的byteToInt功能? 11/05 14:44
→ ya790206:我知道了,我用反了XD 11/05 14:46