VC++:SetDIBitsToDevice 及StretchDIBits

SetDIBitsToDevice :该函数使用DIB位图和颜色数据对与目标设备环境相关的设备上的指定矩形中的像素进行设置。

StretchDIBits 函数将DIB中矩形区域内像素使用的颜色数据拷贝到指定的目标矩形中。如果目标矩形比源矩形大小要大,那么函数对颜色数据的行和列进行拉伸,以与目标矩形匹配。如果目标矩形大小要比源矩形小,那么该函数通过使用指定的光栅操作对行列进行压缩。

GetDIBits : 检索指定的位图位,并将它们,设备无关的格式复制到 lpBits 参数中指定的缓冲区。

原文:http://blog.csdn.net/craigyang/article/details/4483311

void CDibView::OnDraw(CDC* pDC)
{
       
    BITMAPINFO bmpinfo = {0};  
    bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); //必须,初始化bmpinfo.bmiHeader中的第一个参数  

    HBITMAP hBitmap = LoadBitmap(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDB_CLASS_VIEW));  
    if(NULL == hBitmap)  
        MessageBoxA(HWND_TOP, "LoadBitmap error", "WM_PAINT", MB_OK);  

    int scanline = GetDIBits(pDC->m_hDC, hBitmap, 0, 0, NULL, &bmpinfo, DIB_RGB_COLORS);//初始化bmpinfo.bmiHeader中第二到第四3个参数  
    if(0 == scanline)   //windows API  
        MessageBoxA(HWND_TOP, "GetDIBits error", "WM_PAINT", MB_OK);  

    bmpinfo.bmiHeader.biCompression = BI_RGB;       //必须  
    bmpinfo.bmiHeader.biPlanes = 1;                 //必须  
     //      bmpinfo.bmiHeader.biXPelsPerMeter = 10000;      //可以有可以木有  
    //      bmpinfo.bmiHeader.biYPelsPerMeter = 10000;      //可以有可以木有  
    //      bmpinfo.bmiHeader.biSizeImage   = 0;            //可以有可以木有  
    //总共初始化bmpinfo.bmiHeader中前六个参数,接下来可以利用初始化过得bmpinfo结构将位图数据copy进大小分配好的内存中  


    char buff[MAX_PATH];  
    sprintf(buff, "width: %d/nheight: %d/nbiBitCount: %d/nXPerMeter: %d/nYPerMeter: %d",   
        bmpinfo.bmiHeader.biWidth, bmpinfo.bmiHeader.biHeight, bmpinfo.bmiHeader.biBitCount,
        bmpinfo.bmiHeader.biXPelsPerMeter, bmpinfo.bmiHeader.biYPelsPerMeter);  
    //      MessageBoxA(hWnd, buff, "WM_PAINT", MB_OK);  

    void* pdata = malloc(LINE_BYTES(bmpinfo.bmiHeader.biWidth,bmpinfo.bmiHeader.biBitCount)*bmpinfo.bmiHeader.biHeight);  
    if(pdata == NULL)  
    {  
        MessageBoxA(HWND_TOP, "Malloc Memory Error!", "WM_PAINT", MB_OK);  
        return ;  
    }  
    scanline = GetDIBits(pDC->m_hDC, hBitmap, 0, bmpinfo.bmiHeader.biHeight, (LPVOID)pdata, &bmpinfo, DIB_RGB_COLORS);  
    if(0 == scanline)   //windows API  
        MessageBoxA(HWND_TOP, "GetDIBits error2", "WM_PAINT", MB_OK);  

    sprintf(buff, "scanline: %d", scanline);  
    //      MessageBoxA(hWnd, buff, "WM_PAINT", MB_OK);  

    sprintf(buff, "width: %d/nheight: %d/nbiBitCount: %d/nXPerMeter: %d/nYPerMeter: %d",   
        bmpinfo.bmiHeader.biWidth, bmpinfo.bmiHeader.biHeight, bmpinfo.bmiHeader.biBitCount,   
        bmpinfo.bmiHeader.biXPelsPerMeter, bmpinfo.bmiHeader.biYPelsPerMeter);  


    //贴图
    ::SetDIBitsToDevice(pDC->m_hDC,  0, 0,bmpinfo.bmiHeader.biWidth,   
        bmpinfo.bmiHeader.biHeight, 0, 0, 0, bmpinfo.bmiHeader.biHeight,  
        pdata, (BITMAPINFO*)&bmpinfo, DIB_RGB_COLORS);
     //拉伸
    ::StretchDIBits(pDC->GetSafeHdc(),0,0,bmpinfo.bmiHeader.biWidth * 4,bmpinfo.bmiHeader.biHeight * 4,
                    0,0,bmpinfo.bmiHeader.biWidth,bmpinfo.bmiHeader.biHeight,pdata,
                    (BITMAPINFO*)&bmpinfo,DIB_RGB_COLORS,SRCCOPY );

    free(pdata);  

    //EndPaint(m_hWnd, &ps);  
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值