//C# 读取CAD文件缩略图(DWG文件)

https://blog.csdn.net/hanghangaidoudou/article/details/8589574

//2010-09-04 16:34:58|  分类: C# |字号 订阅
//在不使用任务插件的情况下读取DWG文件的缩略图,以便在没有安装AutoCAD的计算机上浏览。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO; namespace 浏览dwg
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
ViewDWG viewDwg = new ViewDWG();
pictureBox1.Image = viewDwg.GetDwgImage("c:\\1.dwg");
}
class ViewDWG
{
struct BITMAPFILEHEADER
{
public short bfType;
public int bfSize;
public short bfReserved1;
public short bfReserved2;
public int bfOffBits;
}
public Image GetDwgImage(string FileName)
{
if (!(File.Exists(FileName)))
{
throw new FileNotFoundException("文件没有被找到");
}
FileStream DwgF; //文件流
int PosSentinel; //文件描述块的位置
BinaryReader br; //读取二进制文件
int TypePreview; //缩略图格式
int PosBMP; //缩略图位置
int LenBMP; //缩略图大小
short biBitCount; //缩略图比特深度
BITMAPFILEHEADER biH; //BMP文件头,DWG文件中不包含位图文件头,要自行加上去
byte[] BMPInfo; //包含在DWG文件中的BMP文件体
MemoryStream BMPF = new MemoryStream(); //保存位图的内存文件流
BinaryWriter bmpr = new BinaryWriter(BMPF); //写二进制文件类
Image myImg = null;
try
{
DwgF = new FileStream(FileName, FileMode.Open, FileAccess.Read); //文件流
br = new BinaryReader(DwgF);
DwgF.Seek(, SeekOrigin.Begin); //从第十三字节开始读取
PosSentinel = br.ReadInt32(); //第13到17字节指示缩略图描述块的位置
DwgF.Seek(PosSentinel + , SeekOrigin.Begin); //将指针移到缩略图描述块的第31字节
TypePreview = br.ReadByte(); //第31字节为缩略图格式信息,2 为BMP格式,3为WMF格式
if (TypePreview == )
{
}
else if (TypePreview == || TypePreview == )
{
PosBMP = br.ReadInt32(); //DWG文件保存的位图所在位置
LenBMP = br.ReadInt32(); //位图的大小
DwgF.Seek(PosBMP + , SeekOrigin.Begin); //移动指针到位图块
biBitCount = br.ReadInt16(); //读取比特深度
DwgF.Seek(PosBMP, SeekOrigin.Begin); //从位图块开始处读取全部位图内容备用
BMPInfo = br.ReadBytes(LenBMP); //不包含文件头的位图信息
br.Close();
DwgF.Close();
biH.bfType = ; //建立位图文件头
if (biBitCount < )
{
biH.bfSize = + * (int)(Math.Pow(, biBitCount)) + LenBMP;
}
else
{
biH.bfSize = + LenBMP;
}
biH.bfReserved1 = ; //保留字节
biH.bfReserved2 = ; //保留字节
biH.bfOffBits = + + ; //图像数据偏移
//以下开始写入位图文件头
bmpr.Write(biH.bfType); //文件类型
bmpr.Write(biH.bfSize); //文件大小
bmpr.Write(biH.bfReserved1); //
bmpr.Write(biH.bfReserved2); //
bmpr.Write(biH.bfOffBits); //图像数据偏移
bmpr.Write(BMPInfo); //写入位图
BMPF.Seek(, SeekOrigin.Begin); //指针移到文件开始处
myImg = Image.FromStream(BMPF); //创建位图文件对象
bmpr.Close();
BMPF.Close();
}
return myImg;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
} }
}

