- UID
 - 10108
 
- 积分
 - 5956
 
- 精华
 
- 贡献
 -  
 
- 威望
 -  
 
- 活跃度
 -  
 
- D豆
 -  
 
- 在线时间
 -  小时
 
- 注册时间
 - 2002-9-17
 
- 最后登录
 - 1970-1-1
 
 
 
 
 
  
 | 
 
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册 
 
 
 
 
×
 
 本帖最后由 st788796 于 2019-2-17 15:09 编辑  
 
ObjectArx 中关于 PreviewIcon 中只是定义为 AcArray<Adesk::UInt8> 其它资料很少, 百度 + Bing 了很多,终于明白了。 
PreviewIcon 存储的是 Windows 标准 BMP,而且 只 包括 
 
BITMAP INFOHEADER (BMP 文件信息头) 
RGBQUAD (BMP 文件调色板) 
BITMAP DATA (BMP 文件数据) 
即 BITMAPINFO 
 
PreviewIcon 总长度为 2088,其中 BMP 数据长度固定为1024(  32 * 32 即预览图标为32像素方形), biCompression 为 BI_RGB 
 
BITMAPINFOHEADER 部分  
- BITMAPINFOHEADER ih; 
 
 - memcpy(&ih, previewIcon.asArrayPtr(), sizeof(ih));
 
 
  复制代码 BITMAPINFO 
- size_t memsize = sizeof(BITMAPINFOHEADER) + ((1<<ih.biBitCount)*sizeof(RGBQUAD));
 
 - LPBITMAPINFO bi = (LPBITMAPINFO)malloc(memsize); 
 
 - memcpy(bi, previewIcon.asArrayPtr(), memsize);
 
 
  复制代码 如果把预览写出 Bmp 文件,只需要在前面加入 BITMAPFILEHEADER 即可 
- AcDbBlockTableRecord:: PreviewIcon previewIcon;
 
 - Acad::ErrorStatus es=pBTR->getPreviewIcon(previewIcon);
 
 - BITMAPINFOHEADER ih; 
 
 - memcpy(&ih, previewIcon.asArrayPtr(), sizeof(ih));
 
  
- size_t memsize = sizeof(BITMAPINFOHEADER) + ((1<<ih.biBitCount)*sizeof(RGBQUAD));
 
  
- LPBITMAPINFO bi = (LPBITMAPINFO)malloc(memsize); 
 
 - memcpy(bi, previewIcon.asArrayPtr(), memsize);
 
  
- DWORD dwWritten;
 
 - BITMAPFILEHEADER   bmfHdr;
 
 - HANDLE          fh=NULL;
 
  
- TCHAR* lpFileName=_T("d:\\icon.bmp");
 
 - fh = CreateFile(lpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
 
 - if (fh == INVALID_HANDLE_VALUE) return ;
 
  
- bmfHdr.bfType = 0x4D42; // "BM"
 
 - bmfHdr.bfSize = sizeof(BITMAPFILEHEADER) + previewIcon.length();
 
 - bmfHdr.bfReserved1 = 0;
 
 - bmfHdr.bfReserved2 = 0;
 
 - bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + memsize;
 
  
- WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
 
 - WriteFile(fh,bi,memsize, &dwWritten, NULL);
 
 - WriteFile(fh, &previewIcon[memsize],ih.biSizeImage, &dwWritten, NULL);
 
 -                         
 
 - FlushFileBuffers(fh);
 
 - CloseHandle(fh);
 
 
  复制代码 所以, ARX 中生成图块并包括预览的时候,这个 PreviewIcon 头部是固定的(256色32X32像素), 只需要生成最后的BITMAP DATA 
 
 |   
 
 
 
 |