zctya

    1. 引用 5 楼 nommm 的回复: 你想得到位图文件(bmp)里面图素的一部分,那首先打开文件然后读入到内存(CreateFile和ReadFile)。 然后,你能得到文件在内存里面的指针(ReadFile的参数2输出),姑且叫pfile,类型转换成BITMAPFILEHEADER *; 之后,就可以得到图素数据的指针: pBits = (BYTE *) pfile + pfile->bfOffBits ; //这个就是图……
      下面是我的代码: void CPng_ce_TestDlg::CreateBMPFile(LPTSTR pszFile,LPRECT lpRect) {         CClientDC dc(this);//获取对话窗口客户区         HDC hScrDC;//创建屏幕设备描述表         HDC hMemDC;//创建内存设备描述表         HBITMAP hBitmap;         HGDIOBJ hOldBitmap;         //保存点的颜色值               BYTE *lpBits = NULL;         CRect rect;         BITMAPINFO rgb24bits;         int nX,nY,nX2,nY2;//选定区域坐标         //int nWidth,nHeight;//对话框大小            int xScrn, yScrn;                 if(IsRectEmpty(lpRect))//确保选中区域不为空矩形                 return;         hScrDC=dc;//获取对话框句柄         hMemDC=CreateCompatibleDC(hScrDC);//为屏幕设备描述表创建兼容的内存设备描述表         //获得选定的区域坐标         nX = lpRect->left;         nY = lpRect->top;         nX2 = lpRect->right;         nY2 = lpRect->bottom;         nWidth = nX2-nX;         nHeight= nY2-nY;               ZeroMemory(&rgb24bits, sizeof(BITMAPINFO));               rgb24bits.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);               rgb24bits.bmiHeader.biWidth = nWidth;               rgb24bits.bmiHeader.biHeight = nHeight;               rgb24bits.bmiHeader.biPlanes = 1;               rgb24bits.bmiHeader.biBitCount = 24;//保存为24位         rgb24bits.bmiColors[0].rgbBlue = 0;         rgb24bits.bmiColors[0].rgbGreen = 0;         rgb24bits.bmiColors[0].rgbRed = 0;         rgb24bits.bmiColors[0].rgbReserved = 0;     hBitmap = CreateDIBSection(hMemDC, (BITMAPINFO*)&rgb24bits,DIB_RGB_COLORS,(void **)&lpBits,NULL,0);             hOldBitmap = SelectObject(hMemDC, hBitmap);         BitBlt(hMemDC,0,0,nWidth,nHeight,hScrDC,nX,nY,SRCCOPY);      //初始化位图文件头结构      BITMAPFILEHEADER bmBITMAPFILEHEADER;      ZeroMemory(&bmBITMAPFILEHEADER, sizeof(BITMAPFILEHEADER));      bmBITMAPFILEHEADER.bfType = 0x4d42;  //bmp      bmBITMAPFILEHEADER.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);      bmBITMAPFILEHEADER.bfSize = bmBITMAPFILEHEADER.bfOffBits + ((nWidth*nHeight)*3);      DWORD dwNumBytes;          //创建新位图     HANDLE hFile = CreateFile(pszFile,GENERIC_WRITE,(DWORD) 0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);         //不为空     if (hFile == INVALID_HANDLE_VALUE)         return ;         //写入头文件     WriteFile(hFile, &bmBITMAPFILEHEADER, sizeof(BITMAPFILEHEADER), &dwNumBytes, NULL);         //写入信息头     WriteFile(hFile, &(rgb24bits.bmiHeader), sizeof(BITMAPINFOHEADER), &dwNumBytes, NULL);         //写入RGB数据.CreateDIBSection返回的第四个参数是没有内容的。要向里面写入数据才可以显示图片     WriteFile(hFile,lpBits,3*nWidth*nHeight,&dwNumBytes, NULL);              这是我加进去的,是这样定义吗?         BITMAPFILEHEADER *bmpFileHeader;         ReadFile(hFile,lpBits,3*nWidth*nHeight,&dwNumBytes,NULL);         bmpFileHeader=(BITMAPFILEHEADER *)lpBits;         BYTE *lpbit=(BYTE *)bmpFileHeader+bmpFileHeader->bfOffBits;还是BYTE *lpbit=(BYTE *)lpbits+bmpFileHeader->bfOffBits;               比如说 r 表示Red的,我是不是这样写byte r=*lpbit;取他的red值?     FlushFileBuffers(hFile);     CloseHandle(hFile);      //删除     DeleteObject(hMemDC);     DeleteObject(hScrDC);     DeleteObject(hBitmap);     DeleteObject(hOldBitmap); }

最近访客

< 1/1 >

统计信息

已有28人来访过

  • 芯积分:--
  • 好友:--
  • 主题:--
  • 回复:1

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言