圖檔問題(SetBitmapBits跟SetDIBitsToDevice結果不同?) |
答題得分者是:allenchan
|
李國維
高階會員 發表:42 回覆:287 積分:235 註冊:2003-02-07 發送簡訊給我 |
各位大大:
想請教一下.我利用SetBitmapBits跟SetDIBitsToDevice兩種方式來顯示bitmap檔.但是SetDIBitsToDevice的圖檔顯示會反轉180度不知道是什麼原因.
//方法1 //prawBuffer裡面放的是bmp的資料 int iWidth = 640,iHeight = 480; Videobmp = new Graphics::TBitmap(); SetBitmapBits(Videobmp->Handle, iWidth * iHeight * 2, (const void *)prawBuffer); Form1->Canvas->StretchDraw(tc,Videobmp); //方法2 BITMAPINFO bmp ; int iWidth = 640,iHeight = 480; bmp.bmiHeader.biBitCount = 16; bmp.bmiHeader.biCompression = 0; bmp.bmiHeader.biClrImportant = 0; bmp.bmiHeader.biClrUsed = 0; bmp.bmiHeader.biHeight = iHeight; bmp.bmiHeader.biWidth = iWidth; bmp.bmiHeader.biSizeImage = 2* iHeight * iWidth; bmp.bmiHeader.biSize = sizeof(bmp); bmp.bmiHeader.biPlanes = 1; bmp.bmiHeader.biXPelsPerMeter = 0; bmp.bmiHeader.biYPelsPerMeter = 0; SetDIBitsToDevice(m_dc,0, 0, bmp.biWidth, bmp.biHeight, 0, 0, 0, bmp.biHeight,prawBuffer,(BITMAPINFO *)(BITMAPINFO *)&(bmp),DIB_RGB_COLORS);兩各方法確定都看的到圖檔.但是方法2所顯示的竟然是顛倒180度ㄉ. 請教各位大大門.我的錯誤發生原因為何? |
allenchan
資深會員 發表:10 回覆:306 積分:283 註冊:2004-01-06 發送簡訊給我 |
請參考:
http://linxixi.8u8.com/win32prog/Contents/Page15.html
請在文章中搜尋一下 "由下而上" 內容摘錄如下(原文為簡體中文): 像大多數點陣圖格式一樣,DIB中的圖素位元是以水平行組織的,用視訊顯示器硬體的術語稱作「掃描線」。行數等於BITMAPCOREHEADER結構的bcHeight欄位元。然而,與大多數點陣圖格式不同的是,DIB從圖像的底行開始,往上表示圖像。
在此應定義一些術語,當我們說「頂行」和「底行」時,指的是當其正確顯示在顯示器或印表機的頁面上時出現在虛擬圖像的頂部和底部。就好像肖像的頂行是頭髮,底行是下巴,在DIB檔案中的「第一行」指的是DIB檔案的色彩對照表後的圖素行,「最後行」指的是檔案最末端的圖素行。
因此,在DIB中,圖像的底行是檔案的第一行,圖像的頂行是檔案的最後一行。這稱之為由下而上的組織。因為這種組織和直覺相反,您可能會問:為什麼要這麼做?
好,現在我們回到OS/2的Presentation Manager。IBM的人認為PM內的座標系統-包括視窗、圖形和點陣圖-應該是一致的。這引起了爭論:大多數人,包括在全畫面文字方式下編程和視窗環境下工作的程式寫作者認為應使用垂直座標在螢幕上向下增加的座標。然而,電腦圖形程式寫作者認為應使用解析幾何的數學方法進行視訊顯示,這是一個垂直座標在空間中向上增加的直角(或笛卡爾)座標系。
簡而言之,數學方法贏了。PM內的所有事物都以左下角為原點(包括視窗座標),因此DIB也就有了那種方式。
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |