VC显示位图的问题

policelorl 2013-09-21 02:19:11
有一个位图文件已经载入内存,要怎么显示内存里的位图数据?
就是说:

CreateFile("C:\\123.bmp", ...);
ReadFile(... ,Buffer, ...);


数据已经在内存中,现在只能用内存中的数据,而不能用硬盘里的位图文件。
怎么在窗口(句柄为hwnd)中显示这个位图?
...全文
121 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
policelorl 2013-09-23
  • 打赏
  • 举报
回复
已经可以显示了, 但是还有一个小问题,就是FillBitmapInfo(...,int bpp)每个像素的位数必须是和位图相同的值,而不一定是16, 还有,DrawBuff(...,DWORD dwWidth,...)dwWidth必须和位图的宽度完全一致才可以显示,不然显示的就是很杂乱的像素点的集合。dwHeight不一样也没事。
路人乙2019 2013-09-22
  • 打赏
  • 举报
回复

void FillBitmapInfo( BITMAPINFO* bmi, int width, int height, int bpp,)
    {
        //ASSERT( bmi && width >= 0 && height >= 0 && (bpp == 8 || bpp == 24 || bpp == 32))
 
        BITMAPINFOHEADER* bmih = &(bmi->bmiHeader);
 
        memset( bmih, 0, sizeof(*bmih));
        bmih->biSize = sizeof(BITMAPINFOHEADER);
        bmih->biWidth = width;
        bmih->biHeight = height ;
        bmih->biPlanes = 1;
        bmih->biBitCount = (unsigned short)bpp;
        bmih->biCompression = BI_RGB;
        if( bpp == 8 )
        {
            RGBQUAD* palette = bmi->bmiColors;
            int i;
            for( i = 0; i < 256; i++ )
            {
                palette[i].rgbBlue = palette[i].rgbGreen = palette[i].rgbRed = (BYTE)i;
                palette[i].rgbReserved = 0;
            }
        }
    }
 
    void DrawBuff(HDC hDC,int lleft,int lTop,DWORD dwWidth, DWORD dwHeight,BYTE *Buffer)
    {
        static BITMAPINFO bitmapInfo;
        FillBitmapInfo(&bitmapInfo,dwWidth,dwHeight,16);
        ::StretchDIBits(
            hDC,
            lleft,lTop,dwWidth, dwHeight,
            0, 0, dwWidth,dwHeight,
            Buffer, &bitmapInfo, DIB_RGB_COLORS, SRCCOPY );
 
    }

policelorl 2013-09-22
  • 打赏
  • 举报
回复
FillBitmapInfo(&bitmapInfo,dwWidth,dwHeight,16,bInverse) 中的bInverse是什么??
路人乙2019 2013-09-21
  • 打赏
  • 举报
回复
void FillBitmapInfo( BITMAPINFO* bmi, int width, int height, int bpp, int origin )
    {
        //ASSERT( bmi && width >= 0 && height >= 0 && (bpp == 8 || bpp == 24 || bpp == 32));
 
        BITMAPINFOHEADER* bmih = &(bmi->bmiHeader);
 
        memset( bmih, 0, sizeof(*bmih));
        bmih->biSize = sizeof(BITMAPINFOHEADER);
        bmih->biWidth = width;
        bmih->biHeight = origin ? abs(height) : -abs(height);
        bmih->biPlanes = 1;
        bmih->biBitCount = (unsigned short)bpp;
        bmih->biCompression = BI_RGB;
        if( bpp == 8 )
        {
            RGBQUAD* palette = bmi->bmiColors;
            int i;
            for( i = 0; i < 256; i++ )
            {
                palette[i].rgbBlue = palette[i].rgbGreen = palette[i].rgbRed = (BYTE)i;
                palette[i].rgbReserved = 0;
            }
        }
    }
 
    void DrawBuff(HDC hDC,int lleft,int lTop,DWORD dwWidth, DWORD dwHeight,BYTE *Buffer)
    {
        static BITMAPINFO bitmapInfo;
        FillBitmapInfo(&bitmapInfo,dwWidth,dwHeight,16,bInverse);
        ::StretchDIBits(
            hDC,
            lleft,lTop,dwWidth, dwHeight,
            0, 0, dwWidth,dwHeight,
            Buffer, &bitmapInfo, DIB_RGB_COLORS, SRCCOPY );
 
    }

policelorl 2013-09-21
  • 打赏
  • 举报
回复
不是给自己出难题, 题目就是这么要求的,没办法。
路人乙2019 2013-09-21
  • 打赏
  • 举报
回复
你一开始就loadbitmap,不是更好,何必给自己出难题
OnPaint() 
{
    CPaintDC dc(this); // device context for painting
    
    // TODO: Add your message handler code here
    HBITMAP hBitmap;

    hBitmap=(HBITMAP)LoadImage(
      ::AfxGetInstanceHandle(),"res\\xxx.bmp",
      IMAGE_BITMAP,0,0,
      LR_LOADFROMFILE|LR_CREATEDIBSECTION);
    ASSERT( hBitmap);
    HBITMAP hOldBitmap;
    
    CDC MemDC;
   CRect rect;
   CDC *pDC=this->GetDC();
   MemDC.CreateCompatibleDC(pDC);
   GetClientRect(rect);
   hOldBitmap=(HBITMAP)MemDC.SelectObject(hBitmap);
   pDC->BitBlt(0,0,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY);
   MemDC.SelectObject(hOldBitmap);
}

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