directdraw显示rgb565

// TODO: 在此添加控件通知处理程序代码
 height=width=widthBytes=0;
 m_screen.SetWindowPos(&CWnd::wndBottom,0,0,720,576, SWP_NOMOVE | SWP_SHOWWINDOW);
 UpdateWindow();
 main_window_handle = m_screen.GetSafeHwnd();

 if(DD_OK!=(DirectDrawCreateEx(NULL, (void **)&lpdd7, IID_IDirectDraw7, NULL)))
 {
  return ;
 }
 // set the cooperative level for full-screen mode
 if(DD_OK != lpdd7->SetCooperativeLevel(AfxGetMainWnd()->GetSafeHwnd(), DDSCL_NORMAL))
 {
  return ;
 }
 /*设置控制级时,如果应用程序请求了 DDSCL_NORMAL 模式(表明应用程序以普通窗口的形式运行),则不需要提供一个指定窗口的句柄.给窗口句柄参数为 NULL, 所有的窗口都可以被设置为普通的控制级. */
 // set the display mode to 640x480x256
 // clear ddsd and set size
 memset(&ddsd,0,sizeof(ddsd));
 ddsd.dwSize = sizeof(ddsd);

 // enable valid fields
 ddsd.dwFlags=DDSD_CAPS;
 ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
 // create the primary surface

 if(DD_OK!=(lpdd7->CreateSurface(&ddsd, &lpddsprimary, NULL)))
 {
  return ;
 }

 // 创建裁剪器
 if (FAILED(lpdd7->CreateClipper(0, &lpDDClipper, NULL)))
  return ;
 // 与窗口工作区关联

 if (FAILED(lpDDClipper->SetHWnd(0, main_window_handle)))
 {
  lpDDClipper->Release();
  return ;
 }

 if (FAILED(lpddsprimary->SetClipper(lpDDClipper)))
 {
  lpDDClipper->Release();
  return ;
 }

 //
 memset(&ddsd,0,sizeof(ddsd));
 ddsd.dwSize = sizeof(ddsd);
 //DDPIXELFORMAT camdispPixelFormat = {sizeof(DDPIXELFORMAT), DDPF_FOURCC, mmioFOURCC('Y','U','1','2'), 0,0,0,0,0}; 

 ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
 ddsd.dwWidth = 720;
 ddsd.dwHeight = 576;
 //ddsd.dwBackBufferCount = 0;//忽略            //忽略
 ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN| DDSCAPS_VIDEOMEMORY;

 //ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
 ddsd.ddpfPixelFormat.dwFlags  = DDPF_RGB ;
 ddsd.ddpfPixelFormat.dwFourCC = 0;
 ddsd.ddpfPixelFormat.dwRGBBitCount = 16;
 ddsd.ddpfPixelFormat.dwRBitMask = 0xf800;
 ddsd.ddpfPixelFormat.dwGBitMask = 0x7E0;
 ddsd.ddpfPixelFormat.dwBBitMask = 0x1F;
 ddsd.ddpfPixelFormat.dwRGBAlphaBitMask = 0;
 //

 if(DD_OK!=(lpdd7->CreateSurface(&ddsd, &lpddsmypage[0], NULL)))
 {
  return ;
 }

 POINT p;

 p.x = 0; p.y = 0;
 m_screen.ClientToScreen(&p);//获取屏幕顶点
 // m_screen.GetClientRect(&rcRectDest);

 rcRectDest.left = 0;  rcRectDest.top=0;  rcRectDest.right = 720;  rcRectDest.bottom = 576;

 OffsetRect(&rcRectDest, p.x, p.y);//把窗口区域转化为屏幕区域坐标

 SetRect(&rcRectSrc, 0, 0, 720, 576);//初始化窗口区域
 /////////////////////////////////////////////////////////////
 FILE *fp;
 buf[0] = new BYTE[720*576*3];
 // buf[1] = new BYTE[720*576];
 // buf[2] = new BYTE[720*576/4];

 fp = fopen("d:\\temp\\7205762.bmp","rb+");
 fread(buf[0],54,1,fp);
 fread(buf[0],720*576*3,1,fp);
 //while(!feof(fp))
 {
  if(DD_OK != lpddsmypage[0]->Lock(NULL,&ddsd,DDLOCK_WAIT|DDLOCK_SURFACEMEMORYPTR,NULL))
  {
   return ;
  }

  UCHAR  *lp_buffer = (UCHAR *)ddsd.lpSurface;
  WORD tmp=0;
  WORD *bmp555=new WORD[720];
  ///////////////////////////提取数据/////////////////////////////////////////////
  for (int i=0;i<576;i++)
  {
   for (int k=0;k<720;k++)
   {
    tmp = ((buf[0][(i*720+k)*3+2]&0xf8)>>3)<<11 | ((buf[0][(i*720+k)*3+1]&0xfc)>>2)<<5 | (buf[0][(i*720+k)*3+0]&0xf8)>>3;
    bmp555[k] = tmp&0xffff;
   }
   memcpy(lp_buffer +(575-i)*ddsd.lPitch,bmp555,720*2);
  }

  Sleep(40);
  //////////////////////////////////////////////////////////////////////////
  //memcpy(bmp_buffer,buf[0],720*576*2);

  if(DD_OK != lpddsmypage[0]->Unlock(NULL))
  {
   return ;
  }
  HRESULT     ddRval;
  ddRval= lpddsprimary->Blt( &rcRectDest, lpddsmypage[0], &rcRectSrc, DDBLT_WAIT, NULL);
  //while(ddRval == DDERR_WASSTILLDRAWING);
  //ddRval=lpddsprimary->Flip(lpddsmypage[0],1);
  if(DD_OK != ddRval)
  {
   return ;
  }
 }
 //fclose(fp);
 if(lpddsmypage)
 {
  lpddsmypage[0]->Release();
  lpddsmypage[0]=NULL;
 }
 MessageBox(_T("over"));

