转自:墨斗aardio笔记
于 2022-12-20 14:13:14 发布
————————————————
版权声明:本文为CSDN博主「墨斗aardio笔记」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sunjichuancsdn/article/details/128383981
昨晚和今早在群里闲逛,又学了一招:通过文件结构解析,提取dwg中的缩略图。这个不需要安装cad,用到的是文件读写操作和结构体的知识。
感谢光庆指导,以及提出这个需求的zyl同学,这里分享给更多的同学。大家有兴趣测试一下,看还有没有什么问题。
import win.ui;
/*DSG{{*/
var winform = win.form(text="DWG缩略图提取";right=613;bottom=387;border="thin";min=false)
winform.add(
button={cls="button";text="选择DWG图形文件";left=228;top=329;right=368;bottom=377;z=1};
plus={cls="plus";left=36;top=14;right=571;bottom=314;bgcolor=12639424;z=2}
)
/*}}*/
winform.button.oncommand = function(id,event){
//选择文件
import fsys.dlg
var dwgPath=fsys.dlg.open("DWG
*.dwg")
if !dwgPath return ;
//打开文件,也可以用fsys.file
var dwgFile = io.open(dwgPath,"rb");
//读取相关信息
dwgFile.seek("set",13)
var infoPos = dwgFile.read({int v}).v//缩略图描述块的位置
dwgFile.seek("set",infoPos+30)
var picType = dwgFile.read({byte v}).v//缩略图格式,2为BMP格式,3为WMF格式
if picType=1 return ;//其他格式无法处理
var picPos= dwgFile.read({int v}).v//缩略图位置
var picSize = dwgFile.read({int v}).v//缩略图主体大小(不包含文件头)
dwgFile.seek("set",picPos)//
var picBody = dwgFile.read(picSize)//缩略图主体数据(不包含文件头)
dwgFile.seek("set",picPos+14)
var bitCount= dwgFile.read({word v}).v//位深
//关闭文件
dwgFile.close()
//计算总大小
if(bitCount < 9){
bfSize = 54 + 4 * (2 **bitCount) + picSize
}else {
bfSize = 54 + picSize
}
//定义数据结构,也可以只定义头结构,之后再与主体合并
var struct={
WORD bfType=0x4d42;//格式标记
INT bfSize=bfSize;//总大小
INT bfReserved=0;//保留
INT bfOffset=14 + 0x28 + 1024;//图像数据偏移量
BYTE bfBuf[]=picBody;//图像数据
_struct_aligned=1
}
//直接显示图像
var picData=raw.buffer(struct)
var bmp=gdip.bitmap(picData)
winform.plus.background=bmp//也可以直接picData
//保存图像
string.save("\test.bmp",picData )
}
winform.show();
win.loopMessage();
dwg我就不传了,自己随便找一个就行。