【转】aardio提取AutoCAD DWG图形文件缩略图

光庆 2023-7-28 866

转自:墨斗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我就不传了,自己随便找一个就行。


最新回复 (0)
返回