IPicture* CEn_Bitmap::LoadFromBuffer(BYTE* pBuff, int nSize) { IPicture* pPicture = NULL; HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, nSize); if (hGlobal != NULL) { void* pData = GlobalLock(hGlobal); if (pData != NULL) { memcpy(pData, pBuff, nSize); GlobalUnlock(hGlobal); IStream* pStream = NULL; if (CreateStreamOnHGlobal(hGlobal, TRUE/*fDeleteOnRelease*/, &pStream) == S_OK) { // Not sure what the 'KeepOriginalFormat' property is really used for. But if 'OleLoadPicture' // is invoked with 'fRunmode=FALSE' the function always creates a temporary file which even // does not get deleted when all COM pointers were released. It eventually gets deleted only // when process terminated. Using 'fRunmode=TRUE' does prevent this behaviour and does not // seem to have any other side effects. VERIFY( OleLoadPicture(pStream, nSize, TRUE/*FALSE*/, IID_IPicture, (LPVOID*)&pPicture) == S_OK ); pStream->Release(); } else GlobalFree(hGlobal); } else GlobalFree(hGlobal); } return pPicture; // caller releases }
bool CPicture::LoadFromBuffer(BYTE* pBuff, int nSize) { bool bResult = false; HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, nSize); void* pData = GlobalLock(hGlobal); memcpy(pData, pBuff, nSize); GlobalUnlock(hGlobal); IStream* pStream = NULL; if (CreateStreamOnHGlobal(hGlobal, TRUE, &pStream) == S_OK) { HRESULT hr; if ((hr = OleLoadPicture(pStream, nSize, FALSE, IID_IPicture, (LPVOID *)&m_pPicture)) == S_OK) { bResult = true; } pStream->Release(); } return bResult; }
HBITMAP UIIMEdit::_LoadAnImage(IN CString filePath) { HANDLE hFile = CreateFile(filePath, 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); //关闭文件句柄 HRESULT hr = NULL; IStream *pIStream = NULL;//创建一个IStream接口指针,用来保存图片流 IPicture *pIPicture = NULL;//创建一个IPicture接口指针,表示图片对象 hr = CreateStreamOnHGlobal(hImageMemory, false, &pIStream); //用全局内存初使化IStream接口指针 ASSERT(SUCCEEDED(hr)); hr = OleLoadPicture(pIStream, 0, false, IID_IPicture, (LPVOID*)&(pIPicture));//用OleLoadPicture获得IPicture接口指针 ASSERT(SUCCEEDED(hr)); HBITMAP hB = NULL; pIPicture->get_Handle((unsigned int*)&hB); // Copy the image. Necessary, because upon p's release, // the handle is destroyed. HBITMAP hBB = (HBITMAP)CopyImage(hB, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG); GlobalFree(hImageMemory); //释放全局内存 pIStream->Release(); //释放pIStream pIPicture->Release(); //释放pIPictur return hBB; }
///===加载图片================================================/// // 参数: 文件实例 // add by xuyz 2011-09-17 void CPicScrollView::LoadPic(CFile& file) { CArchive ar(&file, CArchive::load | CArchive::bNoFlushOnDelete); CArchiveStream arcstream(&ar); ReleasePic(); if (FAILED(OleLoadPicture(&arcstream, 0, FALSE, IID_IPicture, (void**)&m_pPic))) { return; } m_pPic->get_Width(&m_hmWidth); m_pPic->get_Height(&m_hmHeight); CClientDC dc(this); CSize sz(m_hmWidth,m_hmHeight); dc.HIMETRICtoDP(&sz); m_cxPic = sz.cx; m_cyPic = sz.cy; SetScrollSizes(MM_TEXT, sz); Invalidate(); }
int CBitmapView::LoadPicture(CString &filePath) { CFile file; if( !file.Open( filePath, CFile::modeRead) ) return -1; DWORD m_nFileLen; m_nFileLen = file.GetLength(); HGLOBAL hMem = ::GlobalAlloc( GMEM_MOVEABLE, m_nFileLen ); LPVOID lpBuf = ::GlobalLock( hMem ); if( file.Read( lpBuf, m_nFileLen ) != m_nFileLen ) { file.Close(); return -2; } file.Close(); ::GlobalUnlock( hMem ); if ( CreateStreamOnHGlobal( hMem, TRUE, &pStream ) !=S_OK ) return -3; if ( OleLoadPicture( pStream, m_nFileLen, TRUE, IID_IPicture, ( LPVOID * )&pPicture ) !=S_OK ) return -4; Invalidate(); return 1; }
HBITMAP Timeout::LoadImageBitmap(HGLOBAL hgbl, DWORD size) { HBITMAP hbmp = NULL; CoInitialize(NULL); IStream* stream; HRESULT hr = CreateStreamOnHGlobal(hgbl, FALSE, &stream); if(SUCCEEDED(hr) && stream) { ULARGE_INTEGER ul; ul.LowPart = size; ul.HighPart = 0; stream->SetSize(ul); IPicture* picture; // Load picture from stream hr = OleLoadPicture(stream, 0, 0, IID_IPicture, (void**)&picture); if(SUCCEEDED(hr) && picture) { // Copy picture to a bitmap resource HBITMAP hsrc; picture->get_Handle((OLE_HANDLE *)&hsrc); hbmp = (HBITMAP)CopyImage(hsrc, IMAGE_BITMAP, 0, 0, 0); picture->Release(); } stream->Release(); } CoUninitialize(); return hbmp; }
/** * Load a GIF image. * This will replace the currently-loaded image. * Animated GIFs are not yet supported -- only the first frame of an * animated GIF will be loaded. * @param pGifStream The GIF data buffer (may not be NULL). * @param pStreamLen The length of the buffer. * @return @c true if the load succeeded, @c false otherwise (current * image will still be cleared). */ bool GifDecoder::Decode(const unsigned char *pGifStream, int pStreamLen) { // Delete current image. Clean(); bool retv = false; HGLOBAL buf = GlobalAlloc(GPTR, pStreamLen); memcpy((void*)buf, pGifStream, pStreamLen); IStream *stream = NULL; IPicture *pic = NULL; // We currently don't support animated GIFs, so set big delay for // the first frame. mDelay[0] = 3600000; // Use OleLoadPicture() to convert the GIF stream to an HBITMAP. if (SUCCEEDED(CreateStreamOnHGlobal(buf, false, &stream))) { if (SUCCEEDED(OleLoadPicture(stream, 0, false, IID_IPicture, (void**)&pic))) { HBITMAP hb = NULL; pic->get_Handle((OLE_HANDLE*)&hb); mBitmap[0] = (HBITMAP)CopyImage(hb, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG); retv = true; } } if (pic != NULL) pic->Release(); if (stream != NULL) stream->Release(); GlobalFree(buf); return retv; }
////////////////// // Load from stream (IStream). This is the one that really does it: call // OleLoadPicture to do the work. // BOOL CPicture::Load(IStream* pstm) { Free(); HRESULT hr = OleLoadPicture(pstm, 0, FALSE, IID_IPicture, (void**)&m_spIPicture); ASSERT(SUCCEEDED(hr) && m_spIPicture); return TRUE; }
// Function LoadAnImage: accepts a file name and returns a HBITMAP. // On error, it returns 0. HBITMAP LoadAnImage(const char* FileName) { // Use IPicture stuff to use JPG / GIF files IPicture* p; IStream* s; HGLOBAL hG; void* pp; FILE* fp; // Read file into memory fp = fopen(FileName, "rb"); if (!fp) { return NULL; } fseek(fp,0,SEEK_END); int fs = ftell(fp); fseek(fp,0,SEEK_SET); hG = GlobalAlloc(GPTR,fs); if(!hG) { fclose(fp); return NULL; } pp = (void*)hG; fread(pp,1,fs,fp); fclose(fp); // Create an IStream so IPicture can CreateStreamOnHGlobal(hG, false, &s); if(!s) { GlobalFree(hG); return NULL; } OleLoadPicture(s,0,false,IID_IPicture,(void**)&p); if(!p) { s->Release(); GlobalFree(hG); return NULL; } s->Release(); GlobalFree(hG); HBITMAP hB = 0; p->get_Handle((unsigned int*)&hB); // Copy the image. Necessary, because upon p's release, // the handle is destroyed. HBITMAP hBB = (HBITMAP)CopyImage(hB, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG); p->Release(); return hBB; }
//----------------------------------------------------------------------------- // Does: Read The Picture Data From a Source (File / Resource) // ~~~~ And Load It Into The Current IPicture Object In Use // // InPut: Buffer Of Data Source (File / Resource) And Its Size // ~~~~~ // // OutPut: Feed The IPicture Object With The Picture Data // ~~~~~~ (Use Draw Functions To Show It On a Device Context) // TRUE If Succeeded... //----------------------------------------------------------------------------- BOOL CPicture_Ex::LoadPictureData(BYTE *pBuffer, int nSize) //============================================================================= { BOOL bResult = FALSE; HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, nSize); if(hGlobal == NULL) { HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd; MessageBoxEx(hWnd, "Can not allocate enough memory\t", "ERROR"/*ERROR_TITLE*/, MB_OK | MB_ICONSTOP, LANG_ENGLISH); return(FALSE); } void* pData = GlobalLock(hGlobal); memcpy(pData, pBuffer, nSize); GlobalUnlock(hGlobal); IStream* pStream = NULL; if(CreateStreamOnHGlobal(hGlobal, TRUE, &pStream) == S_OK) { HRESULT hr; if((hr = OleLoadPicture(pStream, nSize, FALSE, IID_IPicture, (LPVOID *)&m_pPict)) == E_NOINTERFACE) { HWND hWnd = AfxGetApp()->GetMainWnd()->m_hWnd; MessageBoxEx(hWnd, "IPicture interface is not supported\t", "ERROR"/*ERROR_TITLE*/, MB_OK | MB_ICONSTOP, LANG_ENGLISH); return(FALSE); } else // S_OK { pStream->Release(); pStream = NULL; bResult = TRUE; } } FreeResource(hGlobal); // 16Bit Windows Needs This (32Bit - Automatic Release) return(bResult); }
/* OUR MAIN FUNCTION */ HBITMAP CPicture::LoadPicture(char *FileName) { FreePicture(); CFileProcess cFile; //the image file //if we couldn't open the image file then we should get out of here if(!cFile.Open(FileName, OFM_READ)) return NULL; //we must know exactly the buffer size to allocate //in order to read the image in it //so get the image file size long nSize = cFile.GetSize(); //allocate enough memory to hold the image //it must be allocated using GlobalAlloc //otherwise it will fail...try using new or malloc and you'll see!!! hGlobal = GlobalAlloc(GMEM_MOVEABLE, nSize); //get pointer to first byte void* pData = GlobalLock(hGlobal); //read the file in the prev allocated memory if(!cFile.Read(pData, nSize)) return NULL; //we don't need the file any more so close it cFile.Close(); GlobalUnlock(hGlobal); IStream* pStream = NULL; //ole routines.... //creates a stream from our handle //don't know why and how? if (CreateStreamOnHGlobal(hGlobal, TRUE, &pStream) != S_OK) return NULL; HRESULT hr; //aha..now let ole reads the image and load it for us //param3:Reference to the identifier of the interface // describing the type of interface pointer to return //param4: Address of output variable that receives interface pointer requested in riid hr = OleLoadPicture(pStream, nSize, FALSE, IID_IPicture, (LPVOID*)&this->m_pic); if(hr != S_OK) return NULL; // if ((hr = OleLoadPicture(pStream, nSize, FALSE, IID_IPicture, (LPVOID *)&this->m_pic)) != S_OK) // return NULL; HBITMAP hbmp = NULL; //return an HBITMAP to our image like the LoadImage function does //we might need the handle this->m_pic->get_Handle((OLE_HANDLE *) &hbmp); return hbmp; }
IPicture* LoadPicture(_TCHAR *filename) { HANDLE hFile = CreateFile( filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL ); if (hFile == INVALID_HANDLE_VALUE) return NULL; DWORD size = GetFileSize(hFile, NULL); HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, size); if( NULL == hGlobal ) { CloseHandle(hFile); return NULL; } void* pData = GlobalLock(hGlobal); DWORD dwBytesRead = 0; ReadFile(hFile, pData, size, &dwBytesRead, NULL); CloseHandle(hFile); GlobalUnlock(hGlobal); if( dwBytesRead != size ) { GlobalFree(hGlobal); return NULL; } IStream* pStream = NULL; if( FAILED(CreateStreamOnHGlobal(hGlobal, TRUE, &pStream)) ) { GlobalFree(hGlobal); return NULL; } IPicture *pPicture = NULL; OleLoadPicture(pStream, size, FALSE, IID_IPicture, (LPVOID *) &pPicture); SAFE_RELEASE(pStream); return pPicture; }
void loadImage(const char *image, ACL_Image *mapbuf) { HDC hmapdc; IPicture *ipicture; IStream *istream; DWORD filesize = 0, bytes; OLE_XSIZE_HIMETRIC width; OLE_YSIZE_HIMETRIC height; HANDLE file = NULL; HGLOBAL global = NULL; LPVOID data = NULL; ACL_ASSERT_HWND; file = CreateFileA(image, GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL); if(file == INVALID_HANDLE_VALUE) acl_error("Fail to load image, File not exist"); filesize = GetFileSize(file, NULL); global = GlobalAlloc(GMEM_MOVEABLE, filesize); data = GlobalLock(global); ReadFile(file, data, filesize, &bytes, NULL); GlobalUnlock(global); CreateStreamOnHGlobal(global, TRUE, &istream); OleLoadPicture(istream, filesize, TRUE, &IID_IPicture, (LPVOID*)&ipicture); ipicture->lpVtbl->get_Width(ipicture, &width); ipicture->lpVtbl->get_Height(ipicture, &height); mapbuf->width = (int)(width / 26.45833333333); mapbuf->height = (int)(height / 26.45833333333); hmapdc = CreateCompatibleDC(GetDC(g_hWnd)); if (mapbuf->hbitmap != NULL) DeleteObject(mapbuf->hbitmap); mapbuf->hbitmap = CreateCompatibleBitmap(GetDC(g_hWnd), mapbuf->width, mapbuf->height); SelectObject(hmapdc, mapbuf->hbitmap); ipicture->lpVtbl->Render(ipicture, hmapdc, 0, 0, mapbuf->width, mapbuf->height, 0, height, width, -height, NULL); ipicture->lpVtbl->Release(ipicture); istream->lpVtbl->Release(istream); DeleteDC(hmapdc); GlobalFree(global); CloseHandle(file); }
int CMediaFile::LoadPicture(char* pstrPath, IPicture** ppPicture) { HANDLE hFile = CreateFile(pstrPath, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0); if (hFile == INVALID_HANDLE_VALUE) return NULL; DWORD dwSize = GetFileSize(hFile, 0); if (dwSize == 0) return NULL; DWORD dwRead; BYTE* pBuff = new BYTE[dwSize]; ReadFile(hFile, pBuff, dwSize, &dwRead, 0); if (dwRead == 0) return NULL; dwSize = dwRead; CloseHandle(hFile); HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwSize); void* pData = GlobalLock(hGlobal); memcpy(pData, pBuff, dwSize); GlobalUnlock(hGlobal); IStream* pStream = NULL; if (CreateStreamOnHGlobal(hGlobal, TRUE, &pStream) == S_OK) { HRESULT hr; if ((hr = OleLoadPicture(pStream, dwSize, FALSE, IID_IPicture, (LPVOID *)ppPicture)) == S_OK) { return 1; } else return NULL; pStream->Release(); } else return NULL; return NULL; }
bool CLotteryDlg::_loadPic(CString strFullPath, PicInfo* picInfo) { try { HANDLE hFile = CreateFile(strFullPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) return false; DWORD dwFileSize = GetFileSize(hFile, NULL); if (-1 == dwFileSize) return false; picInfo->_hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize); if (picInfo->_hGlobal == NULL) return false; void * pImageMemory = GlobalLock(picInfo->_hGlobal); DWORD dwReadedSize;//保存实际读取的文件的大小 ReadFile(hFile, pImageMemory, dwFileSize, &dwReadedSize, NULL); GlobalUnlock(picInfo->_hGlobal); CloseHandle(hFile); IStream* pIStream;//创建一个ISTream接口指针,保存图片流 IPicture* pIPicture;//创建一个IPicture接口指针,表示图片对象 if (S_OK != CreateStreamOnHGlobal(picInfo->_hGlobal, false, &pIStream))//用全局内存初始化IStream接口指针 return false; if (S_OK != OleLoadPicture(pIStream, 0, false, IID_IPicture, (LPVOID*)&(pIPicture)))//用OleLoadPicture获得IPicture接口指针 { ::GlobalFree(picInfo->_hGlobal); pIStream->Release(); return false; } //得到IPicture COM接口对象后,就可以进行获得图片信息,显示图片等操作 pIPicture->get_Width(&picInfo->_cx); pIPicture->get_Height(&picInfo->_cy); picInfo->_iStream = pIStream; picInfo->_iPic = pIPicture; picInfo->_x = picInfo->_y = 0; picInfo->_strFilePath = strFullPath; } catch (...) { return false; } return true; }
IPicture* CEnBitmap::LoadFromBuffer(BYTE* pBuff, int nSize) { HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, nSize); void* pData = GlobalLock(hGlobal); memcpy2(pData, pBuff, nSize); GlobalUnlock(hGlobal); IStream* pStream = NULL; IPicture* pPicture = NULL; if (CreateStreamOnHGlobal(hGlobal, TRUE, &pStream) == S_OK) { OleLoadPicture(pStream, nSize, FALSE, IID_IPicture, (LPVOID *)&pPicture); pStream->Release(); } return pPicture; // caller releases }
HRESULT CPicStatic::ShowJpeg(LPVOID picData,DWORD dwFileSize,int x, int y,CDC *pDC) { IStream *pStm; IPicture *pPic; BOOL bResult; HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize); LPVOID pvData = NULL; if (hGlobal == NULL) return false; pvData = GlobalLock(hGlobal); if ( pvData == NULL) return false; memcpy(pvData,picData,dwFileSize); GlobalUnlock(hGlobal); CreateStreamOnHGlobal(hGlobal, TRUE, &pStm); bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic); if(FAILED(bResult)) { // CloseHandle(hFile); return false; } OLE_XSIZE_HIMETRIC hmWidth; OLE_YSIZE_HIMETRIC hmHeight; pPic->get_Width(&hmWidth); pPic->get_Height(&hmHeight); //将图形输出到屏幕上(有点像BitBlt) bResult=pPic->Render(pDC->m_hDC,0,0,x,y,0,hmHeight,hmWidth,-hmHeight,NULL); // CloseHandle(hFile); pStm->Release(); pPic->Release(); if (SUCCEEDED(bResult)) { return S_OK; } else { return E_FAIL; } }
//从HGLOBAL数据结构解码得到jpg对象 IPicture *getPicFromHGlobal(HGLOBAL global) { IStream *pStm = NULL; IPicture *pPic = NULL; HRESULT hr = CreateStreamOnHGlobal(global, TRUE, &pStm); if (hr != S_OK) { return NULL; } hr = OleLoadPicture(pStm, 0, false, IID_IPicture, (LPVOID*)&pPic); if (hr != S_OK) { return NULL; } return pPic; }
void CCommon::DrawFaceImageMin(CStatic *m_picBox,unsigned char *image,unsigned long int size) { CRect rect; m_picBox->GetClientRect(&rect);//获得pictrue控件所在的举行区域 CDC *pDC=m_picBox->GetDC();//获得pictrue控件的DC IPicture *pPic;//定义显示图片的接口(可显示jpg格式图片) HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,size);//分配内存空间 void *pData=GlobalLock(hGlobal);//定义图象数据指针 memcpy(pData,image,size); GlobalUnlock(hGlobal);//释放内存空间 IStream *pStream=NULL;//定义数据流指针 //创建数据流 if(CreateStreamOnHGlobal(hGlobal,TRUE,&pStream)==S_OK) { //装载图象文件 if(SUCCEEDED(OleLoadPicture(pStream,size,TRUE,IID_IPicture,(LPVOID*)&pPic))) { OLE_XSIZE_HIMETRIC hmWidth; OLE_XSIZE_HIMETRIC hmHeight; pPic->get_Width(&hmWidth);//获得图象真实宽度 pPic->get_Height(&hmHeight);//获得图象真实高度 //在控件上显示图片 pPic->Render(*pDC,4,4,rect.Width()-8,rect.Height()-8,0,hmHeight,hmWidth,-hmHeight,NULL); pPic->Release(); pStream->Release();//释放数据流 } } if(hGlobal) { GlobalFree(hGlobal); hGlobal = NULL; } m_picBox-> ReleaseDC(pDC); }
bool Bitmap::loadPicture(LPCTSTR pszFilename) { // Loads an image using the IPicture COM interface. // Supported image formats: BMP, EMF, GIF, ICO, JPG, WMF, TGA. // // Based on code from MSDN Magazine, October 2001. // http://msdn.microsoft.com/msdnmag/issues/01/10/c/default.aspx // IPicture interface doesn't support TGA files. if (_tcsstr(pszFilename, _T(".TGA")) || _tcsstr(pszFilename, _T(".tga"))) return loadTarga(pszFilename); HRESULT hr = 0; HANDLE hFile = 0; HGLOBAL hGlobal = 0; IStream *pIStream = 0; IPicture *pIPicture = 0; BYTE *pBuffer = 0; DWORD dwFileSize = 0; DWORD dwBytesRead = 0; LONG lWidth = 0; LONG lHeight = 0; if (!m_logpixelsx && !m_logpixelsy) { HDC hScreenDC = CreateCompatibleDC(GetDC(0)); if (!hScreenDC) return false; m_logpixelsx = GetDeviceCaps(hScreenDC, LOGPIXELSX); m_logpixelsy = GetDeviceCaps(hScreenDC, LOGPIXELSY); DeleteDC(hScreenDC); } hFile = CreateFile(pszFilename, FILE_READ_DATA, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (hFile == INVALID_HANDLE_VALUE) return false; if (!(dwFileSize = GetFileSize(hFile, 0))) { CloseHandle(hFile); return false; } if (!(hGlobal = GlobalAlloc(GMEM_MOVEABLE | GMEM_NODISCARD, dwFileSize))) { CloseHandle(hFile); return false; } if (!(pBuffer = reinterpret_cast<BYTE*>(GlobalLock(hGlobal)))) { GlobalFree(hGlobal); CloseHandle(hFile); return false; } if (!ReadFile(hFile, pBuffer, dwFileSize, &dwBytesRead, 0)) { GlobalUnlock(hGlobal); GlobalFree(hGlobal); CloseHandle(hFile); return false; } GlobalUnlock(hGlobal); CloseHandle(hFile); if (FAILED(CreateStreamOnHGlobal(hGlobal, FALSE, &pIStream))) { GlobalFree(hGlobal); return false; } if (FAILED(OleLoadPicture(pIStream, 0, FALSE, IID_IPicture, reinterpret_cast<LPVOID*>(&pIPicture)))) { pIStream->Release(); GlobalFree(hGlobal); return false; } pIStream->Release(); GlobalFree(hGlobal); pIPicture->get_Width(&lWidth); pIPicture->get_Height(&lHeight); width = MulDiv(lWidth, m_logpixelsx, HIMETRIC_INCH); height = MulDiv(lHeight, m_logpixelsy, HIMETRIC_INCH); if (!create(width, height)) { pIPicture->Release(); return false; } selectObject(); hr = pIPicture->Render(dc, 0, 0, width, height, 0, lHeight, lWidth, -lHeight, 0); deselectObject(); pIPicture->Release(); return (SUCCEEDED(hr)) ? true : false; }
// // Entry point for conversion // UT_Error IE_ImpGraphic_Win32Native::_convertGraphic(UT_ByteBuf * pBB, std::string& mimetype) { IPicture* pPicture = NULL; IStream* stream; HGLOBAL hG; HBITMAP hBitmap; OLE_HANDLE* hB; PBITMAPINFO bi; UT_ByteBuf bBufBMP; UT_Error err; /* If the system has GDI+, use it*/ if (isGDIPlusAvailable()) { m_pBB = new UT_ByteBuf(); return GDIconvertGraphic(pBB, m_pBB, mimetype); } // the code below always writes out PNG's for now; we could update it to support // native JPEG images as well, or just delete it and always use GDI+. mimetype = "image/png"; // We need to store the incoming bytebuffer in a Windows global heap size_t nBlockLen = pBB->getLength(); hG = GlobalAlloc(GPTR, nBlockLen); if (!hG) return UT_IE_NOMEMORY; CopyMemory(hG, pBB->getPointer(0), nBlockLen); // Create a stream from heap HRESULT hr = CreateStreamOnHGlobal(hG,false,&stream); if (!SUCCEEDED(hr) || !stream) { GlobalFree(hG); return UT_IE_NOMEMORY; } hr = OleLoadPicture(stream,0,false,IID_IPicture,(void**)&pPicture); stream->Release(); GlobalFree(hG); if (!SUCCEEDED(hr) || !pPicture) { return UT_IE_UNKNOWNTYPE; } pPicture->get_Handle((unsigned int*)&hB); hBitmap = (HBITMAP)CopyImage(hB,IMAGE_BITMAP,0,0,LR_COPYRETURNORG); HWND hWnd = GetDesktopWindow(); // Create a BMP file from a BITMAP bi = CreateBitmapInfoStruct(hBitmap); CreateBMPFile(hWnd, bBufBMP, bi, hBitmap, GetDC(hWnd)); LocalFree ((HLOCAL)bi); InitializePrivateClassData(); /* Read Header Data */ err = Read_BMP_Header(&bBufBMP); /* It's not a bitmap, then we have to rendered it into a device context and get a bitmap from there. Case wmf graphics */ if (err) { if (err!=UT_IE_BOGUSDOCUMENT) { pPicture->Release(); return err; } long nWidth = 0; long nHeight = 0; long nScaleToWidth= 500; long nScaleToHeight= 500; RECT rc, rect; BYTE *imagedata; HBITMAP hBit; HBITMAP hOld; BITMAPINFO bmi; HDC hWndDC = GetDC(hWnd); HDC hMemDC = CreateCompatibleDC(hWndDC); HBRUSH hBrush = (HBRUSH)GetCurrentObject(hMemDC, OBJ_BRUSH); pPicture->get_Width (&nWidth); pPicture->get_Height(&nHeight); bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi.bmiHeader.biWidth = nScaleToWidth; bmi.bmiHeader.biHeight = nScaleToHeight; bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biBitCount = 24; // as we want true-color bmi.bmiHeader.biCompression = BI_RGB; // no compression bmi.bmiHeader.biSizeImage = (((bmi.bmiHeader.biWidth * bmi.bmiHeader.biBitCount + 31) & ~31) >> 3) * bmi.bmiHeader.biHeight; bmi.bmiHeader.biXPelsPerMeter = 0; bmi.bmiHeader.biYPelsPerMeter = 0; bmi.bmiHeader.biClrImportant = 0; bmi.bmiHeader.biClrUsed = 0; // we are not using palette hBit = CreateDIBSection(hMemDC,&bmi,DIB_RGB_COLORS,(void**)&imagedata,0,0); hOld = (HBITMAP) SelectObject(hMemDC, hBit); rect.left = 0; rect.top = nScaleToHeight; rect.right = nScaleToWidth; rect.bottom = 0; FillRect(hMemDC, &rect, hBrush); pPicture->Render(hMemDC, 0,0, nScaleToWidth, nScaleToHeight, 0, nHeight, nWidth, -nHeight, &rc); hBit = (HBITMAP)SelectObject(hMemDC, hOld); bi = CreateBitmapInfoStruct(hBit); CreateBMPFile(hWnd, bBufBMP, &bmi, hBit, hMemDC); LocalFree ((HLOCAL)bi); DeleteDC(hMemDC); DeleteDC(hWndDC); DeleteObject(hBrush); DeleteObject(hBit); err = Read_BMP_Header(&bBufBMP); if (err) { pPicture->Release(); return err; } } pPicture->Release(); if ((err = Initialize_PNG())) { return err; } /* Read Palette, if no palette set Header accordingly */ if(m_iBitsPerPlane < 24) { if ((err = Convert_BMP_Palette(&bBufBMP))) return err; } else { UT_uint16 bitsPerChannel; UT_uint16 colorType; if (m_iBitsPerPlane == 24) { bitsPerChannel = 8; colorType = PNG_COLOR_TYPE_RGB; } else if (m_iBitsPerPlane == 32) { bitsPerChannel = 8; colorType = PNG_COLOR_TYPE_RGB_ALPHA; } else if (m_iBitsPerPlane == 48) { bitsPerChannel = 16; colorType = PNG_COLOR_TYPE_RGB; } else if (m_iBitsPerPlane == 64) { bitsPerChannel = 16; colorType = PNG_COLOR_TYPE_RGB_ALPHA; } else { return UT_ERROR; } png_set_IHDR ( m_pPNG, m_pPNGInfo, m_iWidth, m_iHeight, bitsPerChannel, colorType, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT ); } if ((err = Convert_BMP(&bBufBMP))) { return err; } /* Clean Up Memory Used */ FREEP(m_pPNGInfo->palette); png_destroy_write_struct(&m_pPNG, &m_pPNGInfo); return UT_OK; }
/** *\fn HDC AddImageDC(int id, const char *filename) *\brief Ìí¼ÓJPGͼÏñDC *\param[in] int id ͼÏñDCÐòºÅ *\param[in] const char * filename JPGͼƬ·¾¶ *\return JPGͼÏñDC¾ä±ú */ HDC CXTDC::AddImageDC(int id, const char *filename) { DeleteDC(IMAGEDC, id); SECURITY_ATTRIBUTES sa; sa.nLength = sizeof(sa); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; HANDLE hFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, &sa, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) return NULL; DWORD dwFileSize = GetFileSize(hFile, NULL); HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize); if (NULL == hGlobal) return false; LPVOID pvData = GlobalLock(hGlobal);// Ëø¶¨ÄÚ´æ if (NULL == pvData) { GlobalFree(hGlobal); return NULL; } DWORD dwReadLen = 0; if (!ReadFile(hFile, pvData, dwFileSize, &dwReadLen, NULL)) { GlobalFree(hGlobal); CloseHandle(hFile); return false; } if (dwReadLen != dwFileSize) { GlobalFree(hGlobal); CloseHandle(hFile); return false; } GlobalUnlock(hGlobal); CloseHandle(hFile); CComPtr<IStream> spStream = NULL; HRESULT hr = ::CreateStreamOnHGlobal(hGlobal, TRUE, &spStream);// ½¨Á¢IStream if (!SUCCEEDED(hr)) { GlobalFree(hGlobal); return NULL; } CComPtr<IPicture> spPicture; hr = OleLoadPicture(spStream, dwFileSize, FALSE, IID_IPicture, (LPVOID*)&spPicture);// ½¨Á¢IPicture if (!SUCCEEDED(hr)) { GlobalFree(hGlobal); return NULL; } GlobalFree(hGlobal); OLE_HANDLE picHandle = NULL; spPicture->get_Handle(&picHandle); XTDC xtDC; xtDC.dc = CreateCompatibleDC(NULL); xtDC.image = (HGDIOBJ)picHandle; xtDC.oldImage = SelectObject(xtDC.dc, xtDC.image); imageDcMap_[id] = xtDC; return xtDC.dc; }
/** *\fn HDC AddImageDC(int id, int resId) *\brief Ìí¼ÓJPGͼÏñDC *\param[in] int id ͼÏñDCÐòºÅ *\param[in] int resId ×ÊÔ´ID *\return JPGͼÏñDC¾ä±ú */ HDC CXTDC::AddImageDC(int id, int resId) { DeleteDC(IMAGEDC, id); HRSRC res = FindResource(module_, MAKEINTRESOURCE(resId), _T("jpg")); HGLOBAL resData = LoadResource(module_, (HRSRC)res); DWORD resSize = SizeofResource(module_, (HRSRC)res); if (NULL == resData) { return NULL; } HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, resSize); if (NULL == hGlobal) { return NULL; } LPVOID pvData = GlobalLock(hGlobal);// Ëø¶¨ÄÚ´æ if (NULL == pvData) { FreeResource(resData); GlobalFree(hGlobal); return NULL; } LockResource(resData); // Ëø¶¨×ÊÔ´ memcpy(pvData, resData, resSize); // ÔØÈëÄÚ´æ GlobalUnlock(hGlobal); // ½âËøÄÚ´æ FreeResource(resData); // ÊÍ·Å×ÊÔ´ CComPtr<IStream> spStream = NULL; HRESULT hr = ::CreateStreamOnHGlobal(hGlobal, TRUE, &spStream); // ½¨Á¢IStream if (!SUCCEEDED(hr)) { GlobalFree(hGlobal); return NULL; } CComPtr<IPicture> spPicture; hr = OleLoadPicture(spStream, resSize, FALSE, IID_IPicture, (LPVOID*)&spPicture); // ½¨Á¢IPicture if (!SUCCEEDED(hr)) { GlobalFree(hGlobal); return NULL; } GlobalFree(hGlobal); OLE_HANDLE picHandle = NULL; spPicture->get_Handle(&picHandle); XTDC xtDC; xtDC.dc = CreateCompatibleDC(NULL); xtDC.image = (HGDIOBJ)picHandle; xtDC.oldImage = SelectObject(xtDC.dc, xtDC.image); imageDcMap_[id] = xtDC; return xtDC.dc; }
UINT Enconn::ConnectThread(LPVOID pParam)//接收线程 { int rcvLen = 0; int nDataLen = 0; int recvedlen =0; char pData[256] = {0}; unsigned char msgcmd=0; IPicture *pPic; IStream *pStm; HGLOBAL hMem; LPVOID lpBuf; HDC hdc; HWND hwnd; MSGHEAD head; CString finename; int pptindex=0; Enconn* pEnconn = (Enconn*) pParam; pEnconn->m_hSocket = socket(AF_INET,SOCK_STREAM,0); struct sockaddr_in client_addr; client_addr.sin_family = AF_INET; client_addr.sin_addr.s_addr = inet_addr(pEnconn->m_pAddr); client_addr.sin_port = htons(PORT); int nSize = 4000; pEnconn->PostMessage(RM_ST_CONNING,0);//给窗体发送消息 setsockopt(pEnconn->m_hSocket, SOL_SOCKET, SO_RCVTIMEO, (char *)&nSize ,sizeof(nSize)); //设置socket接收超时,4秒钟 if(connect(pEnconn->m_hSocket, (LPSOCKADDR)&client_addr, sizeof(client_addr)) != 0) { pEnconn->PostMessage(RM_ST_FAIL,NULL); closesocket(pEnconn->m_hSocket); pEnconn->m_hSocket=0; return 0; } pEnconn->Connflag=1; pEnconn->PostMessage(RM_ST_SUCCESS,0); if(pEnconn->Enctype==1)//ENC1200 { pEnconn->PackHeaderMSG((BYTE *)pData, MSG_PASSWORD, (HEAD_LEN+1+_tcslen(pEnconn->m_pPassword))); pData[HEAD_LEN]='A';//表示管理员 WideCharToMultiByte(CP_ACP,NULL,pEnconn->m_pPassword,_tcslen(pEnconn->m_pPassword),&pData[HEAD_LEN+1],8,NULL,FALSE); rcvLen=pEnconn->Send((char*)pData,HEAD_LEN+1+_tcslen(pEnconn->m_pPassword));//发送密码 } else//ENC110 { *(short*)(&pData)=htons(4+_tcslen(pEnconn->m_pPassword)); pData[2]=MSG_PASSWORD; pData[3]='A';//表示管理员 WideCharToMultiByte(CP_ACP,NULL,pEnconn->m_pPassword,_tcslen(pEnconn->m_pPassword),&pData[4],8,NULL,FALSE); rcvLen=pEnconn->Send((char*)pData,4+_tcslen(pEnconn->m_pPassword));//发送密码 } if(rcvLen==-1)goto Exit; while(pEnconn->m_hSocket>0) { int nn = GetTickCount(); if(pEnconn->Enctype==1)//ENC1200 { rcvLen=pEnconn->Recv((char*)pEnconn->m_cVideoBuffer, HEAD_LEN);//接收编码器的数据 } else//ENC110 { rcvLen=pEnconn->Recv((char*)pEnconn->m_cVideoBuffer, 2);//接收编码器的数据 } if(rcvLen == -1) { goto Exit; } if(pEnconn->Enctype==1)//ENC1200 { memcpy(&head,(pEnconn->m_cVideoBuffer),HEAD_LEN); nDataLen=ntohs(head.nLen)-HEAD_LEN; if(nDataLen < 0)goto Exit; rcvLen=pEnconn->Recv((char*)pEnconn->m_cVideoBuffer, nDataLen); msgcmd=head.nMsg; } else//ENC110 { nDataLen=htons(*((unsigned short*)(pEnconn->m_cVideoBuffer)))-2; if(nDataLen < 1)goto Exit; rcvLen=pEnconn->Recv((char*)pEnconn->m_cVideoBuffer, nDataLen); msgcmd=pEnconn->m_cVideoBuffer[0]; } if(rcvLen == -1) { goto Exit; } switch(msgcmd) { case MSG_CONNECTSUCC: (pEnconn->m_RichEdit)->SetWindowTextW(_T("链接成功")); break; case MSG_PASSWORD_ERR: pEnconn->PostMessage(RM_PASSWD_ERR,NULL); (pEnconn->m_RichEdit)->SetWindowTextW(_T("密码错误")); break; case MSG_MAXCLIENT_ERR: (pEnconn->m_RichEdit)->SetSel(-1,-1); (pEnconn->m_RichEdit)->ReplaceSel(_T("最大客户数\n"),0); break; case MSG_SCREENDATA: //(pEnconn->m_RichEdit)->SetSel(-1,-1); //(pEnconn->m_RichEdit)->ReplaceSel(_T("h264 Data\n"),0); //(pEnconn->m_RichEdit)->SetWindowTextW(_T("h264")); //printf("Recv h264 Data\n"); if(pEnconn->saveStream==1) { if(pEnconn->Enctype==1)//ENC1200 pEnconn->H264File.Write((char*)pEnconn->m_cVideoBuffer+sizeof(FRAMEHEAD),nDataLen-sizeof(FRAMEHEAD)); else pEnconn->H264File.Write((char*)pEnconn->m_cVideoBuffer+1+sizeof(DataHeader),nDataLen-1-sizeof(DataHeader)); } break; case MSG_AUDIODATA: //(pEnconn->m_RichEdit)->SetSel(-1,-1); //(pEnconn->m_RichEdit)->ReplaceSel(_T("AAC Data\n"),0); //printf("Recv AAC Data\n"); if(pEnconn->saveStream==1) { if(pEnconn->Enctype==1)//ENC1200 pEnconn->AacFile.Write((char*)pEnconn->m_cVideoBuffer+sizeof(FRAMEHEAD),nDataLen-sizeof(FRAMEHEAD)); else pEnconn->AacFile.Write((char*)pEnconn->m_cVideoBuffer+1+sizeof(DataHeader),nDataLen-1-sizeof(DataHeader)); } break; case MSG_SYSPARAMS: printf("Recv MSG_SYSPARAMS \n"); break; case MSG_TRACKAUTO: printf("Recv MSG_TRACKAUTO \n"); break; case MSG_DATAINFO: printf("Recv MSG_DATAINFO \n"); break; case MSG_LOW_BITRATE: printf("Recv LowStream ok \n"); break; case MSG_LOW_SCREENDATA: printf("Recv LowStream Data\n"); break; case MSG_PIC_DATA: //memcpy(&nDataLen, &pEnconn->m_cVideoBuffer[1],sizeof(nDataLen)); memcpy(&nDataLen, (char*)pEnconn->m_cVideoBuffer+1,sizeof(nDataLen)); printf("PPT索引图片=%d 字节\n", nDataLen); //hMem = ::GlobalAlloc(GMEM_MOVEABLE,nDataLen); //lpBuf = ::GlobalLock(hMem); rcvLen = pEnconn->Recv((char*)pEnconn->m_cVideoBuffer+4, nDataLen); finename.Format(_T("%d.jpg"),pptindex); if (!(pEnconn->JpgFile.Open(finename,CFile::modeCreate | CFile::modeWrite))) { printf("open jpegFile fail! \n"); pptindex++; break; } pEnconn->JpgFile.Write((char*)pEnconn->m_cVideoBuffer+4,nDataLen); pEnconn->JpgFile.Close(); pptindex++; hMem = ::GlobalAlloc(GMEM_MOVEABLE,nDataLen); lpBuf = ::GlobalLock(hMem); memcpy(lpBuf,(char*)pEnconn->m_cVideoBuffer+4,nDataLen); ::GlobalUnlock(hMem); ::CreateStreamOnHGlobal(hMem, TRUE, &pStm); //装入图形文件 if(SUCCEEDED(OleLoadPicture(pStm,nDataLen,TRUE,IID_IPicture,(LPVOID*)&pPic))) { OLE_XSIZE_HIMETRIC hmWidth; OLE_YSIZE_HIMETRIC hmHeight; pPic->get_Width(&hmWidth); //用接口方法获得图片的宽和高 pPic->get_Height(&hmHeight); printf("PPTJPEG=%d=%d\n",hmWidth,hmHeight); //获取桌面窗口句柄 hwnd = ::GetDesktopWindow(); //获取桌面窗口DC hdc = ::GetWindowDC(hwnd); CRect rect; CDC *pDC=CDC::FromHandle(hdc); //////显示原图大小///////////////////////////////////////////////////////////// CSize sz(hmWidth,hmHeight); pDC->HIMETRICtoDP(&sz); //转换MM_HIMETRIC模式单位为MM_TEXT像素单位 pPic->Render(hdc,80,80,sz.cx,sz.cy,0,hmHeight,hmWidth,-hmHeight,NULL); //按窗口尺寸显示/////////////////// GetClientRect(hwnd,&rect); if(pPic) pPic->Release(); ::ReleaseDC(hwnd, hdc); } pStm->Release(); printf("Recv PPT Data\n"); break; case MSG_GET_LOGOINFO: printf("Recv MSG_GET_LOGOINFO \n"); break; case MSG_PIC_DATAEX: printf("Recv MSG_PIC_DATAEX \n"); recvedlen=0; break; default: break; } } Exit: pEnconn->Connflag=0; pEnconn->PostMessage(RM_DISCONN,NULL); return 1; }
LRESULT CVideoRecvTestDlg::OnProceVideo(WPARAM wParam, LPARAM lParam) { if(lParam == NULL) { return E_FAIL; } VideoFrameData* TmpVideo = (VideoFrameData*)lParam; switch(TmpVideo->dwVideoType) { case VIDEO_TYPE_H264_NORMAL_I: case VIDEO_TYPE_H264_NORMAL_P: { CString strMsg; strMsg.Format("DataLen = %d, ExtInfo = %s", TmpVideo->dwVideoDataLen, TmpVideo->pszVideoExInfo); HDC TempDC = ::GetDC(GetDlgItem(IDC_STATIC_VIDEO)->GetSafeHwnd()); SetBkMode(TempDC, 3); SetTextColor(TempDC, RGB(0, 128, 0)); Rectangle(TempDC, 10, 20, 700, 80); TextOut(TempDC, 20, 20, "H264CallBack FrameInfo:", 23); int ilen = strMsg.GetLength(); CString str1 = strMsg.Left(60); CString str2 = strMsg.Right(ilen - 60); TextOut(TempDC, 20, 40, str1.GetBuffer(), str1.GetLength()); TextOut(TempDC, 20, 60, str2.GetBuffer(), str2.GetLength()); //TextOut(TempDC, 20, 40, strMsg.GetBuffer(), strMsg.GetLength()); ::ReleaseDC(GetDlgItem(IDC_STATIC_VIDEO)->GetSafeHwnd(), TempDC); } break; case VIDEO_TYPE_H264_HISTORY_I: case VIDEO_TYPE_H264_HISTORY_P: { CString strMsg; strMsg.Format("DataLen = %d, ExtInfo = %s", TmpVideo->dwVideoDataLen, TmpVideo->pszVideoExInfo); HDC TempDC = ::GetDC(GetDlgItem(IDC_STATIC_VIDEO)->GetSafeHwnd()); SetBkMode(TempDC, 3); SetTextColor(TempDC, RGB(0, 128, 0)); Rectangle(TempDC, 10, 20, 700, 100); TextOut(TempDC, 20, 20, "H264CallBack FrameInfo:", 23); int ilen = strMsg.GetLength(); CString str1 = strMsg.Left(60); CString str2 = strMsg.Right(ilen - 60); TextOut(TempDC, 20, 40, str1.GetBuffer(), str1.GetLength()); TextOut(TempDC, 20, 60, str2.GetBuffer(), str2.GetLength()); //TextOut(TempDC, 20, 40, strMsg.GetBuffer(), strMsg.GetLength()); char* pszTime = strstr(TmpVideo->pszVideoExInfo, "FrameTime:"); DWORD64 dw64TimeMS = 0; if(pszTime) { sscanf(pszTime, "FrameTime:%I64u", &dw64TimeMS); CTime cFrameTime(dw64TimeMS/1000); strMsg = cFrameTime.Format("%Y.%m.%d_%H:%M:%S"); TextOut(TempDC, 400, 60, strMsg.GetBuffer(), strMsg.GetLength()); } ::ReleaseDC(GetDlgItem(IDC_STATIC_VIDEO)->GetSafeHwnd(), TempDC); if(((dw64TimeMS/1000) >= m_dwEndTime)&&m_realfinish == false) { ::SendMessage(GetSafeHwnd(), WM_MESSAGE_GETFINISH, 0, 0); } } break; case VIDEO_TYPE_JPEG_HISTORY: { IStream* pStm = NULL; CreateStreamOnHGlobal(NULL, TRUE, &pStm); IPicture* picholder; LARGE_INTEGER liTempStar = {0}; pStm->Seek(liTempStar, STREAM_SEEK_SET, NULL); ULONG iWritten = NULL; pStm->Write(TmpVideo->pVideoData, TmpVideo->dwVideoDataLen, &iWritten); pStm->Seek(liTempStar, STREAM_SEEK_SET, NULL); if(FAILED(OleLoadPicture(pStm, TmpVideo->dwVideoDataLen, TRUE, IID_IPicture, (void**)&picholder))) { pStm->Release(); return 0; } HDC TempDC; TempDC = ::GetDC(GetDlgItem(IDC_STATIC_VIDEO)->GetSafeHwnd()); OLE_XSIZE_HIMETRIC hmWidth; OLE_YSIZE_HIMETRIC hmHeight; picholder->get_Width(&hmWidth); picholder->get_Height(&hmHeight); int nWidth =MulDiv(hmWidth, GetDeviceCaps(TempDC, LOGPIXELSX), 2540); int nHeight = MulDiv(hmHeight, GetDeviceCaps(TempDC, LOGPIXELSY), 2540); picholder->Render(TempDC, 0, 0, m_ShowFrameRect.right-m_ShowFrameRect.left, m_ShowFrameRect.bottom-m_ShowFrameRect.top, 0, hmHeight, hmWidth, -hmHeight, NULL); ::ReleaseDC(GetDlgItem(IDC_STATIC_VIDEO)->GetSafeHwnd(), TempDC); picholder->Release(); pStm->Release(); CString strMsg; strMsg.Format("DataLen = %d, ExtInfo = %s", TmpVideo->dwVideoDataLen, TmpVideo->pszVideoExInfo); TempDC = ::GetDC(GetDlgItem(IDC_STATIC_VIDEO)->GetSafeHwnd()); SetBkMode(TempDC, 3); SetTextColor(TempDC, RGB(0, 128, 0)); Rectangle(TempDC, 10, 220, 700, 280); TextOut(TempDC, 20, 220, "HistoryVideoCallback JPEG FrameInfo:", 23); TextOut(TempDC, 20, 240, strMsg.GetBuffer(), strMsg.GetLength()); char* pszTime = strstr(TmpVideo->pszVideoExInfo, "FrameTime:"); DWORD64 dw64TimeMS = 0; if(pszTime) { sscanf(pszTime, "FrameTime:%I64u", &dw64TimeMS); } CTime cFrameTime(dw64TimeMS/1000); strMsg = cFrameTime.Format("%Y.%m.%d_%H:%M:%S"); TextOut(TempDC, 20, 260, strMsg.GetBuffer(), strMsg.GetLength()); ::ReleaseDC(GetDlgItem(IDC_STATIC_VIDEO)->GetSafeHwnd(), TempDC); SetWindowText(strMsg.GetBuffer()); if(((dw64TimeMS/1000) >= m_dwEndTime)&&m_realfinish == false) { ::SendMessage(GetSafeHwnd(), WM_MESSAGE_GETFINISH, 0, 0); } } break; } return S_OK; }
__declspec(dllexport) bool ConvertWMFtoPNGA(char *bwmfName, char *bpngName, bool eraseTransparenz) { FILE *wmfFile, *pngFile; HGLOBAL hGlobal; DWORD dwSize; IPicture *image; int width, height; long hmWidth, hmHeight; BYTE *p1, *p2; int x, y; if (!(wmfFile = fopen(wmfName,"rb"))) return false; fseek(wmfFile, 0, SEEK_END); dwSize = ftell(wmfFile); fseek(wmfFile, 0, SEEK_SET); hGlobal = GlobalAlloc(GMEM_MOVEABLE | GMEM_NODISCARD, dwSize); if (!hGlobal) { fclose(wmfFile); return false; } char *pData = reinterpret_cast<char*>(GlobalLock(hGlobal)); if (!pData) { GlobalFree(hGlobal); fclose(wmfFile); return false; } if (fread(pData,1,dwSize,wmfFile) != dwSize) { GlobalFree(hGlobal); fclose(wmfFile); return false; } GlobalUnlock(hGlobal); fclose(wmfFile); IStream *pStream = NULL; if (CreateStreamOnHGlobal(hGlobal,TRUE,&pStream) != S_OK) return false; if (OleLoadPicture(pStream,dwSize,false,IID_IPicture, reinterpret_cast<LPVOID *>(&image)) != S_OK) { pStream->Release(); return false; } pStream->Release(); GlobalFree(hGlobal); image->get_Width(&hmWidth); image->get_Height(&hmHeight); width = MulDiv(hmWidth, 96, 2540); height = MulDiv(hmHeight, 96, 2540); BITMAPINFO *bitmapInfo = (BITMAPINFO *)NULL; bitmapInfo = (BITMAPINFO *)LocalAlloc(LMEM_FIXED|LMEM_ZEROINIT, sizeof(BITMAPINFO) ); bitmapInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bitmapInfo->bmiHeader.biWidth = width; bitmapInfo->bmiHeader.biHeight = height; bitmapInfo->bmiHeader.biPlanes = 1; bitmapInfo->bmiHeader.biBitCount = 32; bitmapInfo->bmiHeader.biCompression = BI_RGB; bitmapInfo->bmiHeader.biSizeImage = width * height * 4; PBYTE bitmapData1; HDC myHdc1 = CreateCompatibleDC(NULL); HBITMAP bitmap1 = CreateDIBSection(myHdc1, bitmapInfo, DIB_RGB_COLORS, (PVOID *) &bitmapData1, NULL, 0); SetStretchBltMode(myHdc1, HALFTONE); SelectObject(myHdc1, bitmap1); memset(bitmapData1, 0x00ffffff, 4 * width * height); PBYTE bitmapData2; HDC myHdc2 = CreateCompatibleDC(NULL); SetStretchBltMode(myHdc2, HALFTONE); HBITMAP bitmap2 = CreateDIBSection(myHdc2, bitmapInfo, DIB_RGB_COLORS, (PVOID *) &bitmapData2, NULL, 0); SelectObject(myHdc2, bitmap2); memset(bitmapData2, 0x00000000, 4 * width * height); image->Render(myHdc1, 0, 0, width, height, 0, hmHeight, hmWidth, -hmHeight, NULL); image->Render(myHdc2, 0, 0, width, height, 0, hmHeight, hmWidth, -hmHeight, NULL); int offTop = 0; int offLeft = 0; int offBottom = 0; int offRight = 0; if (eraseTransparenz) { for (y = 0; y < height; ++y) { p1 = bitmapData1 + (width*4*y); p2 = bitmapData2 + (width*4*y); for (x = 0; x < width; ++x) { transparent = true; if (*p1 == *p2) { if (*(p1+1) == *(p2+1)) { if (*(p1+2) == *(p2+2)) { transparent = false; break; } } } p1 += 4; p2 += 4; } if (!transparent) break; } offTop = y; for (x = 0; x < width; ++x) { p1 = bitmapData1 + (x*4); p2 = bitmapData2 + (x*4); for (y = 0; y < height; ++y) { transparent = true; if (*p1 == *p2) { if (*(p1+1) == *(p2+1)) { if (*(p1+2) == *(p2+2)) { transparent = false; break; } } } p1 += (4*width); p2 += (4*width); } if (!transparent) break; } offLeft = x; for (y = height-1; y >= 0; --y) { p1 = bitmapData1 + y * (width * 4); p2 = bitmapData2 + y * (width * 4); for (x = 0; x < width; ++x) { transparent = true; if (*p1 == *p2) { if (*(p1+1) == *(p2+1)) { if (*(p1+2) == *(p2+2)) { transparent = false; break; } } } p1 += 4; p2 += 4; } if (!transparent) break; } offBottom = height - y - 1; transparent = true; for (x = width-1; x >= 0; --x) { p1 = bitmapData1 + x*4; p2 = bitmapData2 + x*4; for (y = 0; y < height; ++y) { if (*p1 == *p2) { if (*(p1+1) == *(p2+1)) { if (*(p1+2) == *(p2+2)) { transparent = false; break; } } } p1 += width*4; p2 += width*4; } if (!transparent) break; } offRight = width - x - 1; } png_structp png_ptr; png_infop info_ptr; pngFile = fopen(pngName, "wb"); if (pngFile == NULL) return false; png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, (void *)pngName, NULL, NULL); if (png_ptr == NULL) { fclose(pngFile); return false; } info_ptr = png_create_info_struct(png_ptr); if (info_ptr == NULL) { fclose(pngFile); png_destroy_write_struct(&png_ptr, png_infopp_NULL); return false; } if (setjmp(png_jmpbuf(png_ptr))) { fclose(pngFile); png_destroy_write_struct(&png_ptr, &info_ptr); return false; } png_init_io(png_ptr, pngFile); int pngWidth = width - (offLeft + offRight); int pngHeight = height - (offTop + offBottom); png_set_IHDR(png_ptr, info_ptr, pngWidth, pngHeight, 8, PNG_COLOR_TYPE_RGB_ALPHA, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); int row_stride = 4 * pngWidth; info_ptr->pixel_depth = 32; info_ptr->channels = 4; info_ptr->bit_depth = 8; info_ptr->color_type = PNG_COLOR_TYPE_RGB_ALPHA; info_ptr->rowbytes = row_stride; png_write_info(png_ptr, info_ptr); BYTE *row_pointers = new BYTE[10+row_stride]; BYTE *q; for (y = 0; y < pngHeight; ++y) { q = row_pointers; p1 = bitmapData1 + (((height - 1) - (y + offBottom)) * width + offLeft) * 4; p2 = bitmapData2 + (((height - 1) - (y + offBottom)) * width + offLeft) * 4; for (x = 0; x < pngWidth; ++x) { transparent = true; if (*p1 == *p2) { if (*(p1+1) == *(p2+1)) { if (*(p1+2) == *(p2+2)) { transparent = false; } } } *q = *(p1+2); ++q; *q = *(p1+1); ++q; *q = *(p1); ++q; if (transparent) *q = 0; else *q = 255; ++q; p1 += 4; p2 += 4; } png_write_row(png_ptr, row_pointers); } delete [] row_pointers; png_write_end(png_ptr, info_ptr); png_destroy_write_struct(&png_ptr, &info_ptr); fclose(pngFile); if (bitmapInfo) LocalFree(bitmapInfo); DeleteObject(bitmap1); DeleteDC(myHdc1); DeleteObject(bitmap2); DeleteDC(myHdc2); return true; }
BOOL CPictureWnd::ShowPicture(char *pBuf, int nBufLen) { if (pBuf == NULL) { return FALSE; } if (m_hImageMemory != NULL) { GlobalFree(m_hImageMemory); m_hImageMemory = NULL; } BOOL bLock = m_csIPictrue.Lock(); if (bLock == TRUE && m_pIPicture != NULL) { m_pIPicture->Release(); m_pIPicture = NULL; } m_csIPictrue.Unlock(); // 给图片分配全局内存 m_hImageMemory = GlobalAlloc(GMEM_MOVEABLE, nBufLen); if (m_hImageMemory == NULL) { return FALSE; } void *pImageMemory = GlobalLock(m_hImageMemory); // 锁定内存 memcpy(pImageMemory, pBuf, nBufLen); GlobalUnlock(m_hImageMemory); // 解锁内存 // 创建一个IStream接口指针,用来保存图片流 LPSTREAM pIStream = NULL; HRESULT hr = CreateStreamOnHGlobal(m_hImageMemory, TRUE, &pIStream); // 用全局内存初使化IStream接口指针 _ASSERTE(SUCCEEDED(hr) && pIStream); // 创建一个IPicture接口指针,表示图片对象 try { bLock = m_csIPictrue.Lock(); if (bLock) { hr = OleLoadPicture(pIStream, nBufLen, FALSE, IID_IPicture, (LPVOID*)&(m_pIPicture)); // 用OleLoadPicture获得IPicture接口指针 } m_csIPictrue.Unlock(); } catch (CMemoryException* e) { MessageBox(ConvertString("Bad bmp file"),ConvertString("Prompt")); return FALSE; } catch (CFileException* e) { MessageBox(ConvertString("Bad bmp file"),ConvertString("Prompt")); return FALSE; } catch (CException* e) { MessageBox(ConvertString("Bad bmp file"),ConvertString("Prompt")); return FALSE; } _ASSERTE(SUCCEEDED(hr) && m_pIPicture); pIStream->Release(); m_nScale = 100; memset (&m_siVert, '\0', sizeof (SCROLLINFO)); memset (&m_siHorz, '\0', sizeof (SCROLLINFO)); m_siVert.cbSize = sizeof (SCROLLINFO); m_siHorz.cbSize = sizeof (SCROLLINFO); Invalidate(); return TRUE; }
LRESULT COldVideoRecvTestDlg::OnProceVideo(WPARAM wParam, LPARAM lParam) { if(lParam == NULL) { return E_FAIL; } VIDEO_PACKET_DATA* TmpVideo = (VIDEO_PACKET_DATA*)lParam; switch(TmpVideo->dwVideoType) { case VIDEO_TYPE_H264_NORMAL_I: case VIDEO_TYPE_H264_NORMAL_P: { CString strMsg; strMsg.Format("DataLen = %d, ExtInfo = %s", TmpVideo->dwVideoDataLen, TmpVideo->pszVideoExInfo); HDC TempDC = ::GetDC(GetDlgItem(IDC_STATIC_VIDEO)->GetSafeHwnd()); SetBkMode(TempDC, 3); SetTextColor(TempDC, RGB(0, 128, 0)); Rectangle(TempDC, 10, 20, 700, 80); TextOut(TempDC, 20, 20, "H264CallBack FrameInfo:", 23); int ilen = strMsg.GetLength(); CString str1 = strMsg.Left(60); CString str2 = strMsg.Right(ilen - 60); TextOut(TempDC, 20, 40, str1.GetBuffer(), str1.GetLength()); TextOut(TempDC, 20, 60, str2.GetBuffer(), str2.GetLength()); //TextOut(TempDC, 20, 40, strMsg.GetBuffer(), strMsg.GetLength()); ::ReleaseDC(GetDlgItem(IDC_STATIC_VIDEO)->GetSafeHwnd(), TempDC); } break; case VIDEO_TYPE_H264_HISTORY_I: case VIDEO_TYPE_H264_HISTORY_P: { CString strMsg; strMsg.Format("DataLen = %d, ExtInfo = %s", TmpVideo->dwVideoDataLen, TmpVideo->pszVideoExInfo); HDC TempDC = ::GetDC(GetDlgItem(IDC_STATIC_VIDEO)->GetSafeHwnd()); SetBkMode(TempDC, 3); SetTextColor(TempDC, RGB(0, 128, 0)); Rectangle(TempDC, 10, 20, 700, 100); TextOut(TempDC, 20, 20, "H264CallBack FrameInfo:", 23); int ilen = strMsg.GetLength(); CString str1 = strMsg.Left(60); CString str2 = strMsg.Right(ilen - 60); TextOut(TempDC, 20, 40, str1.GetBuffer(), str1.GetLength()); TextOut(TempDC, 20, 60, str2.GetBuffer(), str2.GetLength()); //TextOut(TempDC, 20, 40, strMsg.GetBuffer(), strMsg.GetLength()); char* pszTime = strstr(TmpVideo->pszVideoExInfo, "FrameTime:"); DWORD64 dw64TimeMS = 0; if(pszTime) { sscanf(pszTime, "FrameTime:%I64u", &dw64TimeMS); CTime cFrameTime(dw64TimeMS/1000); strMsg = cFrameTime.Format("%Y.%m.%d_%H:%M:%S"); TextOut(TempDC, 20, 60, strMsg.GetBuffer(), strMsg.GetLength()); } ::ReleaseDC(GetDlgItem(IDC_STATIC_VIDEO)->GetSafeHwnd(), TempDC); if((dw64TimeMS/1000) >= m_dwEndTime) { ::SendMessage(GetSafeHwnd(), WM_MESSAGE_GETFINISH, 0, 0); } } break; case VIDEO_TYPE_JPEG_HISTORY: { PBYTE pJPEGPos = NULL; DWORD dwJPEGDataLen = 0; int iRedLightCount = 0; int iRedLightBufPosLen = sizeof(RECT) * 20; PBYTE pRedLightPosBuf = new BYTE[iRedLightBufPosLen]; if(HVAPIUTILS_ParseHistoryVideoFrame(TmpVideo->pVideoData, TmpVideo->dwVideoDataLen, iRedLightCount, iRedLightBufPosLen, pRedLightPosBuf, pJPEGPos, dwJPEGDataLen) != S_OK) { return E_FAIL; } if(pJPEGPos == NULL || dwJPEGDataLen <= 0) { return E_FAIL; } int iEnhanceBufLen = 0; PBYTE pEnhanceBuf = NULL; if(m_iRedLightEnhanceFlag == 1) { iEnhanceBufLen = (1024 << 10); pEnhanceBuf = new BYTE[iEnhanceBufLen]; if(pEnhanceBuf) { if(HVAPIUTILS_TrafficLightEnhance(pJPEGPos, dwJPEGDataLen, iRedLightCount, pRedLightPosBuf, pEnhanceBuf, iEnhanceBufLen, m_iBrightness, m_iHueThreshold, m_CompressRate) != S_OK) { delete[] pEnhanceBuf; pEnhanceBuf = NULL; iEnhanceBufLen = 0; } } } IStream* pStm = NULL; CreateStreamOnHGlobal(NULL, TRUE, &pStm); IPicture* picholder; LARGE_INTEGER liTempStar = {0}; pStm->Seek(liTempStar, STREAM_SEEK_SET, NULL); ULONG iWritten = NULL; if(pEnhanceBuf) pStm->Write(pEnhanceBuf, iEnhanceBufLen, &iWritten); else pStm->Write(pJPEGPos, dwJPEGDataLen, &iWritten); pStm->Seek(liTempStar, STREAM_SEEK_SET, NULL); if(pEnhanceBuf) { if(FAILED(OleLoadPicture(pStm, iEnhanceBufLen, TRUE, IID_IPicture, (void**)&picholder))) { pStm->Release(); return E_FAIL; } } else { if(FAILED(OleLoadPicture(pStm, dwJPEGDataLen, TRUE, IID_IPicture, (void**)&picholder))) { pStm->Release(); return E_FAIL; } } HDC TempDC; TempDC = ::GetDC(GetDlgItem(IDC_STATIC_VIDEO)->GetSafeHwnd()); OLE_XSIZE_HIMETRIC hmWidth; OLE_YSIZE_HIMETRIC hmHeight; picholder->get_Width(&hmWidth); picholder->get_Height(&hmHeight); int nWidth =MulDiv(hmWidth, GetDeviceCaps(TempDC, LOGPIXELSX), 2540); int nHeight = MulDiv(hmHeight, GetDeviceCaps(TempDC, LOGPIXELSY), 2540); picholder->Render(TempDC, 0, 0, m_ShowFrameRect.right-m_ShowFrameRect.left, m_ShowFrameRect.bottom-m_ShowFrameRect.top, 0, hmHeight, hmWidth, -hmHeight, NULL); ::ReleaseDC(GetDlgItem(IDC_STATIC_VIDEO)->GetSafeHwnd(), TempDC); picholder->Release(); pStm->Release(); CString strMsg; strMsg.Format("DataLen = %d, ExtInfo = %s", TmpVideo->dwVideoDataLen, TmpVideo->pszVideoExInfo); TempDC = ::GetDC(GetDlgItem(IDC_STATIC_VIDEO)->GetSafeHwnd()); SetBkMode(TempDC, 3); SetTextColor(TempDC, RGB(0, 128, 0)); Rectangle(TempDC, 10, 220, 700, 280); TextOut(TempDC, 20, 220, "HistoryVideoCallback JPEG FrameInfo:", 23); TextOut(TempDC, 20, 240, strMsg.GetBuffer(), strMsg.GetLength()); char* pszTime = strstr(TmpVideo->pszVideoExInfo, "FrameTime:"); DWORD64 dw64TimeMS = 0; if(pszTime) { sscanf(pszTime, "FrameTime:%I64u", &dw64TimeMS); } CTime cFrameTime(dw64TimeMS/1000); strMsg = cFrameTime.Format("%Y.%m.%d_%H:%M:%S"); TextOut(TempDC, 20, 260, strMsg.GetBuffer(), strMsg.GetLength()); ::ReleaseDC(GetDlgItem(IDC_STATIC_VIDEO)->GetSafeHwnd(), TempDC); SetWindowText(strMsg.GetBuffer()); if((dw64TimeMS/1000) >= m_dwEndTime) { ::SendMessage(GetSafeHwnd(), WM_MESSAGE_GETFINISH, 0, 0); } } break; } return S_OK; }