2013-10-23 104 views
1

我想讀二進制文件(如.BMP或.JPG),每個二進制數據轉換爲ASCII,做乘法(如ASCII * 2)和轉化回到二進制格式並寫入一個新文件。ASCII轉換成二進制和寫入二進制文件 - Python 3.x都有

我寫的程序如下

filename = input("enter file to read: ") 
    readfile = filename + ".bmp" 
    writefilebmp = filename + '1' + ".bmp" 
    fr = open(readfile,"rb"); 
    fwbmp = open(writefilebmp,"wb"); 
    bytes_read = fr.read(1024) 
    for b in bytes_read: 
     print(b,end='') 
     data = b*2; 
     fwbmp.write(data) 
    fr.close() 
    fwbmp.close() 

,但我發現下面的錯誤

類型錯誤:「詮釋」不支持緩衝接口

注意:一旦我該溶液中,我將修改代碼跳過BMP或JPEG頭

MODIF ied

filename = input("enter file to read: ") 
    readfile = filename + ".bmp" 
    writefilebmp = filename + '1' + ".bmp" 
    fr = open(readfile,"rb"); 
    fwbmp = open(writefilebmp,"wb"); 
    bytes_read = fr.read(20) 
    for b in bytes_read: 
     print(b,end='') 
     data = b*2; 
     fwbmp.write(bytes(data)) 
    fr.close() 
    fwbmp.close() 
+1

你希望通過這樣做來達到什麼目的? –

+0

我確實有所有像素都非常接近黑色(20最大)的要求,我需要做的這個像素倍增... – Sathya

+0

這是不是東西,會使用更容易[枕頭?] (https://pypi.python.org/pypi/Pillow/2.0.0)(考慮到你正在處理圖像文件和像素數據...) –

回答

2

你正在循環字節,這會給你整數。轉換回字節以寫入二進制文件:

fwbmp.write(bytes([data % 256])) 

模256需要在此處將結果int值限制爲允許值。你也可以用min()上限在255值:

fwbmp.write(bytes([min(data, 255)])) 

,或者你可以寫字節溢出你的加倍結果:

if data > 255: 
    fwbmp.write(bytes(divmod(data, 256))) 
else: 
    fwbmp.write(bytes([data])) 

或總是產生2個字節不管,那裏的第一個字節爲0x010x00

fwbmp.write(bytes(divmod(data, 256))) 

你需要決定什麼你希望你的'加倍'意味着輸出。

+0

他們可以,但如果他們想以2倍數,254 * 2不是255也不是252 ...我不確定OP是否真的想要這樣做:P –

+0

@JonClements:不,這就是爲什麼我包含多個選項.. –

+1

後者更可能 - 這是在我的初始後一段時間評論 - 然而,如果可能的話,我們會去struct.pack'或'int.to_bytes' ...祝大家讀回可能是一個字節或兩個字節:) –