亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Delphi > 正文

Delphi使用OpenGL2d繪圖之畫圖片Bmp的方法

2020-01-31 20:51:42
字體:
來源:轉載
供稿:網友

一、前言:

對于Delphi來說,要畫圖片要先處理一下,需要引用別的單元,而Delphi中沒帶,需要另外下載Gl.pas。網上常見自帶的OpenGl單元封裝的是1.0版的,有此函數未聲明。網上可以找到Gl.pas單元。另外需要一個Glaux.pas單元與glaux.dll,是輔助庫。在本文最后會提供下載。

二、實現流程:

繪畫圖片需要以下幾個流程。Window本身的繪圖是以位圖為基礎的,png,jpg等,繪畫時,可以轉為bmp再畫。

1.加載bmp圖片:使用auxDIBImageLoadA或其他函數

2.轉換為紋理:glGenTextures -> glBindTexture -> glTexImage2D, glTexParameteri用于設置相關參數

3.繪制紋理:glBindTexture -> glBegin(GL_QUADS) -> glTexCoord2f -> glVertex2f -> glEnd

三、利用glDrawPixels函數繪圖

glDrawPixels共有如下5個參數:

width: 表圖像的寬度
height: 表圖像的高度
format:表圖像的數據存儲格式
atype: 未知
pixels: DIB數據的指針

示例代碼如下:

procedure TForm1.Draw;var Bmp: TBitmap;begin Bmp := TBitmap.Create; Bmp.LoadFromFile(ExtractFilePath(ParamStr(0)) + '1.bmp'); // 清空緩沖區 glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // TBitmap的圖像數據在內存中是按行倒序連續存放的,通過TBitmap.ScanLine[TBitmap.Height-1]可以取得首地址即圖像緩沖區地址 // bmp圖片的顏色是按b g r存儲的,所以要選 GL_BGR_EXT做為參數 glDrawPixels(Bmp.Width, Bmp.Height, GL_BGR_EXT, GL_UNSIGNED_BYTE, Bmp.ScanLine[Bmp.Height - 1]); SwapBuffers(FDC); Bmp.Free;end;

用以上方法繪制圖片不需要啟用紋理映射,可以通過glPixelZoom函數來縮放圖片,顯示位置在窗口的左下角(暫時不知道如何改變圖像位置。)

三、使用紋理繪圖

想要按制圖片的顯示位置與放大縮小,可以用以下方法。

1.按流程,我們先把圖片加載到程序里,獲取相關的圖片信息。

將圖片加載到紋理中,可參考本站://www.49028c.com/article/52125.htm

在delphi中加載一張位圖是很簡單的,可以通過以下方式加載:

(1)通過輔助庫的auxDIBImageLoadA函數加載圖片,返回是一個PTAUX_RGBImageRec數據指針,DIB數據格式為RGB。

 // RGB數據的結構體 TAUX_RGBImageRec = record  sizeX, sizeY: GLint;  data: pointer; end; PTAUX_RGBImageRec = ^TAUX_RGBImageRec;var p: PTAUX_RGBImageRec;begin p := auxDIBImageLoadA(PAnsiChar(ExtractFilePath(ParamStr(0)) + '1.bmp')); // p 怎么釋放? Dispose與Freemem都無法操作這個指針end;

(2)通過TBitmap.LoadFromFile加載圖片。Delphi自帶,從效率上對比,與auxDIBImageLoadA性能是一樣的,但DIB數據格式為BGR,DIB指針為TBitmap.ScanLine[Bmp.Height - 1]

var Bmp: TBitmap;begin Bmp := TBitmap.Create; TBitmap.LoadFromFile(ExtractFilePath(ParamStr(0)) + '1.bmp'); // do something // 用完釋放 Bmp.Free;end;

2.創建紋理,其中的glGenTextures與glBindTexture,在Gl.pas中。

 // 創建紋理區域 glGenTextures(1, @texture); // 綁定紋理區域 glBindTexture(GL_TEXTURE_2D, texture); // 使用位圖創建圖像紋理 glTexImage2D(  GL_TEXTURE_2D,      // 紋理是一個2D紋理 GL_TEXTURE_2D  0,            // 圖像的詳細程度 默認 0  3,            // 數據的成分數。因為圖像是由紅,綠,藍三種組成 默認3  Bmp.Width,        // 紋理的寬度  Bmp.Height,        // 紋理的高度  0,            // 邊框的值 默認 0  GL_BGR_EXT,        // 數據格式 bmp使用 bgr  GL_UNSIGNED_BYTE,     // 組成圖像的數據是無符號字節類型的  Bmp.ScanLine[Bmp.Height - 1] // DIB數據指針 ); // 下面兩行是讓opengl在放大原始的紋理大(GL_TEXTURE_MAG_FILTER)或縮小原始紋理(GL_TEXTURE_MIN_FILTER)時OpenGL采用的濾波方式。 // GL_LINEAR 使用線性濾波,可以把圖片處理處平滑,但需要更多的內存與CPU glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // 線形濾波 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // 線形濾波

