何杰 王大立
摘要:在化工仿真中,為了貼近真實(shí),可以將實(shí)物圖片貼于所繪化工單元設(shè)備、管道、框架、廠房等結(jié)構(gòu)體表面。BMP圖像可被用作紋理圖。依據(jù)圖像顏色點(diǎn)陣數(shù)據(jù)(WinHex),編寫(xiě)相關(guān)程序可對(duì)位圖進(jìn)行像素級(jí)編輯,實(shí)現(xiàn)如顏色拾取、圖片移動(dòng)、旋轉(zhuǎn)、翻轉(zhuǎn)、鏡像、摳圖等變換操作。作者編寫(xiě)了位圖旋轉(zhuǎn)變換操作程序 (Visual C++,OpenGL),為將計(jì)算機(jī)圖形學(xué)編程用于化工仿真、虛擬現(xiàn)實(shí)進(jìn)行了應(yīng)用基礎(chǔ)研究;在程序for循環(huán)主代碼中,用“fread(&pixVal, sizeof(BYTE), 1, fp);”讀數(shù)據(jù),用“fwrite(&pixVal, sizeof(BYTE), 1, pFile);”寫(xiě)數(shù)據(jù)。其基本操作過(guò)程與手工刺繡或搭積木類似。讓計(jì)算機(jī)程序組織那些像素點(diǎn)“對(duì)號(hào)入座”,有秩序地從原圖像素網(wǎng)格中取出一個(gè)個(gè)像素單元格,再有秩序地放入變換后圖像像素網(wǎng)格中,實(shí)現(xiàn)預(yù)想像素級(jí)圖像變換操作。
關(guān)鍵詞:圖形學(xué)編程;位圖旋轉(zhuǎn);像素讀寫(xiě);位圖;化工仿真;虛擬現(xiàn)實(shí)
中圖分類號(hào):TN919.8? ? ?文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2021)25-0004-03
在化工設(shè)計(jì)中,常用制圖軟件是AutoCAD, 3DS MAX, SOLIDWORKS, SketchUp等。這些軟件基本共同使用方法是主要通過(guò)操作鼠標(biāo)、鍵盤(pán)直接在電腦屏幕上繪制出各種圖元,即點(diǎn)、線、面、體,再排列、組合,得到特定組合結(jié)構(gòu)、形體、場(chǎng)景,所見(jiàn)即所得。另一區(qū)別制圖方法是,編寫(xiě)、運(yùn)行計(jì)算機(jī)制圖程序,生成目標(biāo)圖形、場(chǎng)景。兩者各有優(yōu)劣。在虛擬現(xiàn)實(shí)中,需要展現(xiàn)真實(shí)感圖形、場(chǎng)景、實(shí)現(xiàn)人機(jī)交互、動(dòng)畫(huà)、視圖旋轉(zhuǎn)、漫游、科學(xué)計(jì)算可視化、仿真實(shí)驗(yàn)等,后者對(duì)這些提供了可能,而且實(shí)現(xiàn)起來(lái)便捷、高效,程序運(yùn)行流暢、穩(wěn)定[1-6]。它在虛擬現(xiàn)實(shí)、化工仿真中獨(dú)樹(shù)一幟,不容小覷??伤壳安⒉粸榛I(yè)人員所普遍知曉,也很少被使用。
紋理映射允許把一個(gè)現(xiàn)實(shí)場(chǎng)景圖貼于3D結(jié)構(gòu)體表面,更逼真,在虛擬現(xiàn)實(shí)(VR)場(chǎng)景模擬中作用突出。使用OpenGL (Open Graphics Library) 編程接口,能夠增強(qiáng)三維場(chǎng)景真實(shí)性。OpenGL提供了位圖操作函數(shù)。它是被用于渲染2D、3D矢量圖形、跨語(yǔ)言、跨平臺(tái)的應(yīng)用程序編程接口。實(shí)現(xiàn)用C++結(jié)合OpenGL制作出一個(gè)虛擬化工廠,類似使用AutoCAD Plant 3D,可以考慮先用C++結(jié)合OpenGL繪制出化工3D圖形結(jié)構(gòu)單元。然而,相比一般3D建模軟件,OpenGL并非卓爾不群,自成一格。將OpenGL與一般3D建模軟件結(jié)合起來(lái),相輔相成,更行之有效。柳暗花明又一村,原來(lái),由于OpenGL是圖形底層圖形庫(kù),沒(méi)有提供幾何實(shí)體圖元,不能被直接用以描述場(chǎng)景。但是,通過(guò)一些轉(zhuǎn)換程序,可以很方便地提取出自AutoCAD, 3DS MAX, SOLIDWORKS等的DXF, 3DS, OBJ, STL模型文件OpenGL頂點(diǎn)數(shù)組,進(jìn)而對(duì)其再處理[7-9]。
宋葉未等[10]對(duì)BMP格式位圖文件結(jié)構(gòu)和內(nèi)容進(jìn)行了詳細(xì)分析,給出了一種通用、易于移植的BMP格式位圖文件顯示算法。尹航等[11]討論了在VS2005環(huán)境下借助OpenGL和第三方庫(kù)CxImage,利用PNG圖片進(jìn)行紋理映射。CxImage類庫(kù)是一個(gè)優(yōu)秀圖像操作類庫(kù),可以被用來(lái)快捷存取、顯示、轉(zhuǎn)換各種圖像。薛兆井等[12]研究了基于OpenGL讀取bmp圖像實(shí)現(xiàn)紋理映射的一種新方法。韓姣[13]探討了在VC++環(huán)境下BMP與GIF圖像文件格式轉(zhuǎn)換,編程實(shí)現(xiàn)了BMP圖像讀取、顯示和保存等相關(guān)操作。本文作者用C++結(jié)合OpenGL編寫(xiě)了計(jì)算機(jī)程序,實(shí)現(xiàn)了位圖旋轉(zhuǎn)變換操作。
1 Bitmap-File解析
BMP文件由文件頭 (bitmap-file header)、信息頭 (bitmap-information header)、彩色表 (color table) 和位圖數(shù)據(jù) (bitmap data) 四部分組成。如圖1a所示,點(diǎn) (0,0) 和點(diǎn) (514,0) 在其圖像數(shù)據(jù)表中對(duì)應(yīng)No. 267289 pixel, No. 267803 pixel。其間點(diǎn)數(shù)是(267803-267289)+1=515 points,與例圖寬515 pixels吻合。在圖像數(shù)據(jù)表末,自左向右“F6 F6F6”分別表示該像素顏色BGR值,對(duì)應(yīng)原圖10進(jìn)制RGB分量, “246 246 246”,一致。如圖1b所示,隨意指定原圖中一點(diǎn) (45,194),檢索到該點(diǎn)在圖像數(shù)據(jù)表中相應(yīng)位置。
2 4 Bytes對(duì)齊問(wèn)題
BMP文件有個(gè)重要特性是對(duì)于圖像數(shù)據(jù)區(qū)域,位圖每一行像素所占Byte數(shù)必須被4整除,否則,在該位圖每一行16進(jìn)制碼末尾補(bǔ)1至3 Bytes “00”。“補(bǔ)零”只針對(duì)位圖寬檢驗(yàn)。要行補(bǔ)位是因?yàn)?2位Windows操作系統(tǒng)4-Bytes (32位) 處理速度較快。一個(gè)掃描行所占Byte數(shù):(biwidth*biBitCount/8+3)/4*4或(biWidth*biBitCount+31)/32*4或((width*biBitCount+31) >> 5)<< 2。其中,如圖1,其每行數(shù)據(jù)大小為515 pixels×3 Bytes/pixel = 1545 Bytes,不能被4整除,用“000000”補(bǔ)全,變?yōu)?548 Bytes ((515*24+31)/32*4=1548)。第515列為行補(bǔ)位列。同樣,VC++程序讀入BMP圖像,必須把每行Byte數(shù)轉(zhuǎn)換為4整數(shù)倍 (即以long為單位)。
biWidth 圖像寬度,以pixel為單位。
biBitCount bits/pixel
biWidth*biBitCount 一行所占位數(shù)