- 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
|
|