找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1077|回复: 3

[分享] 关于 PreviewIcon

[复制链接]

已领礼包: 1268个

财富等级: 财源广进

发表于 2019-2-17 14:19:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 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 部分
  1. BITMAPINFOHEADER ih;
  2. memcpy(&ih, previewIcon.asArrayPtr(), sizeof(ih));
复制代码
BITMAPINFO
  1. size_t memsize = sizeof(BITMAPINFOHEADER) + ((1<<ih.biBitCount)*sizeof(RGBQUAD));
  2. LPBITMAPINFO bi = (LPBITMAPINFO)malloc(memsize);
  3. memcpy(bi, previewIcon.asArrayPtr(), memsize);
复制代码
如果把预览写出 Bmp 文件,只需要在前面加入 BITMAPFILEHEADER 即可
  1. AcDbBlockTableRecord:: PreviewIcon previewIcon;
  2. Acad::ErrorStatus es=pBTR->getPreviewIcon(previewIcon);
  3. BITMAPINFOHEADER ih;
  4. memcpy(&ih, previewIcon.asArrayPtr(), sizeof(ih));

  5. size_t memsize = sizeof(BITMAPINFOHEADER) + ((1<<ih.biBitCount)*sizeof(RGBQUAD));

  6. LPBITMAPINFO bi = (LPBITMAPINFO)malloc(memsize);
  7. memcpy(bi, previewIcon.asArrayPtr(), memsize);

  8. DWORD dwWritten;
  9. BITMAPFILEHEADER   bmfHdr;
  10. HANDLE          fh=NULL;

  11. TCHAR* lpFileName=_T("d:\\icon.bmp");
  12. fh = CreateFile(lpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
  13. if (fh == INVALID_HANDLE_VALUE) return ;

  14. bmfHdr.bfType = 0x4D42; // "BM"
  15. bmfHdr.bfSize = sizeof(BITMAPFILEHEADER) + previewIcon.length();
  16. bmfHdr.bfReserved1 = 0;
  17. bmfHdr.bfReserved2 = 0;
  18. bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + memsize;

  19. WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
  20. WriteFile(fh,bi,memsize, &dwWritten, NULL);
  21. WriteFile(fh, &previewIcon[memsize],ih.biSizeImage, &dwWritten, NULL);
  22.                         
  23. FlushFileBuffers(fh);
  24. CloseHandle(fh);
复制代码
所以, ARX 中生成图块并包括预览的时候,这个 PreviewIcon 头部是固定的(256色32X32像素), 只需要生成最后的BITMAP DATA

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2019-2-17 15:53:22 | 显示全部楼层
vc 位图操作 BITMAPINFO 赋值
BMP 文件结构分成以下几个部分:
1 BITMAP FILEHEADER (BMP 文件头)
2 BITMAP INFOHEADER (BMP 文件信息头)
3 RGBQUAD (BMP 文件调色板)
4 BITMAP DATA (BMP 文件数据)

Windows 中位图有两种格式:
设备相关位图 Device Depend Bitmap DDB
设备无关位图 Device Independ Bitmap DIB

DDB 位图格式 ------------ BITMAP(结构体) CBitmap(MFC类) HBITMAP(HANDLE)
由 BITMAP 数据类型的结构 + 图像数据构成。
因为DDB没有保存位图的调色板,在不同类设备显示时可能造成完全失真。

DIB 位图格式 ----------- BITMAPINFO
BITMAP INFOHEADER (BMP 文件信息头) + RGBQUAD (BMP 文件调色板) + BITMAP DATA (BMP 文件数据) 三部分构成
它实际就是BMP文件去掉BITMAP FILEHEADER (BMP 文件头),即一个BITMAPINFO结构后面接上调色板再加上图像数据。

BMP文件的显示 ---- DIB
首先将BMP读成DIB格式,当显示时直接DIB显示,只要读入BITMAPINFO结构和图像数据即可。

BMP文件的显示 ---- DDB
首先要先将DIB位图转化为DDB位图,再由MFC的CBitmap类显示。

总结: 统一使用DIB显示,即 BITMAPINFO;//个人意见
不要使用以下:BITMAP(结构体) CBitmap(MFC类) HBITMAP(HANDLE)//个人意见

//**********************************************
重点说说 BITMAPINFO MFC中的定义如下:

  1. typedef struct tagBITMAPINFO {
  2.     BITMAPINFOHEADER    bmiHeader;
  3.     RGBQUAD             bmiColors[1];
  4. } BITMAPINFO, FAR *LPBITMAPINFO, *PBITMAPINFO;
复制代码

位图信息头BITMAPINFOHEADER,也是一个结构,其定义如下

  1. typedef struct tagBITMAPINFOHEADER{   
  2. DWORD biSize;   
  3. LONG biWidth;   
  4. LONG biHeight;   
  5. WORD biPlanes;   
  6. WORD biBitCount   
  7. DWORD biCompression;   
  8. DWORD biSizeImage;   
  9. LONG biXPelsPerMeter;   
  10. LONG biYPelsPerMeter;   
  11. DWORD biClrUsed;   
  12. DWORD biClrImportant;   
  13. } BITMAPINFOHEADER;  
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 5295个

财富等级: 富甲天下

发表于 2019-2-17 19:36:37 | 显示全部楼层
这是一个好命题,可以好好研究研究。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2019-2-17 21:22:15 | 显示全部楼层
ObjectARX 中目前提供的 ATIL 库可以在像素级对 Image 操作
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-22 05:16 , Processed in 0.174803 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表