| 
 | 
原帖由 slore 于 2010-3-20 22:49 发表   
没有现成的,有现成intel jpeg libray库。 
找个时间试下。现学现卖,都是google找 
相关函数,自己乱整合的。 
 
既然内核mspaint,干嘛把关联给精简了? 
预览,右键都不能直接编辑了。。。   
 
右键关联没注意,有空我把它还原回去 
 
img1.Picture.Assign(Clipboard);  
img1.Picture.SaveToFile( "c:\11.jpg ");  
 
delphi的好方便啊...就是delphi出来的程序还是比较大 
 
vb最牛,记得以前老师布置作业,要求写一个算法,两种显示方式,一种是直接运算显示结果,一种是加上延迟,要看到算法的运作过程的效果 
结果我用vb写好,没有加任何延迟就“实现”了延迟的效果,直接显示结果没法实现,因为实在是太慢了,最后我想了个办法,不用运算,反正结果是知道的,直接显示给老师看,他也不看代码,只看显示器,顺利通过了 
 
找来找去,好像vc都是只有保存为bmp的源代码,vb和delphi本身有函数,很容易实现 
shimgvw.dll应该有相关函数才对啊,貌似vc应该可以直接调用的 
 
以下代码保存剪贴板中的位图到文件    
     
  BOOL   SaveBitmap(const   BITMAP   &bm,HDC   hDC,HBITMAP   hBitmap,LPCTSTR   szFileName)    
  {    
     
  int   nBitPerPixel   =   bm.bmBitsPixel;//获得颜色模式    
          int   nW   =   bm.bmWidth;    
          int   nH   =   bm.bmHeight;    
  int   nPalItemC=bm.bmPlanes; //调色板项的个数    
  int   nBmpInfSize=sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*nPalItemC;//位图信息的大小    
  int   nDataSize=(nBitPerPixel*nW+31)/32*4*nH;//位图数据的大小    
  //初始化位图信息    
          BITMAPFILEHEADER   bfh   =   {0};//位图文件头    
          bfh.bfOffBits   =   sizeof(BITMAPFILEHEADER)   +   nBmpInfSize;//sizeof(BITMAPINFOHEADER);//到位图数据的偏移量    
          bfh.bfSize   =   bfh.bfOffBits   +   nDataSize;//文件总的大小    
          bfh.bfType   =   (WORD)0x4d42;//位图标志    
  char   *   p   =   new   char[nBmpInfSize+nDataSize];//申请内存位图数据空间(包括信息头)    
          memset(p,0,nBmpInfSize);//将信息头的数据初始化为0    
  LPBITMAPINFOHEADER   pBih   =   (LPBITMAPINFOHEADER)   p;//位图信息头    
          pBih->biCompression   =   BI_RGB;    
  pBih->biBitCount   =   nBitPerPixel;//每个图元像素使用的位数    
          pBih->biHeight   =   nH;//高度    
  pBih->biWidth   =   nW;//宽度    
          pBih->biPlanes   =   1;    
          pBih->biSize   =   sizeof(BITMAPINFOHEADER);    
          pBih->biSizeImage   =   nDataSize;//图像数据大小    
          char   *pData=p+nBmpInfSize;    
  //DDB转换为DIB    
          ::GetDIBits(hDC,hBitmap,0,nH,pData,(LPBITMAPINFO)   pBih,   DIB_RGB_COLORS);//获取位图数据    
  ofstream   ofs(szFileName,ios::binary);    
  if(ofs.fail())    
  return   FALSE;    
          ofs.write((const   char*)&bfh,   sizeof(BITMAPFILEHEADER));//写入位图文件头    
          ofs.write((const   char*)pBih,   nBmpInfSize);//写入位图信息数据    
          ofs.write((const   char*)pData,   nDataSize);//写入位图数据    
  return   TRUE;    
  }    
     
  void   main()    
  {    
  HWND   hWnd=NULL;    
  ::OpenClipboard(hWnd);   //   打开剪贴板    
  HANDLE   hBitmap   =   ::GetClipboardData(CF_BITMAP);   //   获取剪贴板数据句柄    
  if(hBitmap==NULL)    
  {    
  return   ;    
  }    
  HDC   hDC   =   ::GetDC(hWnd);   //   获取设备环境句柄    
  HDC   hdcMem   =   CreateCompatibleDC(hDC);   //   创建与设备相关的内存环境    
  SelectObject(hdcMem,   hBitmap);   //   选择对象    
  SetMapMode(hdcMem,   GetMapMode(hDC));   //   设置映射模式    
  BITMAP   bm;   //   得到位图对象    
  GetObject(hBitmap,   sizeof(BITMAP),   &bm);    
  SaveBitmap(bm,hDC,(HBITMAP)hBitmap,"clip.bmp");    
  ::ReleaseDC(hWnd,   hDC);   //   释放设备环境句柄    
  DeleteDC(hdcMem);   //   删除内存环境    
  ::CloseClipboard();   //   关闭剪贴板    
     
  }  
 
