zoukankan      html  css  js  c++  java
  • CreateDIBSection函数

    HBITMAP CreateDIBSection( HDC hdc, // handle to DC CONST
    BITMAPINFO*pbmi, // bitmap data
    UINT iUsage, // data type indicator
    VOID**ppvBits,          // bit values
    HANDLE hSection,         // handle to file mapping object
    DWORD dwOffset           // offset to bitmap bit values);
    CreateDIBSection函数会根据位图结构信息(pbmi)分配内存空间,你不用为它分配内存,这块内存也不需要你释放,系统会自己释放的。然后将位图中的图像数据读入这个内存地址,显示即可。
    LPBYTE   lpBits;
    HBITMAP   hBmp=::CreateDIBSection(dcMem.m_hDC,lpBitmap,DIB_PAL_COLORS,   &lpBits,NULL,0);
    //将图像数据填充到得到的内存地址中
      file.ReadHuge(lpBits,dwBitlen);  
      pDC->StretchBlt(0,0,bmp.bmWidth,bmp.bmHeight,&dcMem,0,0,  
      bmp.bmWidth,bmp.bmHeight,SRCCOPY);  
    点击在新窗口中浏览此图片
    首先让我们检查一下如何简化CreateDIBSection,并正确地使用它。首先,把最後两个参数hSection和dwOffset,分别设定为NULL和0,我将在本章最後讨论这些参数的用法。第二,仅在fColorUse参数设定为DIB_ PAL_COLORS时,才使用hdc参数,如果fColorUse为DIB_RGB_COLORS(或0),hdc将被忽略(这与CreateDIBitmap不同,hdc参数用於取得与DDB相容的设备的色彩格式,CreateDIBitmap创建的是DDB(设备相关位图,CreateDIBSection创建设备无关位图),因此必须指定与位图所关联的设备,即hdc,位图根据hdc所代表的设备来取得位图的色彩格式)。
    因此,CreateDIBSection最简单的形式仅需要第二和第四个参数。第二个参数是指向BITMAPINFO结构的指标,
    BITMAPINFOHEADER         bmih ;
    BYTE                           * pBits ;
    HBITMAP                          hBitmap ;
    现在初始化BITMAPINFOHEADER结构的栏位

    bmih->biSize                  = sizeof (BITMAPINFOHEADER) ;
    bmih->biWidth                 = 384 ;
    bmih->biHeight                = 256 ;
    bmih->biPlanes                = 1 ;
    bmih->biBitCount              = 24 ;
    bmih->biCompression           = BI_RGB ;
    bmih->biSizeImage             = 0 ;
    bmih->biXPelsPerMeter         = 0 ;
    bmih->biYPelsPerMeter         = 0 ;
    bmih->biClrUsed               = 0 ;
    bmih->biClrImportant          = 0 ;
    在基本准备後,我们呼叫该函式:
    hBitmap = CreateDIBSection (NULL, (BITMAPINFO *)  &bmih, 0, &pBits, NULL, 0) ;
    这是函式呼叫所做的:CreateDIBSection检查BITMAPINFOHEADER结构并配置足够的记忆体块来载入DIB图素位元。(在这个例子里,记忆体块的大小为384×256×3位元组。)它在您提供的pBits参数中储存了指向此记忆体块的指标。
    然而,我们还没有做完,点阵图图素是未初始化的。如果正在读取DIB档案,可以简单地把pBits参数传递给ReadFile函式并读取它们。或者可以使用一些程式码「人工」设定。
    注意:使用CreateDIBSection函数获得的内存块指针(输出的第四个参数)所指向的地址中是没有内容的,我们必须向里面写入图像数据,然后才能够显示图像。

    int SaveJPEGToFile(HBITMAP hBitmap,LPCSTR lpFileName)//将截屏所得保存为jpeg图片
    {
        HDC hDC=CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
        HDC hOffDC=CreateCompatibleDC(hDC);
        SelectObject(hOffDC,hBitmap);
        
        BITMAP Bitmap;
        GetObject(hBitmap,sizeof(BITMAP),&Bitmap);
        
        HANDLE fh=CreateFile((LPCWSTR)lpFileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,
            FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,NULL);
        if(fh == INVALID_HANDLE_VALUE )
            return FALSE;
        BITMAPFILEHEADER bfh;
        memset(&bfh,0,sizeof(bfh));
        bfh.bfType=0x4D42/*((WORD) ('M' << 8) | 'B')*/;
        bfh.bfSize= sizeof(bfh)+3*Bitmap.bmWidth*Bitmap.bmHeight+sizeof(BITMAPFILEHEADER);
        bfh.bfOffBits=sizeof(BITMAPINFOHEADER)+sizeof(BITMAPFILEHEADER);
        DWORD dwWritten=0;
    //    WriteFile(fh,&bfh,sizeof(bfh),&dwWritten,NULL);
        BITMAPINFOHEADER bih;
        memset(&bih,0,sizeof(bih));
        bih.biSize=sizeof(bih);
        bih.biWidth=Bitmap.bmWidth;
        bih.biHeight=Bitmap.bmHeight;
        bih.biPlanes=1;
        bih.biBitCount=24;

        /*if( !WriteFile(fh,&bih,sizeof(bih),&dwWritten,NULL) )
        {
            return FALSE;
        }*/
        
        BITMAPINFO bitmapInfo;
        memset((void *)&bitmapInfo,0,sizeof(BITMAPINFO) );
        bitmapInfo.bmiHeader=bih;

        HDC hMemDC=CreateCompatibleDC(hDC);    
        BYTE *m_lpBitBmp=new BYTE[bfh.bfSize-sizeof(BITMAPFILEHEADER)];
        HBITMAP hDibBitmap=CreateDIBSection(hMemDC,&bitmapInfo,DIB_RGB_COLORS,(void **)&m_lpBitBmp,
            NULL,0);
        if(hDibBitmap != 0)
        {
            ::SelectObject(hMemDC,hDibBitmap);
            BitBlt(hMemDC,0,0,Bitmap.bmWidth,Bitmap.bmHeight,hOffDC,0,0,SRCCOPY);
            //WriteFile(fh,m_lpBitBmp,bfh.bfSize-sizeof(BITMAPFILEHEADER),&dwWritten,NULL);
             WriteJPEGFile(lpFileName, m_lpBitBmp,Bitmap.bmWidth,Bitmap.bmHeight,TRUE, 60);

        }
        
        DeleteObject(hDibBitmap);
        DeleteDC(hDC);
        DeleteDC(hMemDC);

        CloseHandle(fh);
        return 1;
    }


    捕捉屏幕

    HBITMAP CopyScreenToBitmap(int &nWidth,int &nHeight)
    {
        // 屏幕和内存设备描述表
        HDC  hScrDC, hMemDC;      
        // 位图句柄
        HBITMAP  hBitmap, hOldBitmap;    
        // 屏幕分辨率
        int  xScrn, yScrn;        
        
        //为屏幕创建设备描述表
        hScrDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
        //为屏幕设备描述表创建兼容的内存设备描述表
        hMemDC = CreateCompatibleDC(hScrDC);
        // 获得屏幕分辨率
        xScrn = GetDeviceCaps(hScrDC, HORZRES);
        yScrn = GetDeviceCaps(hScrDC, VERTRES);

        //存储屏幕的长宽
        nWidth = xScrn;
        nHeight = yScrn;
        
        // 创建一个与屏幕设备描述表兼容的位图
        hBitmap = CreateCompatibleBitmap(hScrDC, xScrn, yScrn);
        // 把新位图选到内存设备描述表中
        hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
        // 把屏幕设备描述表拷贝到内存设备描述表中
        BitBlt(hMemDC, 0, 0, xScrn,yScrn,hScrDC, 0, 0, SRCCOPY);
        //得到屏幕位图的句柄
        hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
        //清除
        DeleteDC(hScrDC);
        DeleteDC(hMemDC);
        // 返回位图句柄
        return hBitmap;
    }
  • 相关阅读:
    有是JSF的一个小问题,搞了我两天!从周五到周二
    MyFaces Tree2控件使用 From http://blog.163.com/net_wood/blog
    使用JSF的Selectonemenu
    SSO摘抄
    用于快速将 Web 应用程序集成到 WebSphere Portal 中的选项
    Lua 公历转农历算法
    编程语言适用场合。。。
    了解grep、vim的查找 和正则表达式
    程序员知识资产的投资
    铁道部新客票系统设计(一)
  • 原文地址:https://www.cnblogs.com/alps/p/4367561.html
Copyright © 2011-2022 走看看