当前位置:编程学习 > wap >>

在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的图像。 --------------------编程问答-------------------- 楼上得兄弟能把你写的代码给我看一下了吗?如果能看的话 --------------------编程问答--------------------
引用 2 楼 yangcuncunzhang 的回复:
用函数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支持不支持的问题吧 --------------------编程问答--------------------
引用 4 楼 wolfmvp 的回复:
引用 2 楼 yangcuncunzhang 的回复:
用函数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的图像。
学习学习,嘿嘿,这个已经很详细咯…

问一下仁兄,请问这样把一个图片转化成二进制后在屏幕上话画图,不是按图片结构的读的文件,我不知道能不能在屏幕上画出,实际上是我的程序是把图片转化成二进制流在转化成base64码,在把base64码转化二进制流后在画到屏幕上,不知可不可行,如果可行的话,请问上边的程序该怎么改? --------------------编程问答--------------------
引用 6 楼 fengle123456 的回复:
引用 4 楼 wolfmvp 的回复:

问一下仁兄,请问这样把一个图片转化成二进制后在屏幕上话画图,不是按图片结构的读的文件,我不知道能不能在屏幕上画出,实际上是我的程序是把图片转化成二进制流在转化成base64码,在把base64码转化二进制流后在画到屏幕上,不知可不可行,如果可行的话,请问上边的程序该怎么改?


上面的代码是为内存中没有图像信息头(宽度、高度、色深等信息)的图像数据建立位图。在建立时需要填位图的一些信息到结构体里。因此如果你的数据包含文件头,那就从数据中取图像信息填进结构体中;如果你的数据不包含文件头,则你自己需要知道图像的这些信息。反正,都要填充好结构体!因为CreateDIBSection()要根据你给的信息建立对应的图像结构!

这是图像显示时的基本原理,至于你做过什么转换无所谓。只要给到CreateDIBSection()的参数正确就好了。

你可以用我上面说的方法取做几个简单测试,了解这个函数的一些特性 --------------------编程问答-------------------- #include <olectl.h> 
补充:移动开发 ,  Windows Phone
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,