WinCE5.0下直接写屏操作与函数 CreateDIBSection() 的使用(转)
这段时间在研究直接写屏的方法.
此问题的起因是: 在 iMX31(WinCE 5.0)上, 屏的分辨为: 800*480. 调用 BitBlt() API 函数画一整屏的动作, 竟然需要 120ms 左右; 同样的程序, 在 Prima 上只需要 20ms 以内的时间.
直接写屏, 需要用到以下两个主要的函数: CreateDC(TEXT("DISPLAY"),......) 和 CreateDIBSection().
1) CreateDC(TEXT("DISPLAY"),......) 的用法比较简单, 参考 MSDN 就可以很容易的搞定.
2) CreateDIBSection() API 函数的使用, 花了我一些时间. 因为以前没有用过它, 所以将其使用的方法记录如下:
{ HBITMAP hDIBitmap; LPBYTE lpBitmapBits; BITMAPINFO DriectBmp; ZeroMemory(&DriectBmp,sizeof(BITMAPINFO)); DriectBmp.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); DriectBmp.bmiHeader.biWidth = 800; DriectBmp.bmiHeader.biHeight = 480; DriectBmp.bmiHeader.biPlanes = 1; DriectBmp.bmiHeader.biBitCount = 16; HDC dcDirect = CreateCompatibleDC(dcBuf); // 建立 hDIBitmap, dcDirect, 和 lpBitmapBits 之间的关系. // 通过 DC 操作向 dcDirect 中写入图形数据, //从 lpBitmapBits 中取得内存数据, 进行内存 Copy 操作, 直接写向显存. hDIBitmap = CreateDIBSection(dcDirect, (BITMAPINFO *)&DriectBmp, DIB_RGB_COLORS, (void **)&lpBitmapBits, NULL, 0); if(NULL != hDIBitmap) { HGDIOBJ OldBitmap = SelectObject(dcDirect, hDIBitmap); BitBlt(dcDirect,0,0,800,480,dcBuf,0,0,SRCCOPY); CopyMemory(gpbFrameAddress,lpBitmapBits,800 * 480 * 2); SelectObject(dcDirect,OldBitmap); } DeleteObject(hDIBitmap); DeleteDC(dcDirect); }
在研究此问题的过程中, 在 CSDN 上找到一个很好的资源, 也记录在自己这里:
http://topic.csdn.net/u/20090629/09/00b25d0d-d461-47dc-88ad-0e2131a5abc7.html
并转载其中关键的代码如下:
#include "stdafx.h" #include "CopyScreen.h" #include <windows.h> #include <commctrl.h> #include"Jpeg.h" #define MAX_LOADSTRING 100 // 全局变量: HINSTANCEg_hInst;// 当前实例 HWNDg_hWndMenuBar;// 菜单栏句柄 // 此代码模块中包含的函数的前向声明: ATOMMyRegisterClass(HINSTANCE, LPTSTR); BOOLInitInstance(HINSTANCE, int); LRESULT CALLBACKWndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACKAbout(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTRlpCmdLine, int nCmdShow) { MSG msg; // 执行应用程序初始化: if (!InitInstance(hInstance, nCmdShow)) { return FALSE; } HACCEL hAccelTable; hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_COPYSCREEN)); // 主消息循环: while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam; } // // 函数: MyRegisterClass() // // 目的: 注册窗口类。 // // 注释: // ATOM MyRegisterClass(HINSTANCE hInstance, LPTSTR szWindowClass) { WNDCLASS wc; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra= 0; wc.cbWndExtra= 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_COPYSCREEN)); wc.hCursor = 0; wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wc.lpszMenuName = 0; wc.lpszClassName = szWindowClass; return RegisterClass(&wc); } // // 函数: InitInstance(HINSTANCE, int) // // 目的: 保存实例句柄并创建主窗口 // // 注释: // //在此函数中,我们在全局变量中保存实例句柄并 //创建和显示主程序窗口。 // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; TCHAR szTitle[MAX_LOADSTRING];// 标题栏文本 TCHAR szWindowClass[MAX_LOADSTRING];// 主窗口类名 g_hInst = hInstance; // 将实例句柄存储在全局变量中 // 在应用程序初始化期间,应调用一次 SHInitExtraControls 以初始化 // 所有设备特定控件,例如,CAPEDIT 和 SIPPREF。 SHInitExtraControls(); LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_COPYSCREEN, szWindowClass, MAX_LOADSTRING); //如果它已经在运行,则将焦点置于窗口上,然后退出 hWnd = FindWindow(szWindowClass, szTitle); if (hWnd) { // 将焦点置于最前面的子窗口 // “| 0x00000001”用于将所有附属窗口置于前台并 // 激活这些窗口。 SetForegroundWindow((HWND)((ULONG) hWnd | 0x00000001)); return 0; } if (!MyRegisterClass(hInstance, szWindowClass)) { return FALSE; } hWnd = CreateWindow(szWindowClass, szTitle, WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } // 使用 CW_USEDEFAULT 创建主窗口时,将不会考虑菜单栏的高度(如果创建了一个 // 菜单栏)。因此,我们要在创建窗口后调整其大小 // 如果菜单栏存在 if (g_hWndMenuBar) { RECT rc; RECT rcMenuBar; GetWindowRect(hWnd, &rc); GetWindowRect(g_hWndMenuBar, &rcMenuBar); rc.bottom -= (rcMenuBar.bottom - rcMenuBar.top); MoveWindow(hWnd, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top, FALSE); } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } HBITMAP CopyScreenToBitmap(int &nWidth,int &nHeight) { // 屏幕和内存设备描述表 HDC hScrDC, hMemDC; // 位图句柄 HBITMAP hBitmap, hOldBitmap; // 屏幕分辨率 int xScrn, yScrn; //为屏幕创建设备描述表 hScrDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL); //为屏幕设备描述表创建兼容的内存设备描述表 hMemDC = CreateCompatibleDC(hScrDC); // 获得屏幕分辨率 xScrn = GetDeviceCaps(hScrDC, HORZRES); yScrn = GetDeviceCaps(hScrDC, VERTRES); //存储屏幕的长宽 nWidth = xScrn; nHeight = yScrn; // 创建一个与屏幕设备描述表兼容的位图 hBitmap = CreateCompatibleBitmap(hScrDC, xScrn, yScrn); // 把新位图选到内存设备描述表中 hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap); // 把屏幕设备描述表拷贝到内存设备描述表中 BitBlt(hMemDC, 0, 0, xScrn,yScrn,hScrDC, 0, 0, SRCCOPY); //得到屏幕位图的句柄 hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap); //清除 DeleteDC(hScrDC); DeleteDC(hMemDC); // 返回位图句柄 return hBitmap; } //将截屏所得保存为16位的图片 int Save16BitmapToFile(HBITMAP hBitmap,LPCTSTR lpFileName) { HDC hDC=CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL); HDC hOffDC=CreateCompatibleDC(hDC); SelectObject(hOffDC,hBitmap); BITMAP Bitmap; GetObject(hBitmap,sizeof(BITMAP),&Bitmap); HANDLE fh=CreateFile(lpFileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,NULL); if(fh == INVALID_HANDLE_VALUE ) return FALSE; BITMAPFILEHEADER bfh; memset(&bfh,0,sizeof(bfh)); bfh.bfType=0x4D42/*((WORD) ('M' << 8) | 'B')*/; bfh.bfSize= sizeof(bfh)+2*Bitmap.bmWidth*Bitmap.bmHeight +sizeof(BITMAPFILEHEADER); bfh.bfOffBits=sizeof(BITMAPINFOHEADER)+sizeof(BITMAPFILEHEADER); DWORD dwWritten=0; WriteFile(fh,&bfh,sizeof(bfh),&dwWritten,NULL); BITMAPINFOHEADER bih; memset(&bih,0,sizeof(bih)); bih.biSize=sizeof(bih); bih.biWidth=Bitmap.bmWidth; bih.biHeight=Bitmap.bmHeight; bih.biPlanes=1; bih.biBitCount=16; if( !WriteFile(fh,&bih,sizeof(bih),&dwWritten,NULL) ) { return FALSE; } BITMAPINFO bitmapInfo; memset((void *)&bitmapInfo,0,sizeof(BITMAPINFO) ); bitmapInfo.bmiHeader=bih; HDC hMemDC=CreateCompatibleDC(hDC); BYTE *m_lpBitBmp=new BYTE[bfh.bfSize-sizeof(BITMAPFILEHEADER)]; HBITMAP hDibBitmap=CreateDIBSection(hMemDC,&bitmapInfo, DIB_RGB_COLORS,(void **)&m_lpBitBmp,NULL,0); if(hDibBitmap != 0) { ::SelectObject(hMemDC,hDibBitmap); BitBlt(hMemDC,0,0,Bitmap.bmWidth,Bitmap.bmHeight,hOffDC,0,0,SRCCOPY); WriteFile(fh,m_lpBitBmp,bfh.bfSize-sizeof(BITMAPFILEHEADER), &dwWritten,NULL); } DeleteObject(hDibBitmap); DeleteDC(hDC); DeleteDC(hMemDC); CloseHandle(fh); return 1; } //将截屏所得保存为24位的图片 int Save24BitmapToFile(HBITMAP hBitmap,LPCTSTR lpFileName) { HDC hDC=CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL); HDC hOffDC=CreateCompatibleDC(hDC); SelectObject(hOffDC,hBitmap); BITMAP Bitmap; GetObject(hBitmap,sizeof(BITMAP),&Bitmap); HANDLE fh=CreateFile(lpFileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,NULL); if(fh == INVALID_HANDLE_VALUE ) return FALSE; BITMAPFILEHEADER bfh; memset(&bfh,0,sizeof(bfh)); bfh.bfType=0x4D42/*((WORD) ('M' << 8) | 'B')*/; bfh.bfSize= sizeof(bfh)+3*Bitmap.bmWidth*Bitmap.bmHeight +sizeof(BITMAPFILEHEADER); bfh.bfOffBits=sizeof(BITMAPINFOHEADER)+sizeof(BITMAPFILEHEADER); DWORD dwWritten=0; WriteFile(fh,&bfh,sizeof(bfh),&dwWritten,NULL); BITMAPINFOHEADER bih; memset(&bih,0,sizeof(bih)); bih.biSize=sizeof(bih); bih.biWidth=Bitmap.bmWidth; bih.biHeight=Bitmap.bmHeight; bih.biPlanes=1; bih.biBitCount=24; if( !WriteFile(fh,&bih,sizeof(bih),&dwWritten,NULL) ) { return FALSE; } BITMAPINFO bitmapInfo; memset((void *)&bitmapInfo,0,sizeof(BITMAPINFO) ); bitmapInfo.bmiHeader=bih; HDC hMemDC=CreateCompatibleDC(hDC); BYTE *m_lpBitBmp=new BYTE[3*Bitmap.bmWidth*Bitmap.bmHeight]; HBITMAP hDibBitmap=CreateDIBSection(hMemDC,&bitmapInfo, DIB_RGB_COLORS,(void **)&m_lpBitBmp,NULL,0); if(hDibBitmap != 0) { ::SelectObject(hMemDC,hDibBitmap); BitBlt(hMemDC,0,0,Bitmap.bmWidth,Bitmap.bmHeight,hOffDC,0,0,SRCCOPY); WriteFile(fh,m_lpBitBmp,3*Bitmap.bmWidth*Bitmap.bmHeight,&dwWritten,NULL); } DeleteObject(hDibBitmap); DeleteDC(hDC); DeleteDC(hMemDC); CloseHandle(fh); return 1; } /*索引颜色/颜色表 位图常用的一种压缩方法。从位图图片中选择最有代表性的若干种颜色(通常不超过256种) 编制成颜色表,然后将图片中原有颜色用颜色表的索引来表示。 这样原图片可以被大幅度有损压缩。适合于压缩网页图形等颜色数较少的图形, 不适合压缩照片等色彩丰富的图形。 */ //将截屏所得保存为32位带颜色表的图片 int Save32BitmapToFile(HBITMAP hBitmap,LPCTSTR lpFileName) { /*若不使用颜色表,则去掉bih.biCompression=BI_BITFIELDS;这句,然后 不设置bitmapInfo.bmiColors[0].rgbRed=255; bitmapInfo.bmiColors[0].rgbGreen=255; bitmapInfo.bmiColors[0].rgbBlue=255;*/ HDC hDC=CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL); HDC hOffDC=CreateCompatibleDC(hDC); SelectObject(hOffDC,hBitmap); BITMAP Bitmap; GetObject(hBitmap,sizeof(BITMAP),&Bitmap); HANDLE fh=CreateFile(lpFileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,NULL); if(fh == INVALID_HANDLE_VALUE ) return FALSE; BITMAPFILEHEADER bfh; memset(&bfh,0,sizeof(bfh)); bfh.bfType=0x4D42/*((WORD) ('M' << 8) | 'B')*/; bfh.bfSize= sizeof(bfh)+4*Bitmap.bmWidth*Bitmap.bmHeight +sizeof(BITMAPFILEHEADER); bfh.bfOffBits=sizeof(BITMAPINFOHEADER)+sizeof(BITMAPFILEHEADER); DWORD dwWritten=0; WriteFile(fh,&bfh,sizeof(bfh),&dwWritten,NULL); BITMAPINFOHEADER bih; memset(&bih,0,sizeof(bih)); bih.biSize=sizeof(bih); bih.biWidth=Bitmap.bmWidth; bih.biHeight=Bitmap.bmHeight; bih.biPlanes=1; bih.biBitCount=32; bih.biCompression=BI_BITFIELDS; if( !WriteFile(fh,&bih,sizeof(bih),&dwWritten,NULL) ) { return FALSE; } BITMAPINFO bitmapInfo; memset((void *)&bitmapInfo,0,sizeof(BITMAPINFO) ); bitmapInfo.bmiHeader=bih; bitmapInfo.bmiColors[0].rgbRed=255; bitmapInfo.bmiColors[0].rgbGreen=255; bitmapInfo.bmiColors[0].rgbBlue=255; HDC hMemDC=CreateCompatibleDC(hDC); BYTE *m_lpBitBmp=new BYTE[4*Bitmap.bmWidth*Bitmap.bmHeight]; HBITMAP hDibBitmap=CreateDIBSection(hMemDC,&bitmapInfo, DIB_RGB_COLORS,(void **)&m_lpBitBmp,NULL,0); if(hDibBitmap != 0) { ::SelectObject(hMemDC,hDibBitmap); BitBlt(hMemDC,0,0,Bitmap.bmWidth,Bitmap.bmHeight,hOffDC,0,0,SRCCOPY); WriteFile(fh,m_lpBitBmp,4*Bitmap.bmWidth*Bitmap.bmHeight,&dwWritten,NULL); } DeleteObject(hDibBitmap); DeleteDC(hDC); DeleteDC(hMemDC); CloseHandle(fh); return 1; } //将截屏所得保存为jpeg图片 int SaveJPEGToFile(HBITMAP hBitmap,LPCSTR lpFileName) { HDC hDC=CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL); HDC hOffDC=CreateCompatibleDC(hDC); SelectObject(hOffDC,hBitmap); BITMAP Bitmap; GetObject(hBitmap,sizeof(BITMAP),&Bitmap); HANDLE fh=CreateFile((LPCWSTR)lpFileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,NULL); if(fh == INVALID_HANDLE_VALUE ) return FALSE; BITMAPFILEHEADER bfh; memset(&bfh,0,sizeof(bfh)); bfh.bfType=0x4D42/*((WORD) ('M' << 8) | 'B')*/; bfh.bfSize= sizeof(bfh)+3*Bitmap.bmWidth*Bitmap.bmHeight+sizeof(BITMAPFILEHEADER); bfh.bfOffBits=sizeof(BITMAPINFOHEADER)+sizeof(BITMAPFILEHEADER); DWORD dwWritten=0; //WriteFile(fh,&bfh,sizeof(bfh),&dwWritten,NULL); BITMAPINFOHEADER bih; memset(&bih,0,sizeof(bih)); bih.biSize=sizeof(bih); bih.biWidth=Bitmap.bmWidth; bih.biHeight=Bitmap.bmHeight; bih.biPlanes=1; bih.biBitCount=24; /*if( !WriteFile(fh,&bih,sizeof(bih),&dwWritten,NULL) ) { return FALSE; }*/ BITMAPINFO bitmapInfo; memset((void *)&bitmapInfo,0,sizeof(BITMAPINFO) ); bitmapInfo.bmiHeader=bih; HDC hMemDC=CreateCompatibleDC(hDC); BYTE *m_lpBitBmp=new BYTE[bfh.bfSize-sizeof(BITMAPFILEHEADER)]; HBITMAP hDibBitmap=CreateDIBSection(hMemDC,&bitmapInfo, DIB_RGB_COLORS,(void **)&m_lpBitBmp,NULL,0); if(hDibBitmap != 0) { ::SelectObject(hMemDC,hDibBitmap); BitBlt(hMemDC,0,0,Bitmap.bmWidth,Bitmap.bmHeight,hOffDC,0,0,SRCCOPY); //WriteFile(fh,m_lpBitBmp,bfh.bfSize-sizeof(BITMAPFILEHEADER),&dwWritten,NULL); WriteJPEGFile(lpFileName, m_lpBitBmp,Bitmap.bmWidth,Bitmap.bmHeight,TRUE, 60); } DeleteObject(hDibBitmap); DeleteDC(hDC); DeleteDC(hMemDC); CloseHandle(fh); return 1; } // 函数: WndProc(HWND, UINT, WPARAM, LPARAM) // 目的: 处理主窗口的消息。 // WM_COMMAND- 处理应用程序菜单 // WM_PAINT- 绘制主窗口 // WM_DESTROY- 发送退出消息并返回 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; static SHACTIVATEINFO s_sai; int iWidth,iHeight; HBITMAP hBitmap; static int s_cxBegin; static int s_cyBegin; static int s_cxEnd; static int s_cyEnd; switch (message) { case WM_COMMAND: wmId= LOWORD(wParam); wmEvent = HIWORD(wParam); // 分析菜单选择: switch (wmId) { case IDM_HELP_ABOUT: DialogBox(g_hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, About); break; case IDM_OK: SendMessage (hWnd, WM_CLOSE, 0, 0); break; case ID_RGB16: hBitmap=CopyScreenToBitmap(iWidth,iHeight); Save16BitmapToFile(hBitmap,TEXT("\\a.bmp")); break; case ID_RGB24: hBitmap=CopyScreenToBitmap(iWidth,iHeight); Save24BitmapToFile(hBitmap,TEXT("\\b.bmp")); break; case ID_RGB32: hBitmap=CopyScreenToBitmap(iWidth,iHeight); Save32BitmapToFile(hBitmap,TEXT("\\c.bmp")); break; case ID_JPEG: hBitmap=CopyScreenToBitmap(iWidth,iHeight); SaveJPEGToFile(hBitmap,"d.jpg"); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_CREATE: SHMENUBARINFO mbi; memset(&mbi, 0, sizeof(SHMENUBARINFO)); mbi.cbSize = sizeof(SHMENUBARINFO); mbi.hwndParent = hWnd; mbi.nToolBarId = IDR_MENU; mbi.hInstRes = g_hInst; if (!SHCreateMenuBar(&mbi)) { g_hWndMenuBar = NULL; } else { g_hWndMenuBar = mbi.hwndMB; } // 初始化外壳程序激活信息结构 memset(&s_sai, 0, sizeof (s_sai)); s_sai.cbSize = sizeof (s_sai); break; case WM_LBUTTONDOWN: HCURSOR hCursor; hCursor=SetCursor( LoadCursor(NULL,MAKEINTRESOURCE(IDC_WAIT) ) ); s_cxBegin=LOWORD(lParam); s_cyBegin=HIWORD(lParam); break; case WM_LBUTTONUP: s_cxEnd=LOWORD(lParam); s_cyEnd=HIWORD(lParam); SetCursor( LoadCursor( GetModuleHandle(NULL),MAKEINTRESOURCE(IDC_ARROW) ) ); break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: 在此添加任意绘图代码... EndPaint(hWnd, &ps); break; case WM_DESTROY: CommandBar_Destroy(g_hWndMenuBar); PostQuitMessage(0); break; case WM_ACTIVATE: // 向外壳程序通知我们的激活消息 SHHandleWMActivate(hWnd, wParam, lParam, &s_sai, FALSE); break; case WM_SETTINGCHANGE: SHHandleWMSettingChange(hWnd, wParam, lParam, &s_sai); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }
WinCE5.0下直接写屏操作与函数 CreateDIBSection() 的使用(转)相关推荐
- Appium基础篇14-上下左右滑屏操作swipe方法
本篇来学习webdriver.py下一个滑屏操作,这个方法叫swipe,这个方法只是手机端appium的方法,不是selenium3的方法.在介绍滑屏操作之前,你需要了解如何得到屏幕的高和宽,因为每个 ...
- wince程序转Linux,Qt在程序WinCE5.0下部署时“XXX不是有效的Windows CE应用程序”
文章参看这里.这个一般是由于我们编译的Qt使用了WinCE CoreDll.dll中不存在的API导致的 我们需要使用一个工具qtverify.zip 具体下载目录在 /2012年资料/8月/14日/ ...
- OpenCV2.3的cvCalcHist函数有问题?255级值总为0,索性自己写一个直方图计算函数,附源码
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 我在写直方图规定化的代码过程中,发现OpenCV ...
- WINCE5.0下SQL server compact版本更新
********************************LoongEmbedded************************ 作者:LoongEmbedded(kandi) 时间:201 ...
- WinCE5.0中应用程序如何直接写屏
以前曾利用GAPI实现应用程序直接操作显示驱动的FrameBuffer,以提高屏幕绘图和视频播放的效率.GAPI依赖于显示驱动,必须在显示驱动中添加相应的接口才能正常使用.如果平台是我们自己定制的,在 ...
- WINCE5.0软件总汇(20100411更新)
软件由购把瘾网友搜集,本人整理并上传RaySource网盘 软件分为 办公类,影音类,系统工具类,网络类,桌面美化类,娱乐游戏类五个大类共90余款 多数软件附有简短说明,但恕不奉上图片 办公类 实用软 ...
- 在OpenCV环境下写的灰度图像二维傅里叶换,幅值计算,频谱平移和将数值归一化到0到255区间的四个函数
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 灰度图像的二维傅里叶变换(cv_gray_fft ...
- android 11.0 12.0控制屏幕亮屏和灭屏操作
在11.0 12.0的产品开发中, 需要提供亮屏和灭屏的接口在8.0以后系统对于屏幕亮灭屏做了限制,直接调用亮屏和灭屏的方法就调不到了, 接下来就来看PowerManage.java类 这个是一个电源 ...
- bae index.php,【微信公众平台开发】之一:入门与BAE3.0下操作
0.资料 *<微信公众平台搭建与开发揭秘> 1.开发者模式基本功能 编辑模式比较简单,登录mp.weixin.qq.com一看就会,在此略过.若要申请自定义菜单>微信认证>30 ...
最新文章
- 机器学习中的三对性能度量参数
- 【redis】redis持久化
- C++ new、delete、malloc、free关键字的关系
- 步步深入:MySQL架构总览-gt;查询执行流程-gt;SQL解析顺序
- 【译】nginx关于location部分
- 产品经理如何利用ER图,指导原型设计?
- 关于整合SK框架的一些个小注意
- 思科修复NSA报告的Nexus 交换机DoS漏洞及其它
- HTML5视频播放器
- 论文写作过程中用到的软件、网站分享
- 如何通过树莓派/Python/smtp发送电子邮件
- 这个神器让我的 Bug 少了一半
- HW红队攻防基础建设—C2 IP隐匿技术
- 极速office(Word)文件怎么在方框里面打对勾
- java实现逻辑推断
- 昆石VOS2009/VOS3000 2.1.6.00 操作指南
- 全网最细MySQL数据库下载及安装教程
- 宝真酒业:借助用友U8cloud数智化转型,小集团也能“小而美”
- PHP根据汉字转换拼音
- 51单片机实验之流水灯和交替闪烁