Re: 能夠顯示YUV / RGB格式影像的code...

看板C_Sharp (C#)作者時間20年前 (2004/09/18 03:48), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串4/4 (看更多)
※ 引述《ithinkurdumb (Yankees Rule All)》之銘言: : 我找了DirectX 9的SDK和MSDN Library, : 但是沒有找到相關的資料. : 因為我對這些是初次接觸, : 能夠麻煩你說的詳細一些嗎? : 謝謝...:) : ※ 引述《catyun ()》之銘言: : : 你有連續播放的需求嗎 : : 若要連續播放請用directx : : 用gdi來畫的話fps會很低 : : directdraw的surface可以吃YUV的資料的樣子 : : 我之前是用Overlay..直接餵YUV資料進去就會顯示出來了 你還沒說你有沒有要連續播放啊 若你只是要抓frame出來就不用directx了...粉麻煩 我這裡有以前寫的sample code...可以參考看看 主要是先把4:2:0轉回4:4:4 再用線性轉換公式把YUV轉回RGB clip()是用來保證轉出來的pixel值在0~255間 //把4:2:0變到4:4:4 kdu_byte *buf = decompressor.get_frame(); kdu_byte *Uptr=buf+myDim.x*myDim.y; kdu_byte *Vptr=buf+(myDim.x*myDim.y*5/4); for(int j=0;j<myDim.y;j=j+2) for(int i=0;i<myDim.x;i=i+2) { U[myDim.x*j+i]=*Uptr; U[myDim.x*j+i+1]=*Uptr; U[myDim.x*(j+1)+i]=*Uptr; U[myDim.x*(j+1)+i+1]=*Uptr; Uptr++; V[myDim.x*j+i]=*Vptr; V[myDim.x*j+i+1]=*Vptr; V[myDim.x*(j+1)+i]=*Vptr; V[myDim.x*(j+1)+i+1]=*Vptr; Vptr++; } //轉換回RGB並顯示在螢幕上(BCB) mybitmap->Width=myDim.x; mybitmap->Height=myDim.y; mybitmap->PixelFormat=pf24bit; float R,G,B; for (int y=0; y < myDim.y;y++) { Byte *ptr=(byte *)mybitmap->ScanLine[y]; for (int x=0; x < myDim.x;x++) { //clock_t t_time=clock(); R=clip(buf[x+y*myDim.x]+2.032*(V[x+y*myDim.x]-128)); G=clip(buf[x+y*myDim.x]-0.395*(U[x+y*myDim.x]-128)-0.581*(V[x+y*my Dim.x]-128)); B=clip(buf[x+y*myDim.x]+1.140*(U[x+y*myDim.x]-128)); //file_time += ((double)(clock()-t_time)) / CLOCKS_PER_SEC; ptr[x*3]=B; ptr[x*3+1]=G; ptr[x*3+2]=R; } } directx比較困難,我之前是用directdraw建立surface,fourcc指定為YV12 然後把YUV的資料直接搬到surface的記憶體中,就顯示在螢幕上了 連續frame播放也很快,用上面這種GDI的方法的話 fps大概十張上下吧(P4-2.8G) 用directx的話,視你decoder而定,到上百張也都可能 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.166.171.177
文章代碼(AID): #11Ipz_Hb (C_Sharp)
文章代碼(AID): #11Ipz_Hb (C_Sharp)