3.繪制紋理

繪制紋理之前,必須通知OpenGL開啟紋理映射glEnable(GL_TEXTURE_2D)。開啟后,非紋理的繪制將不起作用。用完記得關閉就可以了。

 // 以下是繪圖,利用一個四邊形,繪制圖片 // 啟用紋理映射 if glIsEnabled(GL_TEXTURE_2D) = 0 then  glEnable(GL_TEXTURE_2D); // 清空緩沖區 glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);  l := 10; t := 10; w := 200; // 放大為200*200的圖片 // 選擇紋理 如果場景中使用多個紋理,不能在glBegin() 和 glEnd() 之間綁定紋理 glBindTexture(GL_TEXTURE_2D, texture); glBegin(GL_QUADS); // glTexCoord2f 的第一個參數是X坐標。 // 0.0是紋理的左側。 0.5是紋理的中點, 1.0是紋理的右側。 // glTexCoord2f 的第二個參數是Y坐標。 // 0.0是紋理的底部。 0.5是紋理的中點, 1.0是紋理的頂部。 glTexCoord2f(0, 1); glVertex2f(l, t); glTexCoord2f(1, 1); glVertex2f(l + w, t); glTexCoord2f(1, 0); glVertex2f(l + w, t + w); glTexCoord2f(0, 0); glVertex2f(l, t + w); glEnd();

以上的繪制就結束了,以下是Draw中完整的代碼,可以不引用輔助庫Glaux.pas

procedure TForm1.Draw;var Bmp: TBitmap; texture: GLuint; l, t, w: Integer;begin Bmp := TBitmap.Create; Bmp.LoadFromFile(ExtractFilePath(ParamStr(0)) + '1.bmp'); // 創建紋理區域 glGenTextures(1, @texture); // 綁定紋理區域 glBindTexture(GL_TEXTURE_2D, texture); // 使用位圖創建圖像紋理 glTexImage2D(  GL_TEXTURE_2D,      // 紋理是一個2D紋理 GL_TEXTURE_2D  0,            // 圖像的詳細程度 默認 0  3,            // 數據的成分數。因為圖像是由紅,綠,藍三種組成 默認3  Bmp.Width,        // 紋理的寬度  Bmp.Height,        // 紋理的高度  0,            // 邊框的值 默認 0  GL_BGR_EXT,        // 數據格式 bmp使用 bgr  GL_UNSIGNED_BYTE,     // 組成圖像的數據是無符號字節類型的  Bmp.ScanLine[Bmp.Height - 1] // DIB數據指針 ); // 下面兩行是讓opengl在放大原始的紋理大(GL_TEXTURE_MAG_FILTER)或縮小原始紋理(GL_TEXTURE_MIN_FILTER)時OpenGL采用的濾波方式。 // GL_LINEAR 使用線性濾波,可以把圖片處理處平滑,但需要更多的內存與CPU glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // 線形濾波 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // 線形濾波 // 以下是繪圖,利用一個四邊形,繪制圖片 // 啟用紋理映射 if glIsEnabled(GL_TEXTURE_2D) = 0 then  glEnable(GL_TEXTURE_2D); // 清空緩沖區 glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);  l := 10; t := 10; w := 200; // 放大為200*200的圖片 // 選擇紋理 如果場景中使用多個紋理,不能在glBegin() 和 glEnd() 之間綁定紋理 glBindTexture(GL_TEXTURE_2D, texture); glBegin(GL_QUADS); // glTexCoord2f 的第一個參數是X坐標。 // 0.0是紋理的左側。 0.5是紋理的中點, 1.0是紋理的右側。 // glTexCoord2f 的第二個參數是Y坐標。 // 0.0是紋理的底部。 0.5是紋理的中點, 1.0是紋理的頂部。 glTexCoord2f(0, 1); glVertex2f(l, t); glTexCoord2f(1, 1); glVertex2f(l + w, t); glTexCoord2f(1, 0); glVertex2f(l + w, t + w); glTexCoord2f(0, 0); glVertex2f(l, t + w); glEnd(); Bmp.Free; SwapBuffers(FDC);end;

