之前在网上搜了,找到一个将bmp转为jpg的函数,然后试了,行.然后自己能截屏到bmp.于是,我先将屏幕截为bmp临时格式,然后利用网上搜的函数将bmp格式的文件转化为jpg,这样做确实可以,但接着来的问题是,当我再次截屏的时候,我仍保存为前面的bmp临时文件,名字一样(因为我只想保留一幅临时的bmp图片,不然还有很多的bmp图片),但是不幸的是后来截得图片冲不了前面的临时bmp图片,导致每次出来的jpg图片都是一样的.这个方法我觉得行不通后,决心换一个直接将屏幕截为jpg的函数,但试了后结果是截出来的图片全是一片黑.似乎也不行了.哪位能帮我解决上面的问题啊?备注:我做的是将Activex嵌入到网页,而这个Activex实现的功能就是将屏幕截屏为jpg格式.

解决方案 »

  1.   

    截屏总要将图像信息保存到内存中然后在软换吧,看看CxImage能帮上忙不
      

  2.   

    但是不幸的是后来截得图片冲不了前面的临时bmp图片
    ------------------------------------
    你截屏的代码里怎么写的?和原来一样的文件名,难道不能覆盖?
      

  3.   

    bmp到内存啊,不要用网上的bmptofile到硬盘文件就行了. 内存bmp gdi+转jpg
      

  4.   

    恩,部长,名字是一样的,都是保存为 temp.bmp,只能有一幅,否则太多失去了初衷的想法.我现在搞死了,Activex控件在修改源代码后怎么在编译连接后还是以前的.ocx啊.貌似冲不了以前的,按理应该在重新编译连接后腰生成新的.ocx文件啊.
      

  5.   

    我也想直接在内存就转啊,但是我不知道怎么由HANDLE转为gdi+的Bitmap*类型.我把代码直接贴下得了,能帮到我的牛人望伸出援助之手啊:
    void CPrintScreenEx3Ctrl::PrintScreenEx(void)
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState()); // TODO: Add your dispatch handler code here
    // TODO: Add your dispatch handler code here
    // TODO: Add your dispatch handler code here
    GdiplusStartup(&g_pGdiToken, &g_Gdiplus, NULL);  PrintScreenToMemEx();
    SaveBmpToDiskEx(); CString   lpFileName;
    CFileDialog fileDlg(FALSE); fileDlg.m_ofn.lpstrTitle = _T("保存图片对话框");
    fileDlg.m_ofn.lpstrFilter = _T("Text Files(*.jpg)\0*.jpg\0All Files(*.*)\0*.*\0\0");
    fileDlg.m_ofn.lpstrDefExt = _T("jpg");
    if(IDOK == fileDlg.DoModal())
    {
    lpFileName = fileDlg.GetPathName();
    }
    Bitmap* pBmp = Bitmap::FromFile(_T("D:\\temp.bmp"));   
       if (pBmp)   
       {   
           CLSID clsid;   
           int nQuality = 95;   
           EncoderParameters Encoders;   
           Encoders.Count = 1;   
           Encoders.Parameter[0].Guid = EncoderQuality;   
           Encoders.Parameter[0].Type = EncoderParameterValueTypeLong;   
           Encoders.Parameter[0].NumberOfValues = 1;   
           Encoders.Parameter[0].Value = &nQuality;   
           GetCodecClsid(L"image/jpeg", &clsid);   
           pBmp->Save(lpFileName, &clsid, &Encoders);   
     
       }   
      
        GdiplusShutdown(g_pGdiToken); 
    }void CPrintScreenEx3Ctrl::PrintScreenToMemEx(void)
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState()); // TODO: Add your dispatch handler code here
    // TODO: Add your dispatch handler code here
    // TODO: Add your dispatch handler code here
    int x = GetSystemMetrics(SM_CXFULLSCREEN);
    int y = GetSystemMetrics(SM_CYFULLSCREEN);
    CRect rect(0, 0, x, y);
    LPRECT lpRect = ▭
    BOOL bSave = TRUE;
    HDC       hScrDC, hMemDC;      
     // 屏幕和内存设备描述表
     HBITMAP    hBitmap, hOldBitmap;   
     // 位图句柄
     int       nX, nY, nX2, nY2;      
     // 选定区域坐标
     int       nWidth, nHeight;
     
     // 确保选定区域不为空矩形
     if (IsRectEmpty(lpRect))
      return;
     //为屏幕创建设备描述表
     hScrDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
     //为屏幕设备描述表创建兼容的内存设备描述表
     hMemDC = CreateCompatibleDC(hScrDC);
     // 获得选定区域坐标
     nX = lpRect->left;
     nY = lpRect->top;
     nX2 = lpRect->right;
     nY2 = lpRect->bottom;
     //确保选定区域是可见的
     if (nX < 0)
      nX = 0;
     if (nY < 0)
      nY = 0;
     if (nX2 > 10000)
      nX2 = 200;
     if (nY2 > 10000)
      nY2 = 200;
     nWidth = nX2 - nX;
     nHeight = nY2 - nY;
     // 创建一个与屏幕设备描述表兼容的位图
     hBitmap = CreateCompatibleBitmap
      (hScrDC, nWidth, nHeight);
     // 把新位图选到内存设备描述表中
     hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
     // 把屏幕设备描述表拷贝到内存设备描述表中  BitBlt(hMemDC, 0, 0, nWidth, nHeight,
       hScrDC, nX, nY, SRCCOPY); hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
     //得到屏幕位图的句柄
     //清除 
     DeleteDC(hScrDC);
     DeleteDC(hMemDC);
     // 返回位图句柄m_hBitmapEx = hBitmap;
    }void CPrintScreenEx3Ctrl::SaveBmpToDiskEx(void)
    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState()); // TODO: Add your dispatch handler code here
    // TODO: Add your dispatch handler code here
    // TODO: Add your dispatch handler code here
    CString TempFilePath(_T("D:\\temp.bmp")); //CFileDialog fileDlg(FALSE); //fileDlg.m_ofn.lpstrTitle = _T("保存图片对话框");
    //fileDlg.m_ofn.lpstrFilter = _T("Text Files(*.jpg)\0*.bmp\0All Files(*.*)\0*.*\0\0");
    //fileDlg.m_ofn.lpstrDefExt = _T("bmp");
    //if(IDOK == fileDlg.DoModal())
    //{
    // TempFilePath = fileDlg.GetPathName();
    //} HBITMAP   hBitmap = m_hBitmapEx;
    HDC hDC; //设备描述表   
    int iBits; //当前显示分辨率下每个像素所占字节数   
    WORD wBitCount; //位图中每个像素所占字节数    //定义调色板大小,   位图中像素字节大小   ,位图文件大小   ,   写入文件字节数   
    DWORD dwPaletteSize=0;   
    DWORD dwBmBitsSize;   
    DWORD dwDIBSize,   dwWritten;    BITMAP Bitmap;                 //位图属性结构   
    BITMAPFILEHEADER bmfHdr;                 //位图文件头结构   
    BITMAPINFOHEADER bi;                         //位图信息头结构     
    LPBITMAPINFOHEADER lpbi;                     //指向位图信息头结构    HANDLE fh,   hDib,   hPal,hOldPal=NULL; //定义文件,分配内存句柄,调色板句柄    //计算位图文件每个像素所占字节数   
    hDC   =   CreateDC(_T("DISPLAY"),NULL,NULL,NULL);   
    iBits   =   GetDeviceCaps(hDC,   BITSPIXEL)   *     
    GetDeviceCaps(hDC,   PLANES);   
    DeleteDC(hDC);   
    if   (iBits   <=   1)   
    wBitCount   =   1;   
    else   if   (iBits   <=   4)   
    wBitCount   =   4;   
    else   if   (iBits   <=   8)   
    wBitCount   =   8;   
    else   if   (iBits   <=   24)   
    wBitCount   =   24;   
    else   if   (iBits   <=   32)   
    wBitCount   =   32;    //计算调色板大小   
    if   (wBitCount   <=   8)   
    dwPaletteSize   =   (wBitCount)   *sizeof(RGBQUAD);    //设置位图信息头结构   
    GetObject(hBitmap,   sizeof(BITMAP),   (LPSTR)&Bitmap);   
    bi.biSize                         =   sizeof(BITMAPINFOHEADER);   
    bi.biWidth                       =   Bitmap.bmWidth;   
    bi.biHeight                     =   Bitmap.bmHeight;   
    bi.biPlanes                     =   1;   
    bi.biBitCount                 =   wBitCount;   
    bi.biCompression           =   BI_RGB;   
    bi.biSizeImage               =   0;   
    bi.biXPelsPerMeter       =   0;   
    bi.biYPelsPerMeter       =   0;   
    bi.biClrUsed                   =   0;   
    bi.biClrImportant         =   0;    dwBmBitsSize   =   ((Bitmap.bmWidth   *   
    wBitCount+31)/32)*   4   
    *Bitmap.bmHeight   ;    //为位图内容分配内存   
    hDib     =   GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));   
    lpbi   =   (LPBITMAPINFOHEADER)GlobalLock(hDib);   
    *lpbi   =   bi;    //   处理调色板         
    hPal   =   GetStockObject(DEFAULT_PALETTE);   
    if   (hPal)   
    {   
    hDC     =   ::GetDC(NULL);   
    hOldPal   =   SelectPalette(hDC,   (HPALETTE)hPal,   FALSE);   
    RealizePalette(hDC);   
    }    //   获取该调色板下新的像素值   
    GetDIBits(hDC,   hBitmap,   0,   (UINT)   Bitmap.bmHeight,   
    (LPSTR)lpbi   +   sizeof(BITMAPINFOHEADER)+dwPaletteSize,   
    (BITMAPINFO*)lpbi,   DIB_RGB_COLORS);    //恢复调色板         
    if   (hOldPal)   
    {   
    SelectPalette(hDC,   (HPALETTE)hOldPal,   TRUE);   
    RealizePalette(hDC);   
    ::ReleaseDC(NULL,   hDC);   
    }    //创建位图文件           
    fh   =   CreateFile(TempFilePath,   GENERIC_WRITE,     
    0,   NULL,   CREATE_ALWAYS,   
    FILE_ATTRIBUTE_NORMAL   |   FILE_FLAG_SEQUENTIAL_SCAN,   NULL);   
    if   (fh   ==   INVALID_HANDLE_VALUE)   
    return;    //   设置位图文件头   
    bmfHdr.bfType   =   0x4D42;     //   "BM"   
    dwDIBSize         =   sizeof(BITMAPFILEHEADER)     
    +   sizeof(BITMAPINFOHEADER)   
    +   dwPaletteSize   +   dwBmBitsSize;       
    bmfHdr.bfSize   =   dwDIBSize;   
    bmfHdr.bfReserved1   =   0;   
    bmfHdr.bfReserved2   =   0;   
    bmfHdr.bfOffBits   =   (DWORD)sizeof   
    (BITMAPFILEHEADER)     
    +   (DWORD)sizeof(BITMAPINFOHEADER)   
    +   dwPaletteSize;    //   写入位图文件头   
    WriteFile(fh,   (LPSTR)&bmfHdr,   sizeof(BITMAPFILEHEADER),     
    &dwWritten,   NULL);    //   写入位图文件其余内容   
    WriteFile(fh,   (LPSTR)lpbi,   dwDIBSize,     
    &dwWritten,   NULL);    //清除         
    GlobalUnlock(hDib);   
    GlobalFree(hDib);   
    CloseHandle(fh);   
    return;   
    }
    int CPrintScreenEx3Ctrl::GetCodecClsid(const WCHAR* format, CLSID* pClsid)   
    {   
       UINT  codenum = 0;      
       UINT  size = 0;      
       ImageCodecInfo* pImageCodecInfo = NULL;   
       GetImageEncodersSize(&codenum, &size);   
       if(size == 0)   
          return -1 ;     
       pImageCodecInfo = new ImageCodecInfo[size];   
       if(pImageCodecInfo == NULL)   
          return -1;    
       GetImageEncoders(codenum, size, pImageCodecInfo);   
       for(UINT j = 0; j < codenum; ++j)   
       {   
          if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )   
          {   
             *pClsid = pImageCodecInfo[j].Clsid;   
             delete []pImageCodecInfo;   
             return 0;     
          }       
      
       }    
       delete []pImageCodecInfo;   
       return -1;     

      

  6.   

    void cutAppScreenPic()
    { //获取应用程序颜色缓冲区数组
        GLubyte* frameData=(GLubyte*)malloc(wndWidth*wndHeight*3);
        glReadPixels(0,0,wndWidth,wndHeight,GL_RGB,GL_UNSIGNED_BYTE,frameData);   //创建IplImage结构 并指定结构头为适当格式    IplImage* SnapImage=cvCreateImageHeader(cvSize(wndWidth,wndHeight),IPL_DEPTH_8U,3);   //将刚创建的IplImage结构的DATA数据指针指向之前获取到的缓冲区数组
        cvSetData( SnapImage, frameData,wndWidth*3);    //由于opencv里颜色data存放的特点 这里要进行下上下翻转 
        cvFlip( SnapImage, SnapImage, 0 );//上下翻转   //这里要进行下RGB-BGR的转换...
        cvCvtColor( SnapImage, SnapImage,CV_RGB2BGR); //转格式   //保存图片
        time_t t = time(0); 
        char strTime[64];
        ZeroMemory(strTime,sizeof(strTime));
        strftime(strTime , 64, "%Y%m%d%H%M%S",localtime(&t) ); 
        strcat(strTime,".jpg");//保存为年月日时分秒.jpg
        cvSaveImage(strTime,SnapImage);    //释放内存    cvReleaseImage(&SnapImage);
        free(frameData);
    }
    OPENCV