在Mobile中用vc用二进制流怎么把图片的写在手机屏幕上
LPVOID pVoid = NULL;
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE,1024*1024);
pVoid = GlobalLock(hGlobal);
memcpy(pVoid, 0 /*pFileData*//*内存中已有的数据*/,1024*1024);
GlobalUnlock(hGlobal);
LPSTREAM pstm = NULL;
HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);
LPPICTURE pPicture;
*OleCreatePictureIndirect*/
hr =OleLoadPicture(pstm, 1024*1024, FALSE, IID_IPicture,
(LPVOID *)&pPicture);
pstm->Release();
HDC hdc = GetDC(hWnd);
RECT rc;
GetClientRect(hWnd,&rc);
SetRect(&rc,10,50,90,10);
long hmWidth, hmHeight;
pPicture->get_Width(&hmWidth);
pPicture->get_Height(&hmHeight);
pPicture->Render(hdc, 1, 1, 400, 350, 0, hmHeight, hmWidth, -hmHeight, &rc);
ReleaseDC(hWnd, hdc);
其中他不支持OleLoadPicture,请教有什么办法吗? --------------------编程问答-------------------- 帮顶下。
MARK,学习下。 --------------------编程问答-------------------- 用函数CreateDIBSection(),原型如下
HBITMAP CreateDIBSection(HDC hdc,CONST BITMAPINFO *pbmi,UINT iUsage,VOID** ppvBits,HANDLE hSection,DWORD dwOffset);
第一个参数可以为空,
第二个参数用如下的结构体
struct DIBINFO : public BITMAPINFO
{
RGBQUAD arColors[255]; // Color table info - adds an extra 255 entries to palette
operator LPBITMAPINFO() { return (LPBITMAPINFO) this; }
operator LPBITMAPINFOHEADER() { return &bmiHeader; }
RGBQUAD* ColorTable() { return bmiColors; }
};
这个BITMAPINFO里面有很多关于位图的信息,比如宽度、高度、色深,新增加的里面有调色板,在调用这个函数之前,需要先填充这样一个结构体,调用时用它做第二个参数,当然要强制转换:
第三个参数指定DIB_RGB_COLORS
第四个参数为指向一个变量的指针,该变量用来接收为位图分配的内存。也就是说是这个参数是指针的指针。
第五个参数、第六个参数都可以置空
例如:
DIBINFO DibInfo;
// 这个结构体需要根据位图数据填充好
BYTE *pDibData=NULL;
HBITMAP HBitmap=NULL;
// 创建DIB位图
HBitmap = CreateDIBSection(NULL, (const BITMAPINFO*)DibInfo, DIB_RGB_COLORS, (void**)&pDibData, NULL, 0);
if (HBitmap == NULL)
{
// 失败
}
else
{
// 此时,需要将图像的二进制数据复制到pDibData
memcpy(pDinData, pSrcImgData, Size);
// 然后HBitmap就可以用来绘图了
}
我自己已经用过了,很好用。可以处理32bpp,24Bpp, 16Bpp(需要对颜色掩码做特殊处理),8Bpp, 4Bpp的图像。 --------------------编程问答-------------------- 楼上得兄弟能把你写的代码给我看一下了吗?如果能看的话 --------------------编程问答-------------------- 学习学习,嘿嘿,这个已经很详细咯… --------------------编程问答-------------------- 这是SDK支持不支持的问题吧 --------------------编程问答--------------------
问一下仁兄,请问这样把一个图片转化成二进制后在屏幕上话画图,不是按图片结构的读的文件,我不知道能不能在屏幕上画出,实际上是我的程序是把图片转化成二进制流在转化成base64码,在把base64码转化二进制流后在画到屏幕上,不知可不可行,如果可行的话,请问上边的程序该怎么改? --------------------编程问答--------------------
上面的代码是为内存中没有图像信息头(宽度、高度、色深等信息)的图像数据建立位图。在建立时需要填位图的一些信息到结构体里。因此如果你的数据包含文件头,那就从数据中取图像信息填进结构体中;如果你的数据不包含文件头,则你自己需要知道图像的这些信息。反正,都要填充好结构体!因为CreateDIBSection()要根据你给的信息建立对应的图像结构!
这是图像显示时的基本原理,至于你做过什么转换无所谓。只要给到CreateDIBSection()的参数正确就好了。
你可以用我上面说的方法取做几个简单测试,了解这个函数的一些特性 --------------------编程问答-------------------- #include <olectl.h>
补充:移动开发 , Windows Phone