本實例完整代碼可點此下載。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品美女999| 欧美性生活大片免费观看网址| 欧美黑人性猛交| 97国产真实伦对白精彩视频8| 精品中文字幕久久久久久| 欧美裸体视频网站| 亚洲最新av网址| 精品人伦一区二区三区蜜桃网站| 国产欧美一区二区三区在线| 国产精品男女猛烈高潮激情| 亚洲美女av电影| 国产精品极品美女在线观看免费| 欧洲中文字幕国产精品| 亚洲高清久久网| 国产精品免费看久久久香蕉| 日韩欧美精品网址| 国产网站欧美日韩免费精品在线观看| 亚洲欧美一区二区三区情侣bbw| 日韩欧美在线免费| 亚洲白虎美女被爆操| 久久久久久久激情视频| 黑人极品videos精品欧美裸| 成人黄色片在线| 欧美极品美女电影一区| 欧美激情按摩在线| 综合av色偷偷网| 精品国产成人av| 久久久久久久久久久免费精品| 成人夜晚看av| 国产综合久久久久久| 国产精品r级在线| 伊人久久免费视频| 永久免费精品影视网站| 91欧美精品午夜性色福利在线| 亚洲精品久久久久中文字幕欢迎你| 欧美性猛交xxxx乱大交蜜桃| 中日韩美女免费视频网址在线观看| 国产成人涩涩涩视频在线观看| 久久影院资源网| 精品国产福利视频| 国产精品久久久久av免费| 亚洲国产一区二区三区四区| 亚洲成人久久一区| 91久久国产精品| 久久黄色av网站| 国模叶桐国产精品一区| 久久久久久久久91| 97超级碰在线看视频免费在线看| 国产成人在线精品| 国产亚洲aⅴaaaaaa毛片| 成人亚洲综合色就1024| 久久99久久久久久久噜噜| 最近的2019中文字幕免费一页| 亚洲精品狠狠操| 成人黄色av网站| 上原亚衣av一区二区三区| 亚洲免费一在线| 中文字幕一精品亚洲无线一区| 成人黄色片在线| 国产在线a不卡| 欧美日韩亚洲视频| 久久精品久久久久电影| 国产精品美女久久久免费| 国产又爽又黄的激情精品视频| 亚洲精品98久久久久久中文字幕| 美女视频黄免费的亚洲男人天堂| 欧美日韩中国免费专区在线看| 成人网在线免费观看| 青青草原成人在线视频| 日韩经典一区二区三区| 亚洲国产成人精品一区二区| 日本久久久久久久久久久| 亚洲精品久久久久久久久久久久久| 国产欧美精品一区二区| 亚洲欧洲美洲在线综合| 伊人av综合网| 不卡中文字幕av| 91在线视频免费| 国产一区二区在线免费| 韩剧1988免费观看全集| 国产精品视频播放| 日本欧美国产在线| 欧美激情一区二区三区在线视频观看| 日韩一级黄色av| 国产999精品视频| 懂色av影视一区二区三区| 欧美精品在线播放| 97久久久久久| 懂色av一区二区三区| 国产亚洲欧美日韩精品| 88xx成人精品| 亚洲午夜性刺激影院| 成人黄色激情网| 国产成人精品一区二区在线| 亲子乱一区二区三区电影| 亚洲国产欧美一区| 日韩av电影国产| 亚洲美腿欧美激情另类| 久久人人爽国产| 久久99精品久久久久久琪琪| 精品小视频在线| 欧美成人h版在线观看| 久久久亚洲欧洲日产国码aⅴ| 97在线观看视频国产| 91爱视频在线| 国产一区二区免费| 久久精品久久久久久| 久久久噜噜噜久噜久久| 欧美日韩精品中文字幕| 伊人久久五月天| 亚洲一区精品电影| 久久久精品网站| 亚洲欧洲在线播放| 国模叶桐国产精品一区| 国语自产精品视频在线看抢先版图片| 亚洲最大av网| 日韩中文在线中文网三级| 91性高湖久久久久久久久_久久99| 亚洲香蕉伊综合在人在线视看| 久久精品国产综合| 91久久国产精品| 狠狠躁夜夜躁人人躁婷婷91| 狠狠综合久久av一区二区小说| 亚洲国产精品va在看黑人| 国产精品久久国产精品99gif| 国产午夜精品美女视频明星a级| 大量国产精品视频| 国产精品人成电影| 欧美成人四级hd版| 欧美中文在线视频| 久久免费视频在线| 91精品国产高清久久久久久91| 久久久久久网址| 在线午夜精品自拍| 97avcom| 欧美天天综合色影久久精品| 91色p视频在线| 欧美视频专区一二在线观看| 国产精品美女久久久久久免费| 日韩精品有码在线观看| 69av在线视频| 91久久久久久久久久久| 久久亚洲国产精品| 国产精品嫩草影院一区二区| 高跟丝袜一区二区三区| 日本午夜人人精品| 久热99视频在线观看| 亚洲xxxx妇黄裸体| 国产精品视频最多的网站| 日韩亚洲欧美中文高清在线| 亚洲精品www久久久| 久久久久久亚洲| 国产精品黄色影片导航在线观看| 色综合影院在线| 国产成人精品视| 国产日韩专区在线| 欧美特黄级在线| 日韩精品亚洲元码| 国产精品嫩草视频| 亚洲free性xxxx护士白浆| 57pao国产成人免费| 九九九热精品免费视频观看网站| 午夜精品视频在线| 欧美日韩免费区域视频在线观看|