15,979
社区成员
发帖
与我相关
我的任务
分享
void CTHIRD::showpic(BYTE *pMemData, DWORD len)
{
IStream *m_pStream;
IPicture *m_pPictrue;
OLE_XSIZE_HIMETRIC m_JPGWidth;
OLE_YSIZE_HIMETRIC m_JPGHeight;
HGLOBAL hMem;
hMem=GlobalAlloc(GMEM_MOVEABLE,len);
LPVOID pData=NULL;
pData=GlobalLock(hMem);
memcpy(pData, pMemData, len);
GlobalUnlock(hMem);
CreateStreamOnHGlobal(hMem,TRUE,&m_pStream);
if(SUCCEEDED(OleLoadPicture(m_pStream,len,TRUE,IID_IPicture,(LPVOID*)&m_pPictrue)))
{
m_pPictrue->get_Height(&m_JPGHeight);
m_pPictrue->get_Width(&m_JPGWidth);
CRect lpRec;
GetDlgItem(IDC_STATIC1)->GetWindowRect(&lpRec);
ScreenToClient(&lpRec);
m_pPictrue->Render(GetDC()->m_hDC,lpRec.left,lpRec.top
,(int)(m_JPGWidth/26.45), (int)(m_JPGHeight/26.45)
,0 ,m_JPGHeight, m_JPGWidth,-m_JPGHeight,NULL);
}
}
bool CDXGraph::SnapshotBitmap(const char *outFile)
{
if (mBasicVideo) // 类IBasicVideo
{
long bitmapSize = 0;
if (SUCCEEDED(mBasicVideo->GetCurrentImage(&bitmapSize, 0)))
{
bool pass = false;
unsigned char * buffer = new unsigned char[bitmapSize];
// 得到当前画面的大小bitmapSize和数据buffer
if (SUCCEEDED(mBasicVideo->GetCurrentImage(&bitmapSize, (long *)buffer)))
{
newbuffer = buffer;
newbitmapSize = bitmapSize;
/* BITMAPFILEHEADER hdr;
LPBITMAPINFOHEADER lpbi;
lpbi = (LPBITMAPINFOHEADER)buffer;
int nColors = 0; //调色板中的颜色个数.(RGB格式在8位以下的,需要用调色板。
//调色板实际上就是定义一些颜色的数组)
if (lpbi->biBitCount <= 8) //biBitCount:每个像素的位数.PS:RGB32每个像素用32位表示,也就是4个字节
nColors = 1 << lpbi->biBitCount;
hdr.bfType = ((WORD) ('M' << 8) | 'B'); //always is "BM"
hdr.bfSize = bitmapSize + sizeof( hdr );
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0;
hdr.bfOffBits = (DWORD) (sizeof(BITMAPFILEHEADER) + lpbi->biSize +
nColors * sizeof(RGBQUAD));
CString FileName;//建立文件
FileName.Format("Frame-%05d.bmp",i);
//CString strtemp = strBmpDir;
//strtemp += "\\";
//strtemp += FileName;
FILE* fp=_tfopen(FileName ,_T("wb"));
fwrite(&hdr,1,sizeof(BITMAPFILEHEADER),fp);//写入文件头
fwrite(lpbi,1,sizeof(BITMAPINFOHEADER),fp);//写入信息头
int ff = fwrite(buffer,1,lpbi->biSizeImage,fp);
int e = GetLastError();
pass=true;
fclose(fp);
// szTemp[] = "C:\\mysnapshot.bmp"临时的.bmp文件(outFile指针所指)
/* CFile bitmapFile(outFile, CFile::modeReadWrite | CFile::modeCreate | CFile::typeBinary);
bitmapFile.Write(&hdr, sizeof(BITMAPFILEHEADER)); // 设置.bmp格式
bitmapFile.Write(buffer, bitmapSize); // 存入数据(通俗的说就是画图)
bitmapFile.Close(); // Closes the bitmapFile and deletes the object*/
pass = true;
}
delete [] buffer;
return pass;
}
}
return false;
}
if(SUCCEEDED(CreateStreamOnHGlobal(hMem,true,&m_pStream)))
{
m_pPicture = NULL;
if(SUCCEEDED(OleLoadPicture(m_pStream,0,FALSE,IID_IPicture,(LPVOID*)&(m_pPicture))))
{
m_pPicture->get_Height(&m_JPGHeight);
m_pPicture->get_Width(&m_JPGWidth);
CRect lpRec;
GetDlgItem(IDC_STATIC1)->GetWindowRect(&lpRec);
ScreenToClient(&lpRec);
m_pPicture->Render(GetDC()->m_hDC,lpRec.left,lpRec.top
,(int)(m_JPGWidth/26.45), (int)(m_JPGHeight/26.45)
,0 ,m_JPGHeight, m_JPGWidth,-m_JPGHeight,NULL);
}
bool CDXGraph::SnapshotBitmap(const char *outFile)
{
if (mBasicVideo) // 类IBasicVideo
{
long bitmapSize = 0;
if (SUCCEEDED(mBasicVideo->GetCurrentImage(&bitmapSize, 0)))
{
bool pass = false;
unsigned char * buffer = new unsigned char[bitmapSize];
// 得到当前画面的大小bitmapSize和数据buffer
if (SUCCEEDED(mBasicVideo->GetCurrentImage(&bitmapSize, (long *)buffer)))
{
newbuffer = buffer;
newbitmapSize = bitmapSize;
IStream *m_pStream;
IPicture *m_pPictrue;
OLE_XSIZE_HIMETRIC m_JPGWidth;
OLE_YSIZE_HIMETRIC m_JPGHeight;
HGLOBAL hMem;
hMem=GlobalAlloc(GMEM_MOVEABLE,len);
LPVOID pData=NULL;
pData=GlobalLock(hMem);
memcpy(pData, pMemData, len);
GlobalUnlock(hMem);
CreateStreamOnHGlobal(pData,FALSE,&m_pStream);
m_pPictrue = NULL;
if(SUCCEEDED(OleLoadPicture(m_pStream,0,FALSE,IID_IPicture,(LPVOID*)&(m_pPictrue))))
{
m_pPictrue->get_Height(&m_JPGHeight);
m_pPictrue->get_Width(&m_JPGWidth);
CRect lpRec;
GetDlgItem(IDC_STATIC1)->GetWindowRect(&lpRec);
ScreenToClient(&lpRec);
m_pPictrue->Render(GetDC()->m_hDC,lpRec.left,lpRec.top
,(int)(m_JPGWidth/26.45), (int)(m_JPGHeight/26.45)
,0 ,m_JPGHeight, m_JPGWidth,-m_JPGHeight,NULL);
/*
*如下代码段实现的功能是从指定的路径中读取图片,并显示出来
*/
void DisplayImage(HDC hDC, LPCTSTR szImagePath)
{
HANDLE hFile=CreateFile(szImagePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); //从指定的路径szImagePath中读取文件句柄
DWORD dwFileSize=GetFileSize(hFile, NULL); //获得图片文件的大小,用来分配全局内存
HGLOBAL hImageMemory=GlobalAlloc(GMEM_MOVEABLE, dwFileSize); //给图片分配全局内存
void *pImageMemory=GlobalLock(hImageMemory); //锁定内存
DWORD dwReadedSize; //保存实际读取的文件大小
ReadFile(hFile, pImageMemory, dwFileSize, &dwReadedSize, NULL); //读取图片到全局内存当中
GlobalUnlock(hImageMemory); //解锁内存
CloseHandle(hFile); //关闭文件句柄
IStream *pIStream;//创建一个IStream接口指针,用来保存图片流
IPicture *pIPicture;//创建一个IPicture接口指针,表示图片对象
CreateStreamOnHGlobal(hImageMemory, false, &pIStream) //用全局内存初使化IStream接口指针
OleLoadPicture(pIStream, 0, false, IID_IPicture, (LPVOID*)&(pIPicture));//用OleLoadPicture获得IPicture接口指针
//得到IPicture COM接口对象后,你就可以进行获得图片信息、显示图片等操作
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
pIPicture->get_Width(&hmWidth); //用接口方法获得图片的宽和高
pIPicture->get_Height(&hmHeight);
pIPicture->Render(hDC,0,0,100,100,0,hmHeight,hmWidth,-hmHeight,NULL); //在指定的DC上绘出图片
GlobalFree(hImageMemory); //释放全局内存
pIStream->Release(); //释放pIStream
pIPicture->Release(); //释放pIPicture
}