由於要開始學習影象方面的知識,讀寫是難免的。對的結構有一定的了解對理解儲存還是很有幫助的。由於實驗的**是用 python 寫的,因此讀取檔案就直接使用 python 了,雖然用 c 來讀寫檔案更有效率,但我個人感覺 python 也沒有很慢。下面來看一下bmp 檔案結構和讀取 bmp 檔案的過程。
用**形式可以表示為:
首先來看檔案頭的資訊(14位元組):
然後是點陣圖資訊圖(40位元組):
一般情況下,到這裡我們就可以得到這個的基本資訊了。由於調色盤是不確定的,而且現在的bmp一般都沒有調色盤資訊(因為24位),所以忽略第三個。
所以,思路還是很簡單的。先讀取 54 位元組的標頭檔案,利用讀取的寬和高資訊,對後面的資料進行讀取。
注意:由於是以二進位制形式進行讀取的,因此,需要注意儲存方式。bmp 檔案的儲存方式是小端方式,讀取的時候也要使用小端法進行解析
# -*- coding: utf-8 -*-
from struct import unpack
# 讀取並儲存 bmp 檔案
class readbmpfile :
def __init__(self, filepath) :
file = open(filepath, "rb")
# 讀取 bmp 檔案的檔案頭 14 位元組
self.bftype = unpack("這裡,讀取完檔案後,我又將 r、g、b 三個通道的數值分出來了。主要是為了方便後續的處理,畢竟讀取檔案的目的是為了後面對影象的處理。
這是乙個類,外部**可以這樣呼叫:
import numpy as np
import sys
from readbmpfile import readbmpfile
import cv2
# 命令列傳入的檔案路徑
filepath = sys.argv[1]
# 讀取 bmp 檔案
bmpfile = readbmpfile(filepath)
# r, g, b 三個通道 [0, 255]
r = bmpfile.r
g = bmpfile.g
b = bmpfile.b
# 顯示影象
b = np.array(b, dtype = np.uint8)
g = np.array(g, dtype = np.uint8)
r = np.array(r, dtype = np.uint8)
merged = cv2.merge([b, g, r]) #合併r、g、b分量 預設順序為 b、g、r
cv2.imshow("merged",merged)
bmp檔案格式詳解(bmp fileformat)
簡單bmp處理工具——python實現
Bmp格式與程式設計讀取解析
影象載入函式,通過bmp路徑,載入影象資料,通過類建構函式來實現。digitalimage digitalimage lpctstr lpszpath 為位 件頭分配空間,並初始化為0 m lpbmpfileheader lpbitmapfileheader new byte sizeof bitm...
php 加密cer php 讀取並解析 cer檔案
我有乙個證書 cer 我必須閱讀該證書的基本資訊,例如到期日期.我用php編寫了這段 class firmaelectronica public function abrircertificado path cert content file get contents path res openss...
Jquery讀取Json並解析
客戶端訪問伺服器後action中的 description 根據父親id獲取子選單列表 public actionresult getsubmenuitem int parentid var json from submenu in u.menupermissions where submenu.p...