看板 Python 關於我們 聯絡資訊
下面是程式碼,問題在程式碼後 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
ya790206:附上輸出的圖檔http://ya790206.googlepages.com/123.bmp 11/05 00:31
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