锘??xml version="1.0" encoding="utf-8" standalone="yes"?> http://blog.csdn.net/ghost129/archive/2009/08/04/4409565.aspx BMP鏂囦歡鏄竴縐嶅儚绱犳枃浠訛紝瀹冧繚瀛樹簡涓騫呭浘璞′腑鎵鏈夌殑鍍忕礌銆傝繖縐嶆枃浠舵牸寮忓彲浠ヤ繚瀛樺崟鑹蹭綅鍥俱?6鑹叉垨256鑹茬儲寮曟ā寮忓儚绱犲浘銆?4浣嶇湡褰╄壊鍥捐薄錛屾瘡縐嶆ā寮忕鍗曚竴鍍忕礌鐨勫ぇ灝忓垎鍒負1/8瀛楄妭錛?/2瀛楄妭錛?瀛楄妭鍜?瀛楄妭銆傜洰鍓嶆渶甯歌鐨勬槸256鑹睟MP鍜?4浣嶈壊BMP銆傝繖縐嶆枃浠舵牸寮忚繕瀹氫箟浜嗗儚绱犱繚瀛樼殑鍑犵鏂規硶錛屽寘鎷笉鍘嬬緝銆丷LE鍘嬬緝絳夈傚父瑙佺殑BMP鏂囦歡澶у鏄笉鍘嬬緝鐨勩?br>榪欓噷涓轟簡綆鍗曡搗瑙侊紝鎴戜滑浠呰璁?4浣嶈壊銆佷笉浣跨敤鍘嬬緝鐨凚MP銆傦紙濡傛灉浣犱嬌鐢╓indows鑷甫鐨勭敾鍥劇▼搴忥紝寰堝鏄撶粯鍒跺嚭涓涓鍚堜互涓婅姹傜殑BMP錛?br>Windows鎵浣跨敤鐨凚MP鏂囦歡錛屽湪寮濮嬪鏈変竴涓枃浠跺ご錛屽ぇ灝忎負54瀛楄妭銆備繚瀛樹簡鍖呮嫭鏂囦歡鏍煎紡鏍囪瘑銆侀鑹叉暟銆佸浘璞″ぇ灝忋佸帇緙╂柟寮忕瓑淇℃伅錛屽洜涓烘垜浠粎璁ㄨ24浣嶈壊涓嶅帇緙╃殑BMP錛屾墍浠ユ枃浠跺ご涓殑淇℃伅鍩烘湰涓嶉渶瑕佹敞鎰忥紝鍙湁“澶у皬”榪欎竴欏瑰鎴戜滑姣旇緝鏈夌敤銆傚浘璞$殑瀹藉害鍜岄珮搴﹂兘鏄竴涓?2浣嶆暣鏁幫紝鍦ㄦ枃浠朵腑鐨勫湴鍧鍒嗗埆涓?x0012鍜?x0016錛屼簬鏄垜浠彲浠ヤ嬌鐢ㄤ互涓嬩唬鐮佹潵璇誨彇鍥捐薄鐨勫ぇ灝忎俊鎭細 54涓瓧鑺備互鍚庯紝濡傛灉鏄?6鑹叉垨256鑹睟MP錛屽垯榪樻湁涓涓鑹茶〃錛屼絾24浣嶈壊BMP娌℃湁榪欎釜錛屾垜浠繖閲屼笉鑰冭檻銆傛帴涓嬫潵灝辨槸瀹為檯鐨勫儚绱犳暟鎹簡銆?4浣嶈壊鐨凚MP鏂囦歡涓紝姣忎笁涓瓧鑺傝〃紺轟竴涓儚绱犵殑棰滆壊銆?br>娉ㄦ剰錛孫penGL閫氬父浣跨敤RGB鏉ヨ〃紺洪鑹詫紝浣咮MP鏂囦歡鍒欓噰鐢˙GR錛屽氨鏄錛岄『搴忚鍙嶈繃鏉ヤ簡銆?br>鍙﹀闇瑕佹敞鎰忕殑鍦版柟鏄細鍍忕礌鐨勬暟鎹噺騫朵笉涓瀹氬畬鍏ㄧ瓑浜庡浘璞$殑楂樺害涔樹互瀹藉害涔樹互姣忎竴鍍忕礌鐨勫瓧鑺傛暟錛岃屾槸鍙兘鐣ュぇ浜庤繖涓箋傚師鍥犳槸BMP鏂囦歡閲囩敤浜嗕竴縐?#8220;瀵歸綈”鐨勬満鍒訛紝姣忎竴琛屽儚绱犳暟鎹殑闀垮害鑻ヤ笉鏄?鐨勫嶆暟錛屽垯濉厖涓浜涙暟鎹嬌瀹冩槸4鐨勫嶆暟銆傝繖鏍蜂竴鏉ワ紝涓涓?7*15鐨?4浣岯MP澶у皬灝卞簲璇ユ槸834瀛楄妭錛堟瘡琛?7涓儚绱狅紝鏈?1瀛楄妭錛岃ˉ鍏呬負52瀛楄妭錛屼箻浠?5寰楀埌鍍忕礌鏁版嵁鎬婚暱搴?80錛屽啀鍔犱笂鏂囦歡寮濮嬬殑54瀛楄妭錛屽緱鍒?34瀛楄妭錛夈傚垎閰嶅唴瀛樻椂錛屼竴瀹氳灝忓績錛屼笉鑳界洿鎺ヤ嬌鐢?#8220;鍥捐薄鐨勯珮搴︿箻浠ュ搴︿箻浠ユ瘡涓鍍忕礌鐨勫瓧鑺傛暟”鏉ヨ綆楀垎閰嶇┖闂寸殑闀垮害錛屽惁鍒欐湁鍙兘瀵艱嚧鍒嗛厤鐨勫唴瀛樼┖闂撮暱搴︿笉瓚籌紝閫犳垚瓚婄晫璁塊棶錛屽甫鏉ュ悇縐嶄弗閲嶅悗鏋溿?br>涓涓緢綆鍗曠殑璁$畻鏁版嵁闀垮害鐨勬柟娉曞涓嬶細 int LineLength, TotalLength; 榪欏茍涓嶆槸鏁堢巼鏈楂樼殑鏂規硶錛屼絾鐢變簬榪欎釜淇鏈韓榪愮畻閲忓茍涓嶅ぇ錛屼嬌鐢ㄩ鐜囦篃涓嶉珮錛屾垜浠氨涓嶉渶瑕佸啀鑰冭檻鏇村揩鐨勬柟娉曚簡銆?br>2銆佺畝鍗曠殑OpenGL鍍忕礌鎿嶄綔 3銆乬lReadPixels鐨勭敤娉曞拰涓句緥 娉ㄦ剰錛歡lReadPixels瀹為檯涓婃槸浠庣紦鍐插尯涓鍙栨暟鎹紝濡傛灉浣跨敤浜嗗弻緙撳啿鍖猴紝鍒欓粯璁ゆ槸浠庢鍦ㄦ樉紺虹殑緙撳啿錛堝嵆鍓嶇紦鍐詫級涓鍙栵紝鑰岀粯鍒跺伐浣滄槸榛樿緇樺埗鍒板悗緙撳啿鍖虹殑銆傚洜姝わ紝濡傛灉闇瑕佽鍙栧凡緇忕粯鍒跺ソ鐨勫儚绱狅紝寰寰闇瑕佸厛浜ゆ崲鍓嶅悗緙撳啿銆?/p>
鍐嶇湅鍓嶉潰鎻愬埌鐨凚MP鏂囦歡涓袱涓渶瑕佹敞鎰忕殑鍦版柟錛?br>3.2 瑙e喅OpenGL甯哥敤鐨凴GB鍍忕礌鏁版嵁涓嶣MP鏂囦歡鐨凚GR鍍忕礌鏁版嵁欏哄簭涓嶄竴鑷撮棶棰?br>鍙互浣跨敤涓浜涗唬鐮佷氦鎹㈡瘡涓儚绱犵殑絎竴瀛楄妭鍜岀涓夊瓧鑺傦紝浣垮緱RGB鐨勬暟鎹彉鎴怋GR鐨勬暟鎹傚綋鐒朵篃鍙互浣跨敤鍙﹀鐨勬柟寮忚В鍐抽棶棰橈細鏂扮増鏈殑OpenGL闄や簡鍙互浣跨敤GL_RGB璇誨彇鍍忕礌鐨勭孩銆佺豢銆佽摑鏁版嵁澶栵紝涔熷彲浠ヤ嬌鐢℅L_BGR鎸夌収鐩稿弽鐨勯『搴忎緷嬈¤鍙栧儚绱犵殑钃濄佺豢銆佺孩鏁版嵁錛岃繖鏍峰氨涓嶣MP鏂囦歡鏍煎紡鐩稿惢鍚堜簡銆傚嵆浣夸綘鐨刧l/gl.h澶存枃浠朵腑娌℃湁瀹氫箟榪欎釜GL_BGR錛屼篃娌℃湁鍏崇郴錛屽彲浠ュ皾璇曚嬌鐢℅L_BGR_EXT銆傝櫧鐒舵湁鐨凮penGL瀹炵幇錛堝挨鍏舵槸鏃х増鏈殑瀹炵幇錛夊茍涓嶈兘浣跨敤GL_BGR_EXT錛屼絾鎴戞墍鐭ラ亾鐨刉indows鐜涓嬪悇縐峅penGL瀹炵幇閮藉GL_BGR鎻愪緵浜嗘敮鎸侊紝姣曠珶Windows涓悇縐嶈〃紺洪鑹茬殑鏁版嵁鍑犱箮閮芥槸浣跨敤BGR鐨勯『搴忥紝鑰岄潪RGB鐨勯『搴忋傝繖鍙兘涓嶪BM-PC鐨勭‖浠惰璁℃湁鍏熾?/p>
3.3 娑堥櫎BMP鏂囦歡涓?#8220;瀵歸綈”甯︽潵鐨勫獎鍝?br>瀹為檯涓奜penGL涔熸敮鎸佷嬌鐢ㄤ簡榪欑“瀵歸綈”鏂瑰紡鐨勫儚绱犳暟鎹傚彧瑕侀氳繃glPixelStore淇敼“鍍忕礌淇濆瓨鏃跺榻愮殑鏂瑰紡”灝卞彲浠ヤ簡銆傚儚榪欐牱錛?br>int alignment = 4; 鐜板湪錛屾垜浠凡緇忓彲浠ユ妸灞忓箷涓婄殑鍍忕礌璇誨彇鍒板唴瀛樹簡錛屽鏋滈渶瑕佺殑璇濓紝鎴戜滑榪樺彲浠ュ皢鍐呭瓨涓殑鏁版嵁淇濆瓨鍒版枃浠躲傛紜殑瀵圭収BMP鏂囦歡鏍煎紡錛屾垜浠殑紼嬪簭灝卞彲浠ユ妸灞忓箷涓殑鍥捐薄淇濆瓨涓築MP鏂囦歡錛岃揪鍒板睆騫曟埅鍥劇殑鏁堟灉銆?br>鎴戜滑騫舵病鏈夎緇嗕粙緇岯MP鏂囦歡寮澶寸殑54涓瓧鑺傜殑鎵鏈夊唴瀹癸紝涓嶈繃榪欐棤浼ゅぇ闆呫備粠涓涓紜殑BMP鏂囦歡涓鍙栧墠54涓瓧鑺傦紝淇敼鍏朵腑鐨勫搴﹀拰楂樺害淇℃伅錛屽氨鍙互寰楀埌鏂扮殑鏂囦歡澶翠簡銆傚亣璁炬垜浠厛寤虹珛涓涓?*1澶у皬鐨?4浣嶈壊BMP錛屾枃浠跺悕涓篸ummy.bmp錛屽張鍋囪鏂扮殑BMP鏂囦歡鍚嶇О涓篻rab.bmp銆傚垯鍙互緙栧啓濡備笅浠g爜錛?/p>
FILE* pOriginFile = fopen("dummy.bmp", "rb); /* 鍏堝湪榪欓噷璁劇疆濂藉浘璞$殑瀹藉害鍜岄珮搴︼紝鍗硍idth鍜宧eight鐨勫鹼紝騫惰綆楀儚绱犵殑鎬婚暱搴?*/ // 璇誨彇dummy.bmp涓殑澶?4涓瓧鑺傚埌鏁扮粍 // 淇敼鍏朵腑鐨勫ぇ灝忎俊鎭?br>fseek(pGrabFile, 0x0012, SEEK_SET); // 縐誨姩鍒版枃浠舵湯灝撅紝寮濮嬪啓鍏ュ儚绱犳暟鎹?br>fseek(pGrabFile, 0, SEEK_END); /* 鍦ㄨ繖閲屽啓鍏ュ儚绱犳暟鎹埌鏂囦歡 */ fclose(pOriginFile); 鎴戜滑緇欏嚭瀹屾暣鐨勪唬鐮侊紝婕旂ず濡備綍鎶婃暣涓獥鍙g殑鍥捐薄鎶撳彇鍑烘潵騫朵繚瀛樹負BMP鏂囦歡銆?/p>
#define WindowWidth 400 #include <stdio.h> /* 鍑芥暟grab // 璁$畻鍍忕礌鏁版嵁鐨勫疄闄呴暱搴?br> i = WindowWidth * 3; // 寰楀埌姣忎竴琛岀殑鍍忕礌鏁版嵁闀垮害 // 鍒嗛厤鍐呭瓨鍜屾墦寮鏂囦歡 pDummyFile = fopen("dummy.bmp", "rb"); pWritingFile = fopen("grab.bmp", "wb"); // 璇誨彇鍍忕礌 // 鎶奷ummy.bmp鐨勬枃浠跺ご澶嶅埗涓烘柊鏂囦歡鐨勬枃浠跺ご // 鍐欏叆鍍忕礌鏁版嵁 // 閲婃斁鍐呭瓨鍜屽叧闂枃浠?br> fclose(pDummyFile); 鎶婅繖孌典唬鐮佸鍒跺埌浠ュ墠浠諱綍璇劇▼鐨勬牱渚嬬▼搴忎腑錛屽湪緇樺埗鍑芥暟鐨勬渶鍚庤皟鐢╣rab鍑芥暟錛屽嵆鍙妸鍥捐薄鍐呭淇濆瓨涓築MP鏂囦歡浜嗐傦紙鍦ㄦ垜鍐欒繖涓暀紼嬬殑鏃跺欙紝涓嶅皯鍦版柟閮界敤榪欐牱鐨勪唬鐮佽繘琛屾埅鍥懼伐浣滐紝榪欐浠g爜涓鏃﹀啓濂斤紝榪愯璧鋒潵鏄緢鏂逛究鐨勩傦級 #include <gl/glut.h> #define FileName "Bliss.bmp" static GLint ImageWidth; #include <stdio.h> void display(void) // 緇樺埗鍍忕礌 // 瀹屾垚緇樺埗 int main(int argc, char* argv[]) // 璇誨彇鍥捐薄鐨勫ぇ灝忎俊鎭?br> fseek(pFile, 0x0012, SEEK_SET); // 璁$畻鍍忕礌鏁版嵁闀垮害 // 璇誨彇鍍忕礌鏁版嵁 fseek(pFile, 54, SEEK_SET); // 鍏抽棴鏂囦歡 // 鍒濆鍖朑LUT騫惰繍琛?br> glutInit(&argc, argv); // 閲婃斁鍐呭瓨 return 0; 榪欓噷浠呬粎鏄竴涓畝鍗曠殑鏄劇ず24浣岯MP鍥捐薄鐨勭▼搴忥紝濡傛灉璇昏呭BMP鏂囦歡鏍煎紡姣旇緝鐔熸倝錛屼篃鍙互鍐欏嚭閫傜敤浜庡悇縐岯MP鍥捐薄鐨勬樉紺虹▼搴忥紝鍦ㄥ儚绱犲鐞嗘椂錛屽畠浠墍浣跨敤鐨勬柟娉曟槸綾諱技鐨勩?br>OpenGL鍦ㄧ粯鍒跺儚绱犱箣鍓嶏紝鍙互瀵瑰儚绱犺繘琛岃嫢騫插鐞嗐傛渶甯哥敤鐨勫彲鑳藉氨鏄鏁翠釜鍍忕礌鍥捐薄榪涜鏀懼ぇ/緙╁皬銆備嬌鐢╣lPixelZoom鏉ヨ緗斁澶?緙╁皬鐨勭郴鏁幫紝璇ュ嚱鏁版湁涓や釜鍙傛暟錛屽垎鍒槸姘村鉤鏂瑰悜緋繪暟鍜屽瀭鐩存柟鍚戠郴鏁般備緥濡傝緗甮lPixelZoom(0.5f, 0.8f);鍒欒〃紺烘按騫蟲柟鍚戝彉涓哄師鏉ョ殑50%澶у皬錛岃屽瀭鐩存柟鍚戝彉涓哄師鏉ョ殑80%澶у皬銆傛垜浠敋鑷沖彲浠ヤ嬌鐢ㄨ礋鐨勭郴鏁幫紝浣垮緱鏁翠釜鍥捐薄榪涜姘村鉤鏂瑰悜鎴栧瀭鐩存柟鍚戠殑緲昏漿錛堥粯璁ゅ儚绱犱粠宸︾粯鍒跺埌鍙籌紝浣嗙炕杞悗灝嗕粠鍙崇粯鍒跺埌宸︺傞粯璁ゅ儚绱犱粠涓嬬粯鍒跺埌涓婏紝浣嗙炕杞悗灝嗕粠涓婄粯鍒跺埌涓嬨傚洜姝わ紝glRasterPos*鍑芥暟璁劇疆鐨?#8220;寮濮嬩綅緗?#8221;涓嶄竴瀹氬氨鏄煩褰㈢殑宸︿笅瑙掞級銆?br>5銆乬lCopyPixels鐨勭敤娉曞拰涓句緥 void display(void) // 緇樺埗 // 瀹屾垚緇樺埗錛屽茍鎶撳彇鍥捐薄淇濆瓨涓築MP鏂囦歡 灝忕粨錛?br>鏈緇撳悎Windows緋葷粺甯歌鐨凚MP鍥捐薄鏍煎紡錛岀畝鍗曚粙緇嶄簡OpenGL鐨勫儚绱犲鐞嗗姛鑳姐傚寘鎷嬌鐢╣lReadPixels璇誨彇鍍忕礌銆乬lDrawPixels緇樺埗鍍忕礌銆乬lCopyPixels澶嶅埗鍍忕礌銆?br>鏈浠呬粙緇嶄簡鍍忕礌澶勭悊鐨勪竴浜涚畝鍗曞簲鐢紝浣嗙浉淇″ぇ瀹跺凡緇忓彲浠ヤ綋浼氬埌錛屽洿緇曡繖涓変釜鍍忕礌澶勭悊鍑芥暟錛岃繕瀛樺湪涓浜?#8220;澶栧洿”鍑芥暟錛屾瘮濡俫lPixelStore*錛実lRasterPos*錛屼互鍙奼lPixelZoom絳夈傛垜浠粎浣跨敤浜嗚繖浜涘嚱鏁扮殑涓灝戦儴鍒嗗姛鑳姐?br>鏈鍐呭騫朵笉澶氾紝渚嬪瓙瓚沖涓板瘜錛屼笁涓儚绱犲鐞嗗嚱鏁伴兘鏈変緥瀛愶紝澶у鍙互緇撳悎渚嬪瓙鏉ヤ綋浼氥?/p>
闄勫綍(鍏跺畠浣嶈壊鐨凚MP鏂囦歡綆浠?: BMP鏂囦歡緇勬垚 浣嶅浘淇℃伅澶? 棰滆壊琛? 浣嶅浘鏁版嵁
1銆?nbsp; BMP鏂囦歡鏍煎紡綆鍗曚粙緇?/p>
GLint width, height; // 浣跨敤OpenGL鐨凣Lint綾誨瀷錛屽畠鏄?2浣嶇殑銆?br> // 鑰孋璇█鏈韓鐨刬nt鍒欎笉涓瀹氭槸32浣嶇殑銆?br>FILE* pFile;
// 鍦ㄨ繖閲岃繘琛?#8220;鎵撳紑鏂囦歡”鐨勬搷浣?br>fseek(pFile, 0x0012, SEEK_SET); // 縐誨姩鍒?x0012浣嶇疆
fread(&width, sizeof(width), 1, pFile); // 璇誨彇瀹藉害
fseek(pFile, 0x0016, SEEK_SET); // 縐誨姩鍒?x0016浣嶇疆
// 鐢變簬涓婁竴鍙ユ墽琛屽悗鏈氨搴旇鍦?x0016浣嶇疆
// 鎵浠ヨ繖涓鍙ュ彲鐪佺暐
fread(&height, sizeof(height), 1, pFile); // 璇誨彇楂樺害
LineLength = ImageWidth * BytesPerPixel; // 姣忚鏁版嵁闀垮害澶ц嚧涓哄浘璞″搴︿箻浠?br> // 姣忓儚绱犵殑瀛楄妭鏁?br>while( LineLength % 4 != 0 ) // 淇LineLength浣垮叾涓?鐨勫嶆暟
++LineLenth;
TotalLength = LineLength * ImageHeight; // 鏁版嵁鎬婚暱 = 姣忚闀垮害 * 鍥捐薄楂樺害
OpenGL鎻愪緵浜嗙畝媧佺殑鍑芥暟鏉ユ搷浣滃儚绱狅細
glReadPixels錛氳鍙栦竴浜涘儚绱犮傚綋鍓嶅彲浠ョ畝鍗曠悊瑙d負“鎶婂凡緇忕粯鍒跺ソ鐨勫儚绱狅紙瀹冨彲鑳藉凡緇忚淇濆瓨鍒版樉鍗$殑鏄懼瓨涓級璇誨彇鍒板唴瀛?#8221;銆?br>glDrawPixels錛氱粯鍒朵竴浜涘儚绱犮傚綋鍓嶅彲浠ョ畝鍗曠悊瑙d負“鎶婂唴瀛樹腑涓浜涙暟鎹綔涓哄儚绱犳暟鎹紝榪涜緇樺埗”銆?br>glCopyPixels錛氬鍒朵竴浜涘儚绱犮傚綋鍓嶅彲浠ョ畝鍗曠悊瑙d負“鎶婂凡緇忕粯鍒跺ソ鐨勫儚绱犱粠涓涓綅緗鍒跺埌鍙︿竴涓綅緗?#8221;銆傝櫧鐒朵粠鍔熻兘涓婄湅錛屽ソ璞$瓑浠蜂簬鍏堣鍙栧儚绱犲啀緇樺埗鍍忕礌錛屼絾瀹為檯涓婂畠涓嶉渶瑕佹妸宸茬粡緇樺埗鐨勫儚绱狅紙瀹冨彲鑳藉凡緇忚淇濆瓨鍒版樉鍗$殑鏄懼瓨涓級杞崲涓哄唴瀛樻暟鎹紝鐒跺悗鍐嶇敱鍐呭瓨鏁版嵁榪涜閲嶆柊鐨勭粯鍒訛紝鎵浠ヨ姣斿厛璇誨彇鍚庣粯鍒跺揩寰堝銆?br>榪欎笁涓嚱鏁板彲浠ュ畬鎴愮畝鍗曠殑鍍忕礌璇誨彇銆佺粯鍒跺拰澶嶅埗浠誨姟錛屼絾瀹為檯涓婁篃鍙互瀹屾垚鏇村鏉傜殑浠誨姟銆傚綋鍓嶏紝鎴戜滑浠呰璁轟竴浜涚畝鍗曠殑搴旂敤銆傜敱浜庤繖鍑犱釜鍑芥暟鐨勫弬鏁版暟鐩瘮杈冨錛屼笅闈㈡垜浠垎鍒粙緇嶃?/p>
3.1 鍑芥暟鐨勫弬鏁拌鏄?br>璇ュ嚱鏁版誨叡鏈変竷涓弬鏁般傚墠鍥涗釜鍙傛暟鍙互寰楀埌涓涓煩褰紝璇ョ煩褰㈡墍鍖呮嫭鐨勫儚绱犻兘浼氳璇誨彇鍑烘潵銆傦紙絎竴銆佷簩涓弬鏁拌〃紺轟簡鐭╁艦鐨勫乏涓嬭妯佺旱鍧愭爣錛屽潗鏍囦互紿楀彛鏈宸︿笅瑙掍負闆訛紝鏈鍙充笂瑙掍負鏈澶у鹼紱絎笁銆佸洓涓弬鏁拌〃紺轟簡鐭╁艦鐨勫搴﹀拰楂樺害錛?br>絎簲涓弬鏁拌〃紺鴻鍙栫殑鍐呭錛屼緥濡傦細GL_RGB灝變細渚濇璇誨彇鍍忕礌鐨勭孩銆佺豢銆佽摑涓夌鏁版嵁錛孏L_RGBA鍒欎細渚濇璇誨彇鍍忕礌鐨勭孩銆佺豢銆佽摑銆乤lpha鍥涚鏁版嵁錛孏L_RED鍒欏彧璇誨彇鍍忕礌鐨勭孩鑹叉暟鎹紙綾諱技鐨勮繕鏈塆L_GREEN錛孏L_BLUE錛屼互鍙奊L_ALPHA錛夈傚鏋滈噰鐢ㄧ殑涓嶆槸RGBA棰滆壊妯″紡錛岃屾槸閲囩敤棰滆壊绱㈠紩妯″紡錛屽垯涔熷彲浠ヤ嬌鐢℅L_COLOR_INDEX鏉ヨ鍙栧儚绱犵殑棰滆壊绱㈠紩銆傜洰鍓嶄粎闇瑕佺煡閬撹繖浜涳紝浣嗗疄闄呬笂榪樺彲浠ヨ鍙栧叾瀹冨唴瀹癸紝渚嬪娣卞害緙撳啿鍖虹殑娣卞害鏁版嵁絳夈?br>絎叚涓弬鏁拌〃紺鴻鍙栫殑鍐呭淇濆瓨鍒板唴瀛樻椂鎵浣跨敤鐨勬牸寮忥紝渚嬪錛欸L_UNSIGNED_BYTE浼氭妸鍚勭鏁版嵁淇濆瓨涓篏Lubyte錛孏L_FLOAT浼氭妸鍚勭鏁版嵁淇濆瓨涓篏Lfloat絳夈?br>絎竷涓弬鏁拌〃紺轟竴涓寚閽堬紝鍍忕礌鏁版嵁琚鍙栧悗錛屽皢琚繚瀛樺埌榪欎釜鎸囬拡鎵琛ㄧず鐨勫湴鍧銆傛敞鎰忥紝闇瑕佷繚璇佽鍦板潃鏈夎凍澶熺殑鍙互浣跨敤鐨勭┖闂達紝浠ュ綰寵鍙栫殑鍍忕礌鏁版嵁銆備緥濡備竴騫呭ぇ灝忎負256*256鐨勫浘璞★紝濡傛灉璇誨彇鍏禦GB鏁版嵁錛屼笖姣忎竴鏁版嵁琚繚瀛樹負GLubyte錛屾誨ぇ灝忓氨鏄細256*256*3 = 196608瀛楄妭錛屽嵆192鍗冨瓧鑺傘傚鏋滄槸璇誨彇RGBA鏁版嵁錛屽垯鎬誨ぇ灝忓氨鏄?56*256*4 = 262144瀛楄妭錛屽嵆256鍗冨瓧鑺傘?/p>
glPixelStorei(GL_UNPACK_ALIGNMENT, alignment);
絎竴涓弬鏁拌〃紺?#8220;璁劇疆鍍忕礌鐨勫榻愬?#8221;錛岀浜屼釜鍙傛暟琛ㄧず瀹為檯璁劇疆涓哄灝戙傝繖閲屽儚绱犲彲浠ュ崟瀛楄妭瀵歸綈錛堝疄闄呬笂灝辨槸涓嶄嬌鐢ㄥ榻愶級銆佸弻瀛楄妭瀵歸綈錛堝鏋滈暱搴︿負濂囨暟錛屽垯鍐嶈ˉ涓涓瓧鑺傦級銆佸洓瀛楄妭瀵歸綈錛堝鏋滈暱搴︿笉鏄洓鐨勫嶆暟錛屽垯琛ヤ負鍥涚殑鍊嶆暟錛夈佸叓瀛楄妭瀵歸綈銆傚垎鍒搴攁lignment鐨勫間負1, 2, 4, 8銆傚疄闄呬笂錛岄粯璁ょ殑鍊兼槸4錛屾濂戒笌BMP鏂囦歡鐨勫榻愭柟寮忕浉鍚誨悎銆?br>glPixelStorei涔熷彲浠ョ敤浜庤緗叾瀹冨悇縐嶅弬鏁般備絾鎴戜滑榪欓噷騫朵笉闇瑕佹繁鍏ヨ璁轟簡銆?/p>
FILE* pGrabFile = fopen("grab.bmp", "wb");
char BMP_Header[54];
GLint width, height;
fread(BMP_Header, sizeof(BMP_Header), 1, pOriginFile);
// 鎶婃暟緇勫唴瀹瑰啓鍏ュ埌鏂扮殑BMP鏂囦歡
fwrite(BMP_Header, sizeof(BMP_Header), 1, pGrabFile);
fwrite(&width, sizeof(width), 1, pGrabFile);
fwrite(&height, sizeof(height), 1, pGrabFile);
fclose(pGrabFile);
#define WindowHeight 400
#include <stdlib.h>
* 鎶撳彇紿楀彛涓殑鍍忕礌
* 鍋囪紿楀彛瀹藉害涓篧indowWidth錛岄珮搴︿負WindowHeight
*/
#define BMP_Header_Length 54
void grab(void)
{
FILE* pDummyFile;
FILE* pWritingFile;
GLubyte* pPixelData;
GLubyte BMP_Header[BMP_Header_Length];
GLint i, j;
GLint PixelDataLength;
while( i%4 != 0 ) // 琛ュ厖鏁版嵁錛岀洿鍒癷鏄殑鍊嶆暟
++i; // 鏈潵榪樻湁鏇村揩鐨勭畻娉曪紝
// 浣嗚繖閲屼粎榪芥眰鐩磋錛屽閫熷害娌℃湁澶珮瑕佹眰
PixelDataLength = i * WindowHeight;
pPixelData = (GLubyte*)malloc(PixelDataLength);
if( pPixelData == 0 )
exit(0);
if( pDummyFile == 0 )
exit(0);
if( pWritingFile == 0 )
exit(0);
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glReadPixels(0, 0, WindowWidth, WindowHeight,
GL_BGR_EXT, GL_UNSIGNED_BYTE, pPixelData);
fread(BMP_Header, sizeof(BMP_Header), 1, pDummyFile);
fwrite(BMP_Header, sizeof(BMP_Header), 1, pWritingFile);
fseek(pWritingFile, 0x0012, SEEK_SET);
i = WindowWidth;
j = WindowHeight;
fwrite(&i, sizeof(i), 1, pWritingFile);
fwrite(&j, sizeof(j), 1, pWritingFile);
fseek(pWritingFile, 0, SEEK_END);
fwrite(pPixelData, PixelDataLength, 1, pWritingFile);
fclose(pWritingFile);
free(pPixelData);
}
4銆乬lDrawPixels鐨勭敤娉曞拰涓句緥
glDrawPixels鍑芥暟涓巊lReadPixels鍑芥暟鐩告瘮錛屽弬鏁板唴瀹瑰ぇ鑷寸浉鍚屻傚畠鐨勭涓銆佷簩銆佷笁銆佸洓涓弬鏁板垎鍒搴斾簬glReadPixels鍑芥暟鐨勭涓夈佸洓銆佷簲銆佸叚涓弬鏁幫紝渚濇琛ㄧず鍥捐薄瀹藉害銆佸浘璞¢珮搴︺佸儚绱犳暟鎹唴瀹廣佸儚绱犳暟鎹湪鍐呭瓨涓殑鏍煎紡銆備袱涓嚱鏁扮殑鏈鍚庝竴涓弬鏁頒篃鏄搴旂殑錛実lReadPixels涓〃紺哄儚绱犺鍙栧悗瀛樻斁鍦ㄥ唴瀛樹腑鐨勪綅緗紝glDrawPixels鍒欒〃紺虹敤浜庣粯鍒剁殑鍍忕礌鏁版嵁鍦ㄥ唴瀛樹腑鐨勪綅緗?br>娉ㄦ剰鍒癵lDrawPixels鍑芥暟姣攇lReadPixels鍑芥暟灝戜簡涓や釜鍙傛暟錛岃繖涓や釜鍙傛暟鍦╣lReadPixels涓垎鍒槸琛ㄧず鍥捐薄鐨勮搗濮嬩綅緗傚湪glDrawPixels涓紝涓嶅繀鏄懼紡鐨勬寚瀹氱粯鍒剁殑浣嶇疆錛岃繖鏄洜涓虹粯鍒剁殑浣嶇疆鏄敱鍙︿竴涓嚱鏁癵lRasterPos*鏉ユ寚瀹氱殑銆俫lRasterPos*鍑芥暟鐨勫弬鏁頒笌glVertex*綾諱技錛岄氳繃鎸囧畾涓涓簩緇?涓夌淮/鍥涚淮鍧愭爣錛孫penGL灝嗚嚜鍔ㄨ綆楀嚭璇ュ潗鏍囧搴旂殑灞忓箷浣嶇疆錛屽茍鎶婅浣嶇疆浣滀負緇樺埗鍍忕礌鐨勮搗濮嬩綅緗?br>寰堣嚜鐒剁殑錛屾垜浠彲浠ヤ粠BMP鏂囦歡涓鍙栧儚绱犳暟鎹紝騫朵嬌鐢╣lDrawPixels緇樺埗鍒板睆騫曚笂銆傛垜浠夋嫨Windows XP榛樿鐨勬闈㈣儗鏅疊liss.bmp浣滀負緇樺埗鐨勫唴瀹癸紙濡傛灉浣犱嬌鐢ㄧ殑鏄疻indows XP緋葷粺錛屽緢鍙兘鍙互鍦ㄧ‖鐩樹腑鎼滅儲鍒拌繖涓枃浠躲傚綋鐒朵綘涔熷彲浠ヤ嬌鐢ㄥ叾瀹傿MP鏂囦歡鏉ヤ唬鏇匡紝鍙瀹冩槸24浣嶇殑BMP鏂囦歡銆傛敞鎰忛渶瑕佷慨鏀逛唬鐮佸紑濮嬮儴鍒嗙殑FileName鐨勫畾涔夛級錛屽厛鎶婅鏂囦歡澶嶅埗涓浠芥斁鍒版紜殑浣嶇疆錛屾垜浠湪紼嬪簭寮濮嬫椂錛屽氨璇誨彇璇ユ枃浠訛紝浠庤岃幏寰楀浘璞$殑澶у皬鍚庯紝鏍規嵁璇ュぇ灝忔潵鍒涘緩鍚堥傜殑OpenGL紿楀彛錛屽茍緇樺埗鍍忕礌銆?br>緇樺埗鍍忕礌鏈潵鏄緢綆鍗曠殑榪囩▼錛屼絾鏄繖涓▼搴忓湪楠ㄦ灦涓婁笌鍓嶉潰鐨勫悇縐嶇ず渚嬬▼搴忕◢鏈変笉鍚岋紝鎵浠ユ垜榪樻槸鎵撶畻緇欏嚭涓浠藉畬鏁寸殑浠g爜銆?/p>
static GLint ImageHeight;
static GLint PixelLength;
static GLubyte* PixelData;
#include <stdlib.h>
{
// 娓呴櫎灞忓箷騫朵笉蹇呰
// 姣忔緇樺埗鏃訛紝鐢婚潰閮借鐩栨暣涓睆騫?br> // 鍥犳鏃犺鏄惁娓呴櫎灞忓箷錛岀粨鏋滈兘涓鏍?br> // glClear(GL_COLOR_BUFFER_BIT);
glDrawPixels(ImageWidth, ImageHeight,
GL_BGR_EXT, GL_UNSIGNED_BYTE, PixelData);
glutSwapBuffers();
}
{
// 鎵撳紑鏂囦歡
FILE* pFile = fopen("Bliss.bmp", "rb");
if( pFile == 0 )
exit(0);
fread(&ImageWidth, sizeof(ImageWidth), 1, pFile);
fread(&ImageHeight, sizeof(ImageHeight), 1, pFile);
PixelLength = ImageWidth * 3;
while( PixelLength % 4 != 0 )
++PixelLength;
PixelLength *= ImageHeight;
PixelData = (GLubyte*)malloc(PixelLength);
if( PixelData == 0 )
exit(0);
fread(PixelData, PixelLength, 1, pFile);
fclose(pFile);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100, 100);
glutInitWindowSize(ImageWidth, ImageHeight);
glutCreateWindow(FileName);
glutDisplayFunc(&display);
glutMainLoop();
// 瀹為檯涓婏紝glutMainLoop鍑芥暟姘歌繙涓嶄細榪斿洖錛岃繖閲屼篃姘歌繙涓嶄細鍒拌揪
// 榪欓噷鍐欓噴鏀懼唴瀛樺彧鏄嚭浜庝竴縐嶄釜浜轟範鎯?br> // 涓嶇敤鎷呭績鍐呭瓨鏃犳硶閲婃斁銆傚湪紼嬪簭緇撴潫鏃舵搷浣滅郴緇熶細鑷姩鍥炴敹鎵鏈夊唴瀛?br> free(PixelData);
}
浠庢晥鏋滀笂鐪嬶紝glCopyPixels榪涜鍍忕礌澶嶅埗鐨勬搷浣滐紝絳変環浜庢妸鍍忕礌璇誨彇鍒板唴瀛橈紝鍐嶄粠鍐呭瓨緇樺埗鍒板彟涓涓尯鍩燂紝鍥犳鍙互閫氳繃glReadPixels鍜実lDrawPixels緇勫悎鏉ュ疄鐜板鍒跺儚绱犵殑鍔熻兘銆傜劧鑰屾垜浠煡閬擄紝鍍忕礌鏁版嵁閫氬父鏁版嵁閲忓緢澶э紝渚嬪涓騫?024*768鐨勫浘璞★紝濡傛灉浣跨敤24浣岯GR鏂瑰紡琛ㄧず錛屽垯闇瑕佽嚦灝?024*768*3瀛楄妭錛屽嵆2.25鍏嗗瓧鑺傘傝繖涔堝鐨勬暟鎹榪涜涓嬈¤鎿嶄綔鍜屼竴嬈″啓鎿嶄綔錛屽茍涓斿洜涓哄湪glReadPixels鍜実lDrawPixels涓緗殑鏁版嵁鏍煎紡涓嶅悓錛屽緢鍙兘娑夊強鍒版暟鎹牸寮忕殑杞崲銆傝繖瀵笴PU鏃犵枒鏄竴涓笉灝忕殑璐熸媴銆備嬌鐢╣lCopyPixels鐩存帴浠庡儚绱犳暟鎹鍒跺嚭鏂扮殑鍍忕礌鏁版嵁錛岄伩鍏嶄簡澶氫綑鐨勬暟鎹殑鏍煎紡杞崲錛屽茍涓斾篃鍙兘鍑忓皯涓浜涙暟鎹鍒舵搷浣滐紙鍥犱負鏁版嵁鍙兘鐩存帴鐢辨樉鍗¤礋璐e鍒訛紝涓嶉渶瑕佺粡榪囦富鍐呭瓨錛夛紝鍥犳鏁堢巼姣旇緝楂樸?br>glCopyPixels鍑芥暟涔熼氳繃glRasterPos*緋誨垪鍑芥暟鏉ヨ緗粯鍒剁殑浣嶇疆錛屽洜涓轟笉闇瑕佹秹鍙婂埌涓誨唴瀛橈紝鎵浠ヤ笉闇瑕佹寚瀹氭暟鎹湪鍐呭瓨涓殑鏍煎紡錛屼篃涓嶉渶瑕佷嬌鐢ㄤ換浣曟寚閽堛?br>glCopyPixels鍑芥暟鏈変簲涓弬鏁幫紝絎竴銆佷簩涓弬鏁拌〃紺哄鍒跺儚绱犳潵婧愮殑鐭╁艦鐨勫乏涓嬭鍧愭爣錛岀涓夈佸洓涓弬鏁拌〃紺哄鍒跺儚绱犳潵婧愮殑涓捐鐨勫搴﹀拰楂樺害錛岀浜斾釜鍙傛暟閫氬父浣跨敤GL_COLOR錛岃〃紺哄鍒跺儚绱犵殑棰滆壊錛屼絾涔熷彲浠ユ槸GL_DEPTH鎴朑L_STENCIL錛屽垎鍒〃紺哄鍒舵繁搴︾紦鍐叉暟鎹垨妯℃澘緙撳啿鏁版嵁銆?br>鍊煎緱涓鎻愮殑鏄紝glDrawPixels鍜実lReadPixels涓緗殑鍚勭鎿嶄綔錛屼緥濡俫lPixelZoom絳夛紝鍦╣lCopyPixels鍑芥暟涓悓鏍鋒湁鏁堛?br>涓嬮潰鐪嬩竴涓畝鍗曠殑渚嬪瓙錛岀粯鍒朵竴涓笁瑙掑艦鍚庯紝澶嶅埗鍍忕礌錛屽茍鍚屾椂榪涜姘村鉤鍜屽瀭鐩存柟鍚戠殑緲昏漿錛岀劧鍚庣緝灝忎負鍘熸潵鐨勪竴鍗婏紝騫剁粯鍒躲傜粯鍒跺畬姣曞悗錛岃皟鐢ㄥ墠闈㈢殑grab鍑芥暟錛屽皢灞忓箷涓墍鏈夊唴瀹逛繚瀛樹負grab.bmp銆傚叾涓璚indowWidth鍜學indowHeight鏄〃紺虹獥鍙e搴﹀拰楂樺害鐨勫父閲忋?/p>
{
// 娓呴櫎灞忓箷
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(0.0f, 0.0f);
glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(1.0f, 0.0f);
glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(0.5f, 1.0f);
glEnd();
glPixelZoom(-0.5f, -0.5f);
glRasterPos2i(1, 1);
glCopyPixels(WindowWidth/2, WindowHeight/2,
WindowWidth/2, WindowHeight/2, GL_COLOR);
glutSwapBuffers();
grab();
}
銆銆BMP鏂囦歡鐢辨枃浠跺ご銆佷綅鍥句俊鎭ご銆侀鑹蹭俊鎭拰鍥懼艦鏁版嵁鍥涢儴鍒嗙粍鎴愩?
銆銆 BMP鏂囦歡澶?
銆銆BMP鏂囦歡澶存暟鎹粨鏋勫惈鏈塀MP鏂囦歡鐨勭被鍨嬨佹枃浠跺ぇ灝忓拰浣嶅浘璧峰浣嶇疆絳変俊鎭?
銆銆鍏剁粨鏋勫畾涔夊涓?銆銆
銆銆typedef struct tagBITMAPFILEHEADER
銆銆{
銆銆WORDbfType; // 浣嶅浘鏂囦歡鐨勭被鍨嬶紝蹇呴』涓築M
銆銆DWORD bfSize; // 浣嶅浘鏂囦歡鐨勫ぇ灝忥紝浠ュ瓧鑺備負鍗曚綅
銆銆WORDbfReserved1; // 浣嶅浘鏂囦歡淇濈暀瀛楋紝蹇呴』涓?
銆銆WORDbfReserved2; // 浣嶅浘鏂囦歡淇濈暀瀛楋紝蹇呴』涓?
銆銆DWORD bfOffBits; // 浣嶅浘鏁版嵁鐨勮搗濮嬩綅緗紝浠ョ浉瀵逛簬浣嶅浘
銆銆// 鏂囦歡澶寸殑鍋忕Щ閲忚〃紺猴紝浠ュ瓧鑺備負鍗曚綅
銆銆} BITMAPFILEHEADER;
銆銆
銆銆
銆銆BMP浣嶅浘淇℃伅澶存暟鎹敤浜庤鏄庝綅鍥劇殑灝哄絳変俊鎭?br>銆銆typedef struct tagBITMAPINFOHEADER{
銆銆DWORD biSize; // 鏈粨鏋勬墍鍗犵敤瀛楄妭鏁?br>銆銆LONGbiWidth; // 浣嶅浘鐨勫搴︼紝浠ュ儚绱犱負鍗曚綅
銆銆LONGbiHeight; // 浣嶅浘鐨勯珮搴︼紝浠ュ儚绱犱負鍗曚綅
銆銆WORD biPlanes; // 鐩爣璁懼鐨勭駭鍒紝蹇呴』涓?
銆銆WORD biBitCount// 姣忎釜鍍忕礌鎵闇鐨勪綅鏁幫紝蹇呴』鏄?(鍙岃壊),
銆銆// 4(16鑹?錛?(256鑹?鎴?4(鐪熷僵鑹?涔嬩竴
銆銆DWORD biCompression; // 浣嶅浘鍘嬬緝綾誨瀷錛屽繀欏繪槸 0(涓嶅帇緙?,
銆銆// 1(BI_RLE8鍘嬬緝綾誨瀷)鎴?(BI_RLE4鍘嬬緝綾誨瀷)涔嬩竴
銆銆DWORD biSizeImage; // 浣嶅浘鐨勫ぇ灝忥紝浠ュ瓧鑺備負鍗曚綅
銆銆LONGbiXPelsPerMeter; // 浣嶅浘姘村鉤鍒嗚鯨鐜囷紝姣忕背鍍忕礌鏁?br>銆銆LONGbiYPelsPerMeter; // 浣嶅浘鍨傜洿鍒嗚鯨鐜囷紝姣忕背鍍忕礌鏁?br>銆銆DWORD biClrUsed;// 浣嶅浘瀹為檯浣跨敤鐨勯鑹茶〃涓殑棰滆壊鏁?br>銆銆DWORD biClrImportant;// 浣嶅浘鏄劇ず榪囩▼涓噸瑕佺殑棰滆壊鏁?br>銆銆} BITMAPINFOHEADER;
銆銆
銆銆棰滆壊琛ㄧ敤浜庤鏄庝綅鍥句腑鐨勯鑹詫紝瀹冩湁鑻ュ共涓〃欏癸紝姣忎竴涓〃欏規槸涓涓猂GBQUAD綾誨瀷鐨勭粨鏋勶紝瀹氫箟涓縐嶉鑹層俁GBQUAD緇撴瀯鐨勫畾涔夊涓?
銆銆
銆銆typedef struct tagRGBQUAD {
銆銆BYTErgbBlue;// 钃濊壊鐨勪寒搴?鍊艱寖鍥翠負0-255)
銆銆BYTErgbGreen; // 緇胯壊鐨勪寒搴?鍊艱寖鍥翠負0-255)
銆銆BYTErgbRed; // 綰㈣壊鐨勪寒搴?鍊艱寖鍥翠負0-255)
銆銆BYTErgbReserved;// 淇濈暀錛屽繀欏諱負0
銆銆} RGBQUAD;
銆銆棰滆壊琛ㄤ腑RGBQUAD緇撴瀯鏁版嵁鐨勪釜鏁版湁biBitCount鏉ョ‘瀹?
銆銆褰揵iBitCount=1,4,8鏃訛紝鍒嗗埆鏈?,16,256涓〃欏?
銆銆褰揵iBitCount=24鏃訛紝娌℃湁棰滆壊琛ㄩ」銆?br>銆銆浣嶅浘淇℃伅澶村拰棰滆壊琛ㄧ粍鎴愪綅鍥句俊鎭紝BITMAPINFO緇撴瀯瀹氫箟濡備笅:
銆銆typedef struct tagBITMAPINFO {
銆銆BITMAPINFOHEADER bmiHeader; // 浣嶅浘淇℃伅澶?br>銆銆RGBQUAD bmiColors[1]; // 棰滆壊琛?br>銆銆} BITMAPINFO;
銆銆浣嶅浘鏁版嵁璁板綍浜嗕綅鍥劇殑姣忎竴涓儚绱犲鹼紝璁板綍欏哄簭鏄湪鎵弿琛屽唴鏄粠宸﹀埌鍙?鎵弿琛屼箣闂存槸浠庝笅鍒頒笂銆備綅鍥劇殑涓涓儚绱犲兼墍鍗犵殑瀛楄妭鏁?
銆銆
銆銆褰揵iBitCount=1鏃訛紝8涓儚绱犲崰1涓瓧鑺?
銆銆褰揵iBitCount=4鏃訛紝2涓儚绱犲崰1涓瓧鑺?
銆銆褰揵iBitCount=8鏃訛紝1涓儚绱犲崰1涓瓧鑺?
銆銆褰揵iBitCount=24鏃?1涓儚绱犲崰3涓瓧鑺?
銆銆Windows瑙勫畾涓涓壂鎻忚鎵鍗犵殑瀛楄妭鏁板繀欏繪槸
銆銆4鐨勫嶆暟(鍗充互long涓哄崟浣?,涓嶈凍鐨勪互0濉厖錛?br>銆銆涓涓壂鎻忚鎵鍗犵殑瀛楄妭鏁拌綆楁柟娉?
銆銆DataSizePerLine= (biWidth* biBitCount+31)/8;
銆銆// 涓涓壂鎻忚鎵鍗犵殑瀛楄妭鏁?br>銆銆DataSizePerLine= DataSizePerLine/4*4; // 瀛楄妭鏁板繀欏繪槸4鐨勫嶆暟
銆銆浣嶅浘鏁版嵁鐨勫ぇ灝?涓嶅帇緙╂儏鍐典笅):
銆銆DataSize= DataSizePerLine* biHeight;
閭d箞灝咮MP鏂囦歡涓殑鍍忕礌閫愪釜璇誨叆鏁版嵁緙撳啿鍐嶆樉紺猴紝鏄惁灝辮兘姝e父鏄劇ず浜嗗憿錛熸樉鐒朵笉鏄殑銆傚墠闈㈣浜嗭紝鍦ㄦ枃浠跺紑澶存湁涓鍧楀ご閮ㄤ俊鎭尯錛屽鏋滄妸榪欎簺鏁版嵁涔熶竴璧瘋榪涚紦鍐詫紝閭d箞鍥懼儚鏄棤娉曟渶緇堟樉紺虹殑銆傚洜姝わ紝閫氬父杞藉叆BMP鍥懼儚鐨勯瑕佷換鍔℃槸瑕佺煡閬撹繖鍧楀ご閮ㄤ俊鎭尯鐨勫ぇ灝忥紝涔熷氨鏄暟鎹尯鐨勫亸縐婚噺offset錛屽啀鍒╃敤fseek瀵誨潃鍒拌繖涓綅緗紝鍐嶈繘琛岄愪釜鍍忕礌鐨勮В鏋愩傝屽ご閮ㄤ俊鎭尯鐨勫ぇ灝忓艱矊浼煎湪澶撮儴淇℃伅鍖虹殑鏌愪釜瀛楄妭涓湁鐨勶紝鍙渶瑕佽鍙栬瀛楄妭錛屼究鍙煡閬撱傚浜?4浣嶅拰32浣嶇殑BMP鍥懼儚鑰岃█錛岃繖涓猳ffset鍊間負0x36錛屼篃灝辨槸澶撮儴淇℃伅鍖虹殑澶у皬鏄?4涓瓧鑺傘?/p>
濡傛灉浣犺鎶婂姞杞藉浘鍍忕殑鍑芥暟鍋氱殑閫氱敤涓浜涚殑璇濓紝閭d箞鍥劇墖鐨勫搴﹀拰楂樺害涔熸槸闇瑕佽幏鍙栫殑錛屽浜?4浣岯MP鍥懼儚錛岃繖涓や釜鍊煎彲浠ュ垎鍒湪0x12鍜?x16榪涜瀵誨潃寰楀埌錛屾敞鎰廸read闇瑕佽鍙屽瓧錛屽嵆4瀛楄妭錛屽惁鍒欎細鍑洪敊銆?/p>
瀵逛簬24浣岯MP鍥懼儚鑰岃█錛屾渶闇瑕佹敞鎰忕殑涓鐐規槸錛岃瀹氫簡姣忔潯琛屾壂鎻忕嚎鐨勬暟鎹ぇ灝忓繀欏繪槸4鐨勬暣鏁板嶏紝濡傛灉涓嶆槸4鐨勬暣鏁板嶏紝閭d箞闇瑕佸湪琛屾湯绔繘琛岃ˉ0錛屽惁鍒欐暟鎹鍙栧皢鍑虹幇鍋忕Щ錛岀洿鎺ュ鑷寸殑緇撴灉錛氫細鍔犺澆鍑轟竴寮犲炬枩鐨勫浘鍍忋傝繖涓ˉ0鐨勬搷浣滃彨鍋氭暟鎹搴﹀榻愩?/p>
寰堟娊璞★紵涓句釜渚嬪瓙錛屽浜?00×400鐨?4浣岯MP鍥懼儚鑰岃█錛岃鎵弿鏄?00px錛屾槸4鐨勬暣鏁板嶏紝閭d箞鏃犻渶榪涜琛?鎿嶄綔銆傚鏋滄槸30×38錛堟湰綃囨瘡寮犻夯灝嗙墝绱犳潗鐨勫昂瀵革級錛岄偅涔堣鎵弿鏄劇劧涓嶆槸4鐨勬暣鏁板嶃傚浜?4浣岯MP鑰岃█錛屼竴涓儚绱犵敱RGB涓夊瓧鑺傜粍鎴愶紝閭d箞涓涓鎵弿鐨則otal瀛楄妭鏄?0 × 3 = 90瀛楄妭錛岃繘琛屾暟鎹搴﹀榻愪箣鍚庯紝琛屾壂鎻忕殑瀹為檯total瀛楄妭鏄?0 × 3 + 2 = 92瀛楄妭銆傚姝わ紝鎵嶈兘琚?鏁撮櫎銆傛崲鍙ヨ瘽璇達紝姣忎竴琛屽鍑?涓棤鐢ㄧ殑瀛楄妭銆傝繖鍦ㄧ紪紼嬩腑錛岄渶瑕佽繘琛屽鐞嗕涪寮冿紝鍚﹀垯鍥懼儚鍐嶆鍙樺艦銆?/p>
鏈鍚庝竴涓渶瑕佹敞鎰忕殑灝忕粏鑺傛槸錛孊MP鍥懼儚鐨勫師鐐瑰潗鏍囷紝閮芥槸浠ュ乏涓嬭涓哄熀鍑嗭紝鍚戝彸銆佸悜涓婂鍔犮傛墍浠ワ紝鍦ㄧ紪紼嬫椂錛岄渶瑕佸y杞存暟鎹仛涓浜涘皬鍙樻崲銆傚惁鍒欏皢浼氬緱鍒頒竴騫呴鍊掔殑鍥懼儚錛屾澶栵紝BMP鐨勪笁鍘熻壊欏哄簭鏄疊GR錛屾敞鎰忕紪紼嬩腑鐨勫鐞嗐?/p>
鍘熸枃鍦板潃錛欱MP鏂囦歡鐨勭粨鏋勶紝浠庡ぇ鐨勫垎綾繪潵鐪嬶紝鍙互鍒嗘垚2閮ㄥ垎錛氬ご閮ㄤ俊鎭尯鍜屽浘鍍忔暟鎹尯銆傚叾涓ご閮ㄤ俊鎭尯涓紝淇濆瓨浜嗗浘鍍忕殑鍚勭灞炴э紝濡傛枃浠舵牸寮忥紝鍥劇墖瀹藉害錛岃皟鑹叉澘絳夌瓑銆傝繃浜嗗ご閮ㄤ俊鎭尯涔嬪悗錛屽氨鏄敤鏉ュ憟鐜板浘鍍忕殑鐪熸鐨勬暟鎹尯浜嗐侭MP鏂囦歡灞炰簬鍍忕礌鏂囦歡錛屼篃灝辨槸璇達紝鏁版嵁鍖轟腑鐨勬暟鎹紝鍏跺疄灝辨槸璁板綍浜嗗浘鍍忎腑姣忎竴涓儚绱犵殑棰滆壊錛屼互32浣岯MP鍥劇墖鏉ヨ錛屾瘡涓涓儚绱犵敱ARGB鍥涗釜瀛楄妭淇濆瓨鍏墮鑹詫紝鍏朵腑A鏄忔槑搴︺傞偅涔堬紝涓鍓?00×400鐨?2浣岯MP鍥懼儚錛屽氨鐢?60000涓儚绱犵粍鎴愶紝鍒欙紝鏁版嵁鍖哄ぇ灝?160000×4byte = 640000byte = 640kb錛屾墍浠ヤ篃涓嶉毦鎬紝BMP鍥懼儚鏂囦歡緇欎漢鐨勫嵃璞″氨鏄枃浠墮潪甯稿ぇ銆?
閭d箞灝咮MP鏂囦歡涓殑鍍忕礌閫愪釜璇誨叆鏁版嵁緙撳啿鍐嶆樉紺猴紝鏄惁灝辮兘姝e父鏄劇ず浜嗗憿錛熸樉鐒朵笉鏄殑銆傚墠闈㈣浜嗭紝鍦ㄦ枃浠跺紑澶存湁涓鍧楀ご閮ㄤ俊鎭尯錛屽鏋滄妸榪欎簺鏁版嵁涔熶竴璧瘋榪涚紦鍐詫紝閭d箞鍥懼儚鏄棤娉曟渶緇堟樉紺虹殑銆傚洜姝わ紝閫氬父杞藉叆BMP鍥懼儚鐨勯瑕佷換鍔℃槸瑕佺煡閬撹繖鍧楀ご閮ㄤ俊鎭尯鐨勫ぇ灝忥紝涔熷氨鏄暟鎹尯鐨勫亸縐婚噺offset錛屽啀鍒╃敤fseek瀵誨潃鍒拌繖涓綅緗紝鍐嶈繘琛岄愪釜鍍忕礌鐨勮В鏋愩傝屽ご閮ㄤ俊鎭尯鐨勫ぇ灝忓艱矊浼煎湪澶撮儴淇℃伅鍖虹殑鏌愪釜瀛楄妭涓湁鐨勶紝鍙渶瑕佽鍙栬瀛楄妭錛屼究鍙煡閬撱傚浜?4浣嶅拰32浣嶇殑BMP鍥懼儚鑰岃█錛岃繖涓猳ffset鍊間負0x36錛屼篃灝辨槸澶撮儴淇℃伅鍖虹殑澶у皬鏄?4涓瓧鑺傘?/p>
濡傛灉浣犺鎶婂姞杞藉浘鍍忕殑鍑芥暟鍋氱殑閫氱敤涓浜涚殑璇濓紝閭d箞鍥劇墖鐨勫搴﹀拰楂樺害涔熸槸闇瑕佽幏鍙栫殑錛屽浜?4浣岯MP鍥懼儚錛岃繖涓や釜鍊煎彲浠ュ垎鍒湪0x12鍜?x16榪涜瀵誨潃寰楀埌錛屾敞鎰廸read闇瑕佽鍙屽瓧錛屽嵆4瀛楄妭錛屽惁鍒欎細鍑洪敊銆?/p>
瀵逛簬24浣岯MP鍥懼儚鑰岃█錛屾渶闇瑕佹敞鎰忕殑涓鐐規槸錛岃瀹氫簡姣忔潯琛屾壂鎻忕嚎鐨勬暟鎹ぇ灝忓繀欏繪槸4鐨勬暣鏁板嶏紝濡傛灉涓嶆槸4鐨勬暣鏁板嶏紝閭d箞闇瑕佸湪琛屾湯绔繘琛岃ˉ0錛屽惁鍒欐暟鎹鍙栧皢鍑虹幇鍋忕Щ錛岀洿鎺ュ鑷寸殑緇撴灉錛氫細鍔犺澆鍑轟竴寮犲炬枩鐨勫浘鍍忋傝繖涓ˉ0鐨勬搷浣滃彨鍋氭暟鎹搴﹀榻愩?/p>
寰堟娊璞★紵涓句釜渚嬪瓙錛屽浜?00×400鐨?4浣岯MP鍥懼儚鑰岃█錛岃鎵弿鏄?00px錛屾槸4鐨勬暣鏁板嶏紝閭d箞鏃犻渶榪涜琛?鎿嶄綔銆傚鏋滄槸30×38錛堟湰綃囨瘡寮犻夯灝嗙墝绱犳潗鐨勫昂瀵革級錛岄偅涔堣鎵弿鏄劇劧涓嶆槸4鐨勬暣鏁板嶃傚浜?4浣岯MP鑰岃█錛屼竴涓儚绱犵敱RGB涓夊瓧鑺傜粍鎴愶紝閭d箞涓涓鎵弿鐨則otal瀛楄妭鏄?0 × 3 = 90瀛楄妭錛岃繘琛屾暟鎹搴﹀榻愪箣鍚庯紝琛屾壂鎻忕殑瀹為檯total瀛楄妭鏄?0 × 3 + 2 = 92瀛楄妭銆傚姝わ紝鎵嶈兘琚?鏁撮櫎銆傛崲鍙ヨ瘽璇達紝姣忎竴琛屽鍑?涓棤鐢ㄧ殑瀛楄妭銆傝繖鍦ㄧ紪紼嬩腑錛岄渶瑕佽繘琛屽鐞嗕涪寮冿紝鍚﹀垯鍥懼儚鍐嶆鍙樺艦銆?/p>
鏈鍚庝竴涓渶瑕佹敞鎰忕殑灝忕粏鑺傛槸錛孊MP鍥懼儚鐨勫師鐐瑰潗鏍囷紝閮芥槸浠ュ乏涓嬭涓哄熀鍑嗭紝鍚戝彸銆佸悜涓婂鍔犮傛墍浠ワ紝鍦ㄧ紪紼嬫椂錛岄渶瑕佸y杞存暟鎹仛涓浜涘皬鍙樻崲銆傚惁鍒欏皢浼氬緱鍒頒竴騫呴鍊掔殑鍥懼儚錛屾澶栵紝BMP鐨勪笁鍘熻壊欏哄簭鏄疊GR錛屾敞鎰忕紪紼嬩腑鐨勫鐞嗐?/p>
鍘熸枃鍦板潃錛?a >http://naozifangde.blog.163.com/blog/static/1280042642009101614938531/