C# 實現預覽dwg檔案完整原始碼(無需autocad環境)

來源:互聯網
上載者:User

標籤:des   使用   檔案   資料   os   art   

  1. using System;  
  2. using System.Drawing;  
  3. using System.Collections;  
  4. using System.ComponentModel;  
  5. using System.Windows.Forms;  
  6. using System.Data;  
  7. using System.IO;  
  8. namespace WindowsApplication3  
  9. {  
  10.  /// <summary>  
  11.  /// Form1 的摘要說明。  
  12.  /// </summary>  
  13.  public class Form1 : System.Windows.Forms.Form  
  14.  {  
  15.   private System.Windows.Forms.Timer timer1;  
  16.   private System.Windows.Forms.PictureBox pictureBox1;  
  17.   private System.ComponentModel.IContainer components;  
  18.   public Form1()  
  19.   {  
  20.    //  
  21.    // Windows 表單設計器支援所必需的  
  22.    //  
  23.    InitializeComponent();  
  24.    //  
  25.    // TODO: 在 InitializeComponent 調用後添加任何建構函式代碼  
  26.    //  
  27.   }  
  28.   /// <summary>  
  29.   /// 清理所有正在使用的資源。  
  30.   /// </summary>  
  31.   protected override void Dispose( bool disposing )  
  32.   {  
  33.    if( disposing )  
  34.    {  
  35.     if (components != null)   
  36.     {  
  37.      components.Dispose();  
  38.     }  
  39.    }  
  40.    base.Dispose( disposing );  
  41.   }  
  42.   #region Windows Form Designer generated code  
  43.   /// <summary>  
  44.   /// 設計器支援所需的方法 - 不要使用代碼編輯器修改  
  45.   /// 此方法的內容。  
  46.   /// </summary>  
  47.   private void InitializeComponent()  
  48.   {  
  49.    this.components = new System.ComponentModel.Container();  
  50.    this.timer1 = new System.Windows.Forms.Timer(this.components);  
  51.    this.pictureBox1 = new System.Windows.Forms.PictureBox();  
  52.    this.SuspendLayout();  
  53.    //   
  54.    // pictureBox1  
  55.    //   
  56.    this.pictureBox1.Location = new System.Drawing.Point(16, 16);  
  57.    this.pictureBox1.Name = "pictureBox1";  
  58.    this.pictureBox1.Size = new System.Drawing.Size(416, 272);  
  59.    this.pictureBox1.TabIndex = 0;  
  60.    this.pictureBox1.TabStop = false;  
  61.    //   
  62.    // Form1  
  63.    //   
  64.    this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);  
  65.    this.ClientSize = new System.Drawing.Size(472, 310);  
  66.    this.Controls.AddRange(new System.Windows.Forms.Control[] {  
  67.                     this.pictureBox1});  
  68.    this.Name = "Form1";  
  69.    this.Text = "Form1";  
  70.    this.Load += new System.EventHandler(this.Form1_Load);  
  71.    this.ResumeLayout(false);  
  72.   }  
  73.   #endregion  
  74.   /// <summary>  
  75.   /// 應用程式的主進入點。  
  76.   /// </summary>  
  77.   [STAThread]  
  78.   static void Main()   
  79.   {  
  80.    Application.Run(new Form1());  
  81.   }  
  82.   private void Form1_Load(object sender, System.EventArgs e)  
  83.   {  
  84.    ViewDWG viewDWG=new ViewDWG();  
  85.    pictureBox1.Image =viewDWG.GetDwgImage("c:\\\\1.dwg");  
  86.   }  
  87.  }  
  88.  class ViewDWG  
  89.  {  
  90.   struct BITMAPFILEHEADER  
  91.   {  
  92.    public short bfType;  
  93.    public int bfSize;  
  94.    public short bfReserved1;  
  95.    public short bfReserved2;  
  96.    public int bfOffBits;  
  97.   }  
  98.   public  Image GetDwgImage(string FileName)  
  99.   {  
  100.    if (!(File.Exists(FileName)))  
  101.    {  
  102.     throw new FileNotFoundException("檔案沒有被找到");  
  103.    }  
  104.    FileStream DwgF;  //檔案流  
  105.    int PosSentinel;  //檔案描述塊的位置  
  106.    BinaryReader br;  //讀取二進位檔案  
  107.    int TypePreview;  //縮圖格式  
  108.    int PosBMP;       //縮圖位置   
  109.    int LenBMP;       //縮圖大小  
  110.    short biBitCount; //縮圖位元深度   
  111.    BITMAPFILEHEADER biH; //BMP檔案頭,DWG檔案中不包含位元影像檔案頭,要自行加上去  
  112.    byte[] BMPInfo;       //包含在DWG檔案中的BMP檔案體  
  113.    MemoryStream BMPF = new MemoryStream(); //儲存位元影像的記憶體檔案流  
  114.    BinaryWriter bmpr = new BinaryWriter(BMPF); //寫二進位檔案類  
  115.    Image myImg = null;  
  116.    try  
  117.    {  
  118.     DwgF = new FileStream(FileName, FileMode.Open, FileAccess.Read);   //檔案流  
  119.     br = new BinaryReader(DwgF);  
  120.     DwgF.Seek(13, SeekOrigin.Begin); //從第十三位元組開始讀取  
  121.     PosSentinel = br.ReadInt32();  //第13到17位元組指示縮圖描述塊的位置  
  122.     DwgF.Seek(PosSentinel + 30, SeekOrigin.Begin);  //將指標移到縮圖描述塊的第31位元組  
  123.     TypePreview = br.ReadByte();  //第31位元組為縮圖格式資訊,2 為BMP格式,3為WMF格式  
  124.     if (TypePreview == 1)  
  125.     {  
  126.     }  
  127.     else if (TypePreview == 2 || TypePreview == 3)  
  128.     {  
  129.      PosBMP = br.ReadInt32(); //DWG檔案儲存的位元影像所在位置  
  130.      LenBMP = br.ReadInt32(); //位元影像的大小  
  131.      DwgF.Seek(PosBMP + 14, SeekOrigin.Begin); //移動指標到位元影像塊  
  132.      biBitCount = br.ReadInt16(); //讀取位元深度  
  133.      DwgF.Seek(PosBMP, SeekOrigin.Begin); //從位元影像塊開始處讀取全部位元影像內容備用  
  134.      BMPInfo = br.ReadBytes(LenBMP); //不包含檔案頭的位元影像資訊  
  135.      br.Close();  
  136.      DwgF.Close();  
  137.      biH.bfType = 19778; //建立位元影像檔案頭  
  138.      if (biBitCount < 9)  
  139.      {  
  140.       biH.bfSize = 54 + 4 * (int)(Math.Pow(2, biBitCount)) + LenBMP;  
  141.      }  
  142.      else  
  143.      {  
  144.       biH.bfSize = 54 + LenBMP;  
  145.      }  
  146.      biH.bfReserved1 = 0; //保留位元組  
  147.      biH.bfReserved2 = 0; //保留位元組  
  148.      biH.bfOffBits = 14 + 40 + 1024; //映像資料位移  
  149.      //以下開始寫入位元影像檔案頭  
  150.      bmpr.Write(biH.bfType); //檔案類型  
  151.      bmpr.Write(biH.bfSize);  //檔案大小  
  152.      bmpr.Write(biH.bfReserved1); //0  
  153.      bmpr.Write(biH.bfReserved2); //0  
  154.      bmpr.Write(biH.bfOffBits); //映像資料位移  
  155.      bmpr.Write(BMPInfo); //寫入位元影像  
  156.      BMPF.Seek(0, SeekOrigin.Begin); //指標移到檔案開始處  
  157.      myImg = Image.FromStream(BMPF); //建立位元影像檔案對象  
  158.      bmpr.Close();  
  159.      BMPF.Close();  
  160.     }  
  161.     return myImg;  
  162.    }  
  163.    catch(Exception ex)  
  164.    {  
  165.     throw new Exception(ex.Message);  
  166.    }  
  167.   }  
  168.  }  
  169. }  
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.