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

杨航收集技术资料,分享给大家

//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(13, SeekOrigin.Begin); //从第十三字节开始读取
                    PosSentinel = br.ReadInt32(); //第13到17字节指示缩略图描述块的位置
                    DwgF.Seek(PosSentinel + 30, SeekOrigin.Begin); //将指针移到缩略图描述块的第31字节
                    TypePreview = br.ReadByte(); //第31字节为缩略图格式信息,2 为BMP格式,3为WMF格式
                    if (TypePreview == 1)
                    {
                    }
                    else if (TypePreview == 2 || TypePreview == 3)
                    {
                        PosBMP = br.ReadInt32(); //DWG文件保存的位图所在位置
                        LenBMP = br.ReadInt32(); //位图的大小
                        DwgF.Seek(PosBMP + 14, SeekOrigin.Begin); //移动指针到位图块
                        biBitCount = br.ReadInt16(); //读取比特深度
                        DwgF.Seek(PosBMP, SeekOrigin.Begin); //从位图块开始处读取全部位图内容备用
                        BMPInfo = br.ReadBytes(LenBMP); //不包含文件头的位图信息
                        br.Close();
                        DwgF.Close();
                        biH.bfType = 19778; //建立位图文件头
                        if (biBitCount < 9)
                        {
                            biH.bfSize = 54 + 4 * (int)(Math.Pow(2, biBitCount)) + LenBMP;
                        }
                        else
                        {
                            biH.bfSize = 54 + LenBMP;
                        }
                        biH.bfReserved1 = 0; //保留字节
                        biH.bfReserved2 = 0; //保留字节
                        biH.bfOffBits = 14 + 40 + 1024; //图像数据偏移
                        //以下开始写入位图文件头
                        bmpr.Write(biH.bfType); //文件类型
                        bmpr.Write(biH.bfSize); //文件大小
                        bmpr.Write(biH.bfReserved1); //0
                        bmpr.Write(biH.bfReserved2); //0
                        bmpr.Write(biH.bfOffBits); //图像数据偏移
                        bmpr.Write(BMPInfo); //写入位图
                        BMPF.Seek(0, SeekOrigin.Begin); //指针移到文件开始处
                        myImg = Image.FromStream(BMPF); //创建位图文件对象
                        bmpr.Close();
                        BMPF.Close();
                    }
                    return myImg;
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
            }
        }

}
}



C# 读取CAD文件缩略图(DWG文件)相关推荐

  1. PDF文件转DWG文件用CAD转换器可以操作吗?

    现在很多的工作需要PDF文件转换为DWG文件,尤其是建筑方面的使用最为突出,但是随着PDF文件和DWG文件的特点,越来越多的行业需要用到PDD文件转换成DWG文件,那么我们应该怎么进行转换呢?下面就有 ...

  2. CAD转3D dwg文件自动转成三维模型 支持CAD室内结构

    CAD转3D  dwg文件自动转成三维模型 支持识别CAD墙.门.窗等,自动生成3D场景 有兴趣的可以下载模模搭客户端(campusbuilder)体验,近期也会上线在线版本 转载于:https:// ...

  3. 如何利用ArcGIS将shp文件转换成CAD可用的dwg文件

    对于使用CAD的用户而言,*.shp格式的文件不能够直接加载使用,那么现在小编就教大家如何利用ArcGIS将水经注谷歌地球高程下载器生成的*.shp转换成CAD可编辑的*.dwg文件,希望对大家有所帮 ...

  4. CAD技巧之DWG文件如何打开

    DWG文件格式是CAD文件格式的一种,我们在许多时候都会可能都会用到DWG文件,在打开PDF文件的时候,我相信不少小伙伴都遇到了DWG文件怎么打开的难题.那么我们应该如何将DWG文件打开?DWG文件用 ...

  5. python操作CAD转存dwg文件

    #准备工作 import sys import win32com.client import math import time, os from datetime import datetime fr ...

  6. java读取CAD(dxf)文件(获取layer,block,entity)

    首先需要引入kabeja这个包 个人理解:DXF图纸是由一张张图层(DXFLayer)组成的,一张张图层又是由一个个实体类(DXFEntity)组成的,至于块(DXFBlock)呢,我理解的他就是一个 ...

  7. lisp图库不显示缩略图_[原创]在未安装过任何CAD版本的系统中,也能查看dwg文件的缩略图!...

    本帖最后由 作者 于 2008-4-26 22:27:02 编辑 引言------- 我的电脑原来安装了CAD2002版本,在资源管理器中(文件夹)是看不到CAD文件的缩略图的,可有一天我安装了CAD ...

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

    软件名称: 看楼主头像... 1.增加控件状态栏文字,自定义功能, C++接口为 :   CStatusBarInformationReactor::CreateProgressBarText COM ...

  9. vb如何实现在cad中打开dxf文件_CDR转CAD方法

    在CDR文档中又是如何将文档转换为CAD格式的呢?其实只要简单几步就能搞定,下面系统天地小编就来给大家分享cdr(CorelDRAW)文档转换为CAD格式的方法,供大家参考. cdr文档转换为CAD格 ...

  10. dwg文件怎么打开呢?dwg是啥呢?

    学习过绘图AUTO CAD的朋友对dwg文件再熟悉不过了,dwg是二维或三维图形,一般的建筑图纸通信图纸电气图纸都是用cad绘制的,但对于没学习过CAD绘图的朋友对*.dwg文件都是一脸茫然,今天刚好 ...

最新文章

  1. 对付惰性必杀:(10+2)*5法
  2. 开发日记-20190827 关键词 计算机网络
  3. java 追加写入txt文件_ava如何追加写入txt文件
  4. UITableView:改变 TableHeaderView 的高度
  5. 安装php独立环境,0507-php独立环境的安装与配置 Web程序 - 贪吃蛇学院-专业IT技术平台...
  6. 成立两年估值17亿美元,这家Hinton点赞的AI芯片公司获宝马微软投资
  7. oracle替换指定字符串字符_实例:替换方框内字符串内容
  8. pycharm 设置虚拟工作空间_七、连Pycharm都不知道怎么用,学什么Python
  9. 力扣-191 位1的个数
  10. 上海工程技术大学c语言商店存货管理系统,商店存货管理系统.docx
  11. C++复习筛法求100以内素数
  12. 点分十进制转32位二进制数组
  13. discuz自定义接口开发——一键发帖,自动发帖,站外发帖(主题)
  14. CODE VS 4939 欧拉函数 质因数启发式分解
  15. MAC 下ifconfig看IP
  16. 如何用python编写财务记账软件_Python实现简单的记账本功能
  17. c语言滤出是个最小值,经典滤波算法及C语言程序
  18. java midi版本_java-为特定MIDI设备开发软件
  19. Android 开发基于Webview 自制一个简单的手机浏览器
  20. P02014182王子恒信息论作业

热门文章

  1. php标签嵌入规范,HTML标签嵌套的详细规则
  2. LeetCode 112. 路径总和 、113. 路径总和 II 思考分析
  3. 操作系统磁盘调度_磁盘调度| 操作系统
  4. 关系代数基本运算_关系代数的基本和附加运算
  5. 抛硬币正面期望_如果抛硬币,正面的数量多于反面的可能性
  6. c语言函数调用数组_第七讲:C语言基础之函数,第二节,实现汉诺塔
  7. redis源码剖析(三)——基础数据结构
  8. QT事件事件之一:Qt中的事件处理与传递
  9. 【计算机系统设计】实践笔记(2)插叙:综合与实现
  10. 字符串的规范使用(二)