国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 編程 > 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.56wlw.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;

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

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

圖片精選

国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
在线观看精品视频一区二区三区| 精品av中文字幕在线毛片| 中文字幕专区| 国产区视频在线观看| 性网站在线播放| 国产人成在线视频| 国产精品视频一区麻豆| 国产www网站| 国产黄色av免费看| 国产区视频在线| 国产一区二区三区美女秒播| 国产免费黄网站| 欧美在线中文| 开心丁香婷婷深爱五月| 超碰91在线| 国产免费自拍视频| 精品极品三级久久久久| 日本在线视频www鲁啊鲁| 五月婷婷在线观看| 亚洲精品少妇久久久久久| 国产美女高潮| 四虎成人精品在永久免费| 国产麻豆精品入口在线观看| 国产精品18久久久久久久久久| 天天插天天射| 国产porn在线| 国产农村av| 小说区乱图片区| 国产女主播在线| 国产中文字幕网| 精品av中文字幕在线毛片| av在线不卡网站| 在线国产91| av网址在线看| 91社区在线观看| 国产高清在线视频| 国产成a人亚洲精v品| 中文字幕成人乱码在线电影| 国产在线一二三区| 天堂资源在线中文| 国产小黄视频| 轻轻色免费在线视频| 96精品视频| av一本在线| wwww在线观看| 久热国产视频| 国产精选在线观看| 国产一级黄色电影| 黄色片大全在线观看| 黄色电影网站在线观看| 亚洲一本大道| 任你操视频在线观看| 日本免费黄色| 狠狠操五月天| 国产污污在线观看| 国产xxx在线| 国产日韩欧美一区二区三区视频| 久热国产在线视频| 国产毛片毛片毛片| 国产精品视频二区三区| 91欧洲在线视精品在亚洲| 国产精品麻豆一区二区三区| 国产福利在线免费观看| 91这里只有精品| www在线视频| 国产丝袜精品丝袜| 在线a人片免费观看视频| 亚洲精品在线播放视频| 成人欧美亚洲| 亚洲精品视频在线免费| 黄色国产网站在线播放| 国产精品爱久久久久久久小说| 国产精品777一区二区| 天天插天天射| 国产高潮av| 国产中文字幕av| 日韩中文字幕久久久经典网| 国产免费专区| 不卡av免费观看| 97视频免费| 国产视频一二| 免费看的毛片| 天天激情综合| 伊人永久在线| 国产三区四区在线观看| 久草在线视频网| www中文字幕在线观看| 天天av综合网| 国产美女高潮| 久久国产精品黑丝| h网址在线观看| 伊人222成人综合网| 国产日本韩国在线播放| 天堂资源最新在线| 天堂中文字幕在线| 自拍av在线| 国产一级免费黄色片| 免费午夜一级| 九九热视频在线| 欧美黑人乱大交| 青青草视频在线观看| 亚洲综合色视频在线观看| 天天操夜夜操天天射| 九九热在线视频免费观看| 日本高清不卡中文字幕| 任你操在线观看| 黄色av网址在线免费观看| 九九视频九九热| 国产一卡2卡3卡四卡网站| 国产一级性片| 国产成人久久精品77777| 精品电影在线| www.操操操| 国产中文字幕网| 国产一级片网站| 2021天堂中文幕一二区在线观| 国产不卡视频| 99爱在线观看| 国产中文在线观看| 国产网站免费观看| 亚洲天堂二区| 国产裸舞福利在线视频合集 | 懂色av一区| 国产一二三视频| 精品999视频| 天天操人人爽| 天天插天天射| 国产系列在线观看| 不卡av免费观看| 国产黄色小视频| 亚洲欧美久久婷婷爱综合一区天堂| www.色婷婷| 国产精品国产三级国产试看| wwwww亚洲| 国产黄视频在线观看| 日本a级黄色| 91激情在线| 中文字幕在线免费| 欧美黑人乱大交| 在线观看国产视频| 国产一二区视频| 黄色片视频在线观看| 在线免费国产视频| 国产丝袜在线播放| 好看的中文字幕在线播放| 国产二区视频| 国产一级免费看| 国产美女福利在线| 久久久久久久久免费视频| av福利在线| 精品久久久久一区二区三区| 五月婷婷在线观看| 国产农村一级特黄α**毛片 | 狠狠干天天爱| 热99re久久精品这里都是免费| 国产videos| 国产婷婷视频在线| 丁香花高清在线观看完整版 | 伊人影院蕉久影院在线播放| 国产写真视频在线观看| 最近中文字幕大全中文字幕免费 | 国产私拍精品| 国产无遮挡又黄又爽免费网站 | 国产视频在线播放| 国产羞羞视频在线观看| 国产美女av| 国产香蕉免费精品视频| 国产视频三区| av一本在线| 狂野欧美性猛交xxxx乱大交| jlzzjlzz欧美| 久草一本av| 国产小视频福利在线| 国产羞羞视频在线播放| 国产日本视频| 一个人看的www免费观看视频| 国产精品入口麻豆电影| 国产不卡在线| 在线播放黄色网址| 久久久久久77777| 国产精品久久久久永久免费看| 97操碰视频| 玖玖在线视频| 国产精品美女一区二区三区四区 | 中文产幕区在线观看| 四虎成年永久免费网站| 蜜桃av在线免费观看| 国产日本在线视频| 亚洲人成影院在线| 五月天婷婷基地| 国产二区在线播放| 九九热视频精品在线观看| 国产精品久久久久久久久鸭| 日本动漫同人动漫在线观看| 国产深夜视频在线观看| 免费a级在线播放| 精品电影在线| 国产一级网站视频在线| 日本精品一区二区三区在线播放| 中文字幕网站视频在线|