這樣做的簡單方法是使用第三方圖像處理庫,如PIL/Pillow。代碼非常簡單,您可以在Image
模塊文檔的示例中在幾分鐘內找到它。...
但是,如果您不允許這樣做,那麼我們來看看如何手動執行此操作。
首先,BMP不是文本文件格式,它是二進制格式。這意味着你必須以二進制模式讀取它。而且你不能一行一行地閱讀它,因爲它沒有文本行要閱讀。由於bytes
對象不可變,因此您可能需要將其複製到bytearray
中進行處理。所以:
with open('spam.bmp', 'rb') as f:
data = bytearray(f.read())
接下來,您需要解析BMP文件格式。我假設練習的主要內容是弄清楚如何自己做,所以我會給你一個Wikipedia's article的鏈接,它比微軟的文檔描述得更好,你可以從那裏開始。
標準庫中的struct
模塊對解釋標題非常有幫助;通過讀取struct.unpack_from('<L', data, offset)
的32位小尾數比讀取data[offset]
,data[offset+1]
等更容易,並且將它們重新組合成32位數。
我猜你可以忽略所有的BMP壓縮選項 - 否則,這將是太難分配。事實上,你可能只是假設所有的頭文件都會指定最常見的變體,並且只是代碼。但你可能想問問你的老師對此有何反饋。
現在,一旦您找到了BMP的「像素陣列」部分,並且您已經想出瞭如何從DIB標題中解析該部分,則可以通過設置將像素設置爲任意位置的白色bytearray的適當索引處的值。例如,它可能會變成是簡單的:
pos = pixel_array_offset + row_size * y + pixel_size * x
data[pos:pos+3] = 255, 255, 255
最後,一旦你改變了你的紅色像素爲白色,你可以將它保存:
with open('eggs.bmp', 'wb') as f:
f.write(data)
是你應該做的這沒有使用像PIL/Pillow這樣的第三方模塊? – abarnert
顯然不是。只使用基本編碼。這是第一年cp課程分配。我試圖使用導入圖像,但這是不允許的 – amin
看看[this](http://www.python.org.br/wiki/ImagemTGA)Python程序開始 – 2013-11-29 00:16:26