//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);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
楊航收集技術資料,分享給大家
//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);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
}