时间: 2024-09-20 05:49:20

directdraw显示rgb565的相关文章

DirectDraw 显示 YUV

在网上找了一段代码,能工作,但是颜色不对,红的变成蓝色的,黄的变青色了,有时间找找问题. 这个问题在我初学DirectX是困惑了我很久,贴出来为初学者提供一个参考.   #include "ddraw.h" #pragma comment(lib,"ddraw.lib") #define FILE_HEIGHT            288 #define FILE_WIDTH            352 #define DRAW_TOP            0

directdraw显示yuv422(yuy2)

#include <mmsystem.h> void CshowpicDlg::OnBnClickedButton3() {  // TODO: 在此添加控件通知处理程序代码     height=width=widthBytes=0;  m_screen.SetWindowPos(&CWnd::wndBottom,0,0,720,576, SWP_NOMOVE | SWP_SHOWWINDOW);  UpdateWindow();  main_window_handle = m_sc

directdraw显示yuv420(YV12)

height=width=widthBytes=0;  m_screen.SetWindowPos(&CWnd::wndBottom,0,0,720,576, SWP_NOMOVE | SWP_SHOWWINDOW);  UpdateWindow();  main_window_handle = m_screen.GetSafeHwnd();  if(DD_OK!=(DirectDrawCreateEx(NULL, (void **)&lpdd7, IID_IDirectDraw7, NU

directdraw显示rgb555

// TODO: 在此添加控件通知处理程序代码  height=width=widthBytes=0;  m_screen.SetWindowPos(&CWnd::wndBottom,0,0,720,576, SWP_NOMOVE | SWP_SHOWWINDOW);  UpdateWindow();  main_window_handle = m_screen.GetSafeHwnd();  if(DD_OK!=(DirectDrawCreateEx(NULL, (void **)&lp

在CB中进行DirectX编程(3)

2.3 装入并显示图形文件 为了简明地说明采用DirectDraw图形文件的显示技术,我们以示例程序dx2介绍图面.图形文件装入.图形缩放.图形在图面上显示等的初步概念和实现技术. 2.3.1 DirectDraw显示图形的技术 为了显示图象,DirectDraw必需首先拥有类似画布(canvas)的绘图空间,DirectDraw并不向在DOS下那样简单地将显示缓存作为绘画的对象,而是通过DirectDraw对象创建各种不同种类的"图面"(Suerface),图面上的内容可以被应用程序

使用DirectDraw直接显示YUV视频数据

最近在编写一个进行视频播放的ActiveX控件,工作已经接近尾声,现将其中显示YUV数据的使用DirectDraw的一些经验总结如下:(解码部分不是我编写的,我负责从网络接收数据,将数据传给解码器,并将解码得到的YUV数据进行显示,最初在显示部分我是先将YUV数据转换为RGB数据,再以位图的形式显示到屏幕上,但发现CPU占用率比较高,后来改用DirectDraw直接显示YUV数据) 1.在DirectDraw中创建YUV表面   与一般表面不同的是,创建YUV表面时需要指定象素格式,并指定YUV

如何使用DirectDraw直接显示RGB、YUV视频数据(播放yuv)

#include "draw.h" void CTest100Dlg::OnButton1() { // TODO: Add your control notification handler code here CloseShowBMP(); InitDrawBMP(m_screen.GetSafeHwnd(),m_sel.GetCurSel());} void CTest100Dlg::OnButton2() { CString strFilename,str; CFileDial

初次接触:DirectDraw

第六章 初次接触:DirectDraw 本章,你将初次接触DirectX中最重要的组件:DirectDraw.DirectDraw可能是DirectX中最强大的技术,因为其贯穿着2D图形绘制同时其帧缓存层也是DirectX3D的基础.当然,DirectX8.0中DirectDraw已经完全集成到了DirectX3D里面.此外,如果你对DirectDraw深有了解,那将拥有创建任何DOS16/32类型的图形化程序的能力.DirectDraw是理解众多DirectX自身概念的钥匙.所以,听仔细了.

用DirectDraw封装的位图动画类

头文件 [cpp] view plaincopyprint? #pragma once    #include <vector>    using namespace std;   #include <DShow.h>    #include <uuids.h>    #define DXIMAGE_WIDTH   1024    #define DXIMAGE_HEIGHT  768    class CDXImage   {   public:       CDXI