C# 读取CAD文件缩略图(DWG文件)的更多相关文章

  1. CAD把一个dwg文件,或者图像文件当着一个背景导入(com接口VB语言)

    主要用到函数说明: MxDrawXCustomFunction::Mx_OpenBackgroundFile 把一个dwg文件,或者图像文件当着一个背景导入.详细说明如下: 参数 说明 CString ...

  2. CAD把一个DWG文件中的多个图框一次性全部插入到打开的DWG文件中

    主要用到函数说明: _DMxDrawX::InsertBlock 向控件数据库中插入一个图块,不用它插入匿名块,详细说明如下: 参数 说明 BSTR pszDwgFileName 图块定义的dwg 文 ...

  3. CAD控件:网上打开dwg文件时,对dwg文件路径加密的功能

    梦想CAD控件2015.03.12最新更新  1. 增加控件状态栏文字,自定义功能,        C++接口为 :   CStatusBarInformationReactor::CreatePro ...

  4. 用.NET从外部dwg文件导入块

    翻译并引自Kean's blog的两篇文章: http://through-the-interface.typepad.com/through_the_interface/2006/08/import ...

  5. shp文件转dwg并创建文本标注

    不得不说,ArcGIS 和 CAD 之间的兼容性非常差,shapefile文件和dwg文件之间互相转换会丢失各种属性,但是很多时候他们之间的转换对我们来说是刚需.通常我们都是通过第三方软件(如FME) ...

  6. 使用CadLib实现CAD(dxf、dwg格式)文件的读取和显示 【转】

    参考文章:CadLib 3.5 documentationhttps://www.woutware.com/doc/cadlib3.5/Index.aspx 读取:定义DxfModel类型的变量mod ...

  7. 高精度快速预览打开dwg文件的CAD控件CAD Image DLL介绍及下载

    CAD Image DLL对于DXF格式, DWG格式(AutoCAD R12 到AutoCAD 2004/2005), PLT 以及 HPGL/HPGL2文件都有快速的显示速度和精度,开发者再也不会 ...

  8. 梦想CAD控件,用于浏览和编辑DWG文件,在脱离AUTOCAD的情况下独立运行,相当于简易CAD

    (百度百科连接) 梦想绘图控件5.2  是国内最强,最专业的CAD开发组件(控件),不需要AutoCAD就能独立运行.控件使用VC 2010开发,最早从2007年第一个版本完成,经过多年的累积已经非常 ...

  9. 如何在网页中浏览和编辑DWG文件 梦想CAD控件

    如何在网页中浏览和编辑DWG文件 梦想CAD控件 www.mxdraw.com 梦想绘图控件5.2  是国内最强,最专业的CAD开发组件(控件),不需要AutoCAD就能独立运行.控件使用VC 201 ...

随机推荐

  1. springmvc上传文件踩过的坑

    @RequestMapping("/addTweet") public String addTweet(TweetVO tweetVO, HttpServletRequest re ...

  2. Ray聊天记录

    由于工作变动,Ray的文档.示例没有及时更新,深表歉意.在Ray升级后,性能较几个月前有了非常大的提升,也更具易用性.这是QQ交流群里大家的聊天记录,跟大家分享一下(由于时间仓促群里大家的聊天记录没有 ...

  3. 嵌入式web服务器BOA的移植及应用

    嵌入式web服务器子系统 一.嵌入式web服务器的控制流程 如下图所示,嵌入式web服务器可实现通过网络远程控制嵌入式开发板,便捷实用. 控制流程:浏览器 --->>>嵌入式开发板 ...

  4. 跟着大彬读源码 - Redis 5 - 对象和数据类型(上)

    相信很多人应该都知道 Redis 有五种数据类型:字符串.列表.哈希.集合和有序集合.但这五种数据类型是什么含义?Redis 的数据又是怎样存储的?今天我们一起来认识下 Redis 这五种数据结构的含 ...

  5. Git更改提交

    提交记录我们的工作历史记录,提交自身是一成不变的.Git提供了几个工具和命令,抓门用来帮助修改完善版本库中的提交. 实际工作中存在很多情况需要我们去修改或返工某个提交或者整个提交序列: 1,可以在某个 ...

  6. Linux基础学习整理

    linux学习记录 下载地址 centos 下载地址: 网易镜像:http://mirrors.163.com/centos/6/isos/ 搜狐镜像:http://mirrors.sohu.com/ ...

  7. Android学习总结之开发工具AndroidStudio的安装与配置

    安装AndroidStudio 首先下载AndroidStudio的安装包,直接在百度AndroidStudio下载即可,安装过程简单,只需要修改安装路径(不要有空格和中文即可).然后下一步下一步就可 ...

  8. pyqt QT设计师制作关于对话框(软件版权申明)

    一.实验环境 1.anaconda2 2.5.0 + python2.7 2.pyinstaller3.0 二.操作步骤 2.1 启动designer.exe 2.2 单击“文件” -> “新建 ...

  9. python+selenium实现163邮箱登陆—iframe动态ID定位 及常用定位方法

    今天发现之前的登录163邮箱脚本定位不到iframe了,原因是iframe拼接了动态ID,修改后的脚本如下: from selenium import webdriver driver = webdr ...

  10. 使用c++开发跨平台的程序

    使用c++开发跨平台的程序 背景 在开发过程中,使用c++作为开发语言,通常被认为是痛苦的,啰嗦的,超长开发时间的.最近几年有各种各样的语言被广泛使用,相对比来说c++不是那么出彩.c++虽然年龄大, ...