现在的位置: 首页 > 综合 > 正文

win32对jpg、gif图像的读取

2013年10月14日 ⁄ 综合 ⁄ 共 3358字 ⁄ 字号 评论关闭
Code:
  1. // 打开图像文件并显示   
  2. BOOL LoadPicture(char * lpFilePath, HWND hwnd)   
  3. {   
  4.         // 文件句柄   
  5.         HANDLE FileHandle;   
  6.         // 高位数据、低位数据   
  7.         DWORD SizeH,SizeL,ReadCount;   
  8.            
  9.         IStream * pstream=NULL;   
  10.         IPicture * pPic=NULL;   
  11.         // 以读的方式打开图像   
  12.         FileHandle=CreateFile(lpFilePath,   
  13.              GENERIC_READ,   
  14.              FILE_SHARE_READ,   
  15.              NULL,   
  16.              OPEN_EXISTING,   
  17.              FILE_ATTRIBUTE_NORMAL,NULL   
  18.              );   
  19.         // 打开失败   
  20.         if(FileHandle==INVALID_HANDLE_VALUE)   
  21.            return FALSE;   
  22.         // 获取图像文件大小   
  23.         SizeL=GetFileSize(FileHandle,&SizeH);   
  24.         // 为图像文件   
  25.         // 分配一个可移动的全局的堆内存   
  26.         HGLOBAL pBuffer = GlobalAlloc(GMEM_MOVEABLE, SizeL);   
  27.         // 分配对内存失败   
  28.         if(pBuffer==NULL)   
  29.         {   
  30.            CloseHandle(FileHandle);   
  31.            return FALSE;   
  32.         }   
  33.         // 指向堆内存的指针转换为通用的指针类型相当于解锁   
  34.         LPVOID pDes =GlobalLock(pBuffer);   
  35.   
  36.         // 读入数据进堆内存   
  37.         if(ReadFile(FileHandle,pDes,SizeL,&ReadCount,NULL)==0)   
  38.         {   
  39.            CloseHandle(FileHandle);   
  40.            GlobalUnlock(pBuffer);   
  41.            free(pBuffer);   
  42.            return FALSE;   
  43.         }   
  44.   
  45.         // 堆内存上锁   
  46.         GlobalUnlock(pBuffer);   
  47.                
  48.         // 在全局存储器的堆中分配一个流对象   
  49.         if(CreateStreamOnHGlobal(pBuffer,true,&pstream)!=S_OK)   
  50.         {   
  51.            CloseHandle(FileHandle);   
  52.            free(pBuffer);   
  53.            return FALSE;   
  54.         }   
  55.   
  56.         // 创建一个新的图像并初始化   
  57.         if(!SUCCEEDED(OleLoadPicture(pstream,SizeL,true,IID_IPicture,(void**)&pPic)))   
  58.         {   
  59.            MessageBox(0,"Call OleLoadPicture Fail","Error",0);   
  60.            return FALSE;   
  61.         }   
  62.         // 获取句柄   
  63.     //  HWND hwnd=GetDlgItem(MainHwnd,PID_PICTURE);   
  64.         // 创建画布   
  65.             HDC hdc= GetDC(hwnd);    
  66.             // 高和宽   
  67.             long hmWidth;   
  68.             long hmHeight;   
  69.             // 从IPicture中获取高度与宽度   
  70.             pPic->get_Width(&hmWidth);   
  71.             pPic->get_Height(&hmHeight);   
  72.                
  73.             //    
  74.             int nWidth = MulDiv(hmWidth, GetDeviceCaps(hdc, LOGPIXELSX), 2540);   
  75.             int nHeight = MulDiv(hmHeight, GetDeviceCaps(hdc, LOGPIXELSY), 2540);   
  76.             //    
  77.             //SetWindowPos(hwnd, HWND_TOP, 0,0,nWidth/2,nHeight/2,SWP_FRAMECHANGED);   
  78.             if (nWidth<600 && nHeight <600)   
  79.             //MoveWindow(hwnd, (600-nWidth)/2,(600-nHeight)/2, nWidth, nHeight, FALSE);   
  80.             SetWindowPos(hwnd, HWND_TOP,(600-nWidth)/2,(600-nHeight)/2, nWidth, nHeight,SWP_FRAMECHANGED);   
  81.             else    
  82.             {   
  83.                 int large = nWidth>nHeight?nWidth:nHeight;   
  84.                 float k = 600;   
  85.                 float x = k/(large*1.0);   
  86.                 int newx = (int)(x*nWidth);   
  87.                 int newy = (int)(x*nHeight);   
  88.                 SetWindowPos(hwnd, HWND_BOTTOM, 1,50, newx,newy, SWP_FRAMECHANGED);   
  89.             }   
  90.             RECT rc;   
  91.             GetClientRect(hwnd, &rc);   
  92.             pPic->Render(hdc, 0, 0, rc.right-rc.left,rc.bottom-rc.top, 0,hmHeight, hmWidth,-hmHeight, NULL);   
  93.   
  94.         //  TransparentBlt(0,0, 0, rc.right-rc.left, rc.bottom-rc.top, hDC, 0, 0,  nWidth, nHeight, RGB(255,   255,   255));   
  95.             // 释放空间   
  96.             pPic->Release();   
  97.             pstream->Release();   
  98.             ReleaseDC(hwnd,hdc);   
  99.             CloseHandle(FileHandle);   
  100. }   

 

抱歉!评论已关闭.