这还有一段,看来很多跟我一样的无聊人 
 
  
//获取屏幕中指定区域的图 
hbitmap cpage1::gethbitmap() 
{ 
int nwidth=m_rectcapture.width();  
int nheight=m_rectcapture.height(); //得到鼠标所在处的窗口的区域宽、高   
 
hdc hdcscreen, hmemdc;   
hbitmap hbitmap, holdbitmap;   
 
hdcscreen = createdc(      //建立一个屏幕设备环境句柄  
      "display",    //用vbnullstring传递null值给该参数,除非:1、用display,是获取整个屏幕的设备场景;2、用winspool,则是访问打印驱动 
      null,     //所用专门设备的名称。该名由打印管理器分配显示 
      null,    //用vbnullstring传递null值给该参数 
      null     //devmode,这个结构保存初始值。用createdcbynum传递0(null)值则适用默认设置 
      );     
hmemdc = createcompatibledc(hdcscreen);   //建立一个与屏幕设备环境句柄兼容、与鼠标所在处的窗口的区域等大的位图  
hbitmap = createcompatiblebitmap(hdcscreen, nwidth, nheight);  
holdbitmap =(hbitmap)selectobject(hmemdc, hbitmap);    //把新位图选到内存设备描述表中  
bitblt(hmemdc, 0, 0, nwidth, nheight, hdcscreen,m_rectcapture.left,m_rectcapture.top,srccopy);  // 把屏幕设备描述表拷贝到内存设备描述表中  
hbitmap =(hbitmap)selectobject(hmemdc, holdbitmap);    //取回鼠标所在处的窗口屏幕位图的句柄  
deletedc(hdcscreen); 
deletedc(hmemdc);    //不再需要时,该设备场景可用deletedc函数删除。删除前,其所有对象应回复初始状态。 
 
return hbitmap; 
}  
//保存图片 
void cpage1::onlbuttonup(uint nflags, cpoint point)  
{ 
/*-------------------------------------------------*/ 
m_getwininfo.eraselastwindow();   
/*-------------------------------------------------*/  
if(this->m_bsavetofile) 
  this->writebmptofile(this->gethbitmap()); 
 
if(this->m_bcopytoclip) 
  this->copybmptoclipboard(this->gethbitmap()); 
if(this->m_bopenmspaint) 
  ::shellexecute(null,"open","mspaint.exe",this->m_strfilepath,null,sw_shownormal); 
this->stopcapture(); 
afxgetmainwnd()->showwindow(sw_normal);     //恢复窗口显示模式  
     
 
cpropertypage::onlbuttonup(nflags, point); 
}  
  
  
呵呵,如果比较麻烦就不弄了,nircmd算了,只要不被当成病毒,这个命令行工具还是挺牛的,30k也够小的了 
 
[ 本帖最后由 NicTense 于 2010-3-21 00:27 编辑 ] |   
 
 
 
 |