获取位图数据有关问题

获取位图数据问题
新人发帖,求温暖~~
我的最终目标是想做一个用matlab获取屏幕截图的函数。
从网上找到一个截图的代码如下:
#include<windows.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
void ScreenSnap(HBITMAP hBitmap,char *bmpPath,HDC dc);
int main()
{
char *bmpPath = "d:\\Screen.bmp";
Sleep(500);
HWND DeskWnd=GetDesktopWindow();//获取桌面窗口句柄
RECT DeskRC;
GetClientRect(DeskWnd,&DeskRC);//获取窗口大小
HDC DeskDC=GetDC(DeskWnd);//获取窗口DC
HBITMAP DeskBmp=CreateCompatibleBitmap(DeskDC,DeskRC.right,DeskRC.bottom);//兼容位图
HDC memDC=CreateCompatibleDC(DeskDC);//兼容DC
SelectObject(memDC,DeskBmp);//把兼容位图选入兼容DC中
BitBlt(memDC,0,0,DeskRC.right,DeskRC.bottom,DeskDC,0,0,SRCCOPY);//拷贝DC
ScreenSnap(DeskBmp,bmpPath,DeskDC);
system("pause");
return 0;
}

void ScreenSnap(HBITMAP hBitmap,char *bmpPath,HDC dc)
{
BITMAP bmInfo;
DWORD bmDataSize;
char *bmData;//位图数据
wchar_t *bmpPath_wchar_t;
size_t len = strlen(bmpPath)+1;
size_t converted = 0;
bmpPath_wchar_t=(wchar_t*)malloc(len*sizeof(wchar_t));
mbstowcs_s(&converted, bmpPath_wchar_t, len, bmpPath, _TRUNCATE);
GetObject(hBitmap,sizeof(BITMAP),&bmInfo);//根据位图句柄,获取位图信息
bmDataSize=bmInfo.bmWidthBytes*bmInfo.bmHeight;//计算位图数据大小
bmData=new char[1366*768*4];//分配数据
cout << bmDataSize;
BITMAPFILEHEADER bfh;//位图文件头
bfh.bfType=0x4d42;
bfh.bfSize=bmDataSize+54;
bfh.bfReserved1=0;
bfh.bfReserved2=0;
bfh.bfOffBits=54;
BITMAPINFOHEADER bih;//位图信息头
bih.biSize=40;
bih.biWidth=bmInfo.bmWidth;
bih.biHeight=bmInfo.bmHeight;
bih.biPlanes=1;
bih.biBitCount=24;
bih.biCompression=BI_RGB;
bih.biSizeImage=0;
bih.biXPelsPerMeter=0;
bih.biYPelsPerMeter=0;
bih.biClrUsed=0;
bih.biClrImportant=0;
GetDIBits(dc,hBitmap,0,bmInfo.bmHeight,bmData,(BITMAPINFO *)&bih,DIB_RGB_COLORS);//获取位图数据部分
HANDLE hFile=CreateFile(bmpPath_wchar_t,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,0);//创建文件
DWORD dwSize;
WriteFile(hFile,(void *)&bfh,sizeof(BITMAPFILEHEADER),&dwSize,0);//写入位图文件头
WriteFile(hFile,(void *)&bih,sizeof(BITMAPINFOHEADER),&dwSize,0);//写入位图信息头
WriteFile(hFile,(void *)bmData,bmDataSize,&dwSize,0);//写入位图数据
CloseHandle(hFile);//关闭文件句柄
delete bmData;
free(bmpPath_wchar_t);
}

完全可以运行,可以在D盘下生成截图文件:
获取位图数据有关问题

接下来,我稍微修改了一下代码,添加了matlab接口:
#include<windows.h>
#include<stdlib.h>
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{

//Sleep(500);
HWND DeskWnd=GetDesktopWindow();//获取桌面窗口句柄
RECT DeskRC;
GetClientRect(DeskWnd,&DeskRC);//获取窗口大小
HDC DeskDC=GetDC(DeskWnd);//获取窗口DC
HBITMAP DeskBmp=CreateCompatibleBitmap(DeskDC,DeskRC.right,DeskRC.bottom);//兼容位图
HDC memDC=CreateCompatibleDC(DeskDC);//兼容DC
SelectObject(memDC,DeskBmp);//把兼容位图选入兼容DC中
BitBlt(memDC,0,0,DeskRC.right,DeskRC.bottom,DeskDC,0,0,SRCCOPY);//拷贝DC


char *pchar,*mloc;
int dims[3],cx,cy;
cx = DeskRC.right;
cy = DeskRC.bottom;
dims[0]=cy;//注意cx,cy的顺序
dims[1]=cx;
dims[2]=3;
mexPrintf("cx = %d, cy = %d;\n", cx, cy);
plhs[0]=mxCreateNumericArray(3,dims,mxUINT8_CLASS,mxREAL);
//nlhs = 1;
pchar=(char*)mxGetData(plhs[0]);
BITMAP bmInfo;
DWORD bmDataSize;
mexPrintf("%d",sizeof(DWORD));
char *bmData;//位图数据
GetObject(DeskBmp,sizeof(BITMAP),&bmInfo);//根据位图句柄,获取位图信息
bmDataSize=bmInfo.bmWidthBytes*bmInfo.bmHeight;//计算位图数据大小
bmData=new char[bmDataSize];//分配数据
BITMAPFILEHEADER bfh;//位图文件头
bfh.bfType=0x4d42;
bfh.bfSize=bmDataSize+54;
bfh.bfReserved1=0;
bfh.bfReserved2=0;
bfh.bfOffBits=54;
BITMAPINFOHEADER bih;//位图信息头
bih.biSize=40;
bih.biWidth=bmInfo.bmWidth;
bih.biHeight=bmInfo.bmHeight;
bih.biPlanes=1;
bih.biBitCount=24;
bih.biCompression=0;
bih.biSizeImage=0;
bih.biXPelsPerMeter=3780;
bih.biYPelsPerMeter=3780;
bih.biClrUsed=0;
bih.biClrImportant=0;
mexPrintf("size = %d\n" ,bmDataSize);
GetDIBits(DeskDC,DeskBmp,0,bmInfo.bmHeight,bmData,(BITMAPINFO *)&bih,DIB_RGB_COLORS);//获取位图数据部分

//-----------------------------------
//可能的错误点
int i,j,k;
for(k=0;k<3;k++)
for(j=0;j<cy;j++)
for(i=0;i<cx;i++)
{
pchar[cy*i+(cy-1-j)+k*cx*cy]=bmData[(j*cx+i)*3+2-k];
}
//----------------------------------

delete bmData;
return;
}


用matlab调用的代码为:
mex screensnap2.cpp;
a = screensnap2();imshow(a);

可是得到的截图莫名其妙是倾斜的,颜色也错位了……如下图:
获取位图数据有关问题

这个代码调了好久,调得我好蛋疼啊,求大神帮忙纠错!小弟感激不尽!
------解决思路----------------------
不要做A语言代码修改为B语言代码的无用功。
也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。
只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。
即可很方便地让A、B两种语言之间协调工作。
比如:
A将请求数据写到文件a.txt,写完后改名为aa.txt
B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txt
A发现bb.txt存在时,读取其内容,读完后删除bb.txt
以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。
除非A或B不支持判断文件是否存在、文件读写和文件更名。
但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢?

共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的:
·进程之间松耦合
·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。
·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。
·方便在线开关服务,只需删除或创建该临时文本文件即可。
·方便实现分布式和负载均衡。
·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满)
·……

“跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边,
回头是“使用共享纯文本文件进行信息交流”的岸!