2013-11-29 42 views
6

我有一個bmp文件。這只是一個紅色的廣場。我必須編寫一個帶有功能的程序,使其具有白色條紋。我需要做的事情:在Python中使用.bmp文件3

  • 加載bmp文件。
  • 閱讀並評估bmp文件。
  • 對某些區域的座標進行編碼,使其顏色爲白色。
  • 關閉文件
  • 顯示終產物文件作爲輸出

我是新手,和在時遇到讀或顯示原始bmp文件,更不用說編輯裏面的內容。它與打開txt文件和「readline()」不相似。另外,當我複製粘貼bmp文件在eclipse中的pydev項目src文件夾中時,它不會在eclipse上顯示,所以我不知道計算機如何識別文件存在。我想在發佈之前閱讀它,但我似乎沒有得到太多的搜索結果,因爲我不確定我應該搜索的內容。

+1

是你應該做的這沒有使用像PIL/Pillow這樣的第三方模塊? – abarnert

+0

顯然不是。只使用基本編碼。這是第一年cp課程分配。我試圖使用導入圖像,但這是不允許的 – amin

+1

看看[this](http://www.python.org.br/wiki/ImagemTGA)Python程序開始 – 2013-11-29 00:16:26

回答

16

這樣做的簡單方法是使用第三方圖像處理庫,如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) 
+0

謝謝你。這幫了我很多。我不知道如何處理一個BMP文件。我會更多地查看二進制文件類型。 – amin