WEB开发网
开发学院软件开发VC 利用VC++开发ASP图像处理组件 阅读

利用VC++开发ASP图像处理组件

 2006-07-23 11:33:38 来源:WEB开发网   
核心提示: rgbGreen 绿色的强度rgbRed 红色的强度rgbReserved 保留字,为0其中需要注意的问题是,利用VC++开发ASP图像处理组件(7),RGBQUAD结构中的颜色顺序是BGR,而不是平常的RGB,调色板句柄HANDLE fh, hDib, hPal,hOldPal=NULL

rgbGreen 绿色的强度

rgbRed 红色的强度

rgbReserved 保留字,为0

其中需要注意的问题是,RGBQUAD结构中的颜色顺序是BGR,而不是平常的RGB。

3、位图数据

最后,在位图文件头、位图信息头、位图颜色表之后,便是位图的主体部分:位图数据。根据不同的位图,位图数据所占据的字节数也是不同的,比如,对于8位位图,每个字节代表了一个像素,对于16位位图,每两个字节代表了一个像素,对于24位位图,每三个字节代表了一个像素,对于32位位图,每四个字节代表了一个像素。

(二)、存储区域DC到位图文件

认识了位图文件的结构以后,对特定位图文件进行操作就显得简单了。我们通过创建特定的画笔,刷子及位图对象,在DC 环境下进行绘图后,就要将保存在DC 里的图像存储到位图文件中,以便使用及输出到其他媒体。下面代码实现将设图上下文图形保存为位图文件。

BOOL CImg::SaveDCBmp(HDC hDC, HBITMAP hBitmap, LPCTSTR lpFileName)
{
  //当前分辨率下每象素所占字节数
  int iBits;
  //位图中每象素所占字节数
  WORD wBitCount;
  //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
  DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0;
  //位图属性结构
  BITMAP Bitmap;
  //位图文件头结构
  BITMAPFILEHEADER bmfHdr;
  //位图信息头结构
  BITMAPINFOHEADER bi;
  //指向位图信息头结构
  LPBITMAPINFOHEADER lpbi;
  //定义文件,分配内存句柄,调色板句柄
  HANDLE fh, hDib, hPal,hOldPal=NULL;
  
  //计算位图文件每个像素所占字节数
  iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
  
  if (iBits <= 1) wBitCount = 1;
  else if (iBits <= 4) wBitCount = 4;
  else if (iBits <= 8) wBitCount = 8;
  else wBitCount = 24;
  
  //wBitCount = 4;
  
  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.biClrImportant = 0;
  bi.biClrUsed = 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)
  {
    hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);
  }
  
  // 获取该调色板下新的像素值
  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);
  }
  
  //创建位图文件
  fh = CreateFile(lpFileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS,
    FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
  
  if (fh == INVALID_HANDLE_VALUE) return FALSE;
  
  // 设置位图文件头
  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 TRUE;
}    

保存位图文件前通过GetObject函数取得位图长度, 通过GetDIBits取得位图图像扫描数据,填充BITMAPFILEHEADER(位图文件头结构); BITMAPINFOHEADER (位图信息头结构); 然后写入位图文件头:

WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);

写入位图文件其余内容:

WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);

以 文件头 + 位图信息 + 位图像素数据 的顺序进行存储。

上一页  2 3 4 5 6 7 

Tags:利用 VC 开发

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接