//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);
}
}
}
}
}