C# 讀取CAD文件縮略圖(DWG文件)

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


? ? }
}


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388322.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388322.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388322.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

全排列算法實現

版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主允許不得轉載。 https://blog.csdn.net/summerxiachen/article/details/605796231.全排列的定義和公式&#xff1a; 從n個數中選取m&#xff08;m<n&#xff09;個數按照一定的順序進行排成一個列&#xff0c;叫…

14.并發容器之ConcurrentHashMap(JDK 1.8版本)

1.ConcurrentHashmap簡介 在使用HashMap時在多線程情況下擴容會出現CPU接近100%的情況&#xff0c;因為hashmap并不是線程安全的&#xff0c;通常我們可以使用在java體系中古老的hashtable類&#xff0c;該類基本上所有的方法都采用synchronized進行線程安全的控制&#xff0c;…

modbus注意幾點

1、 在利用Modbus通訊的過程中&#xff0c;遇到這樣一個問題&#xff0c;即浮點數的傳輸問題。因為一般浮點數都是32位&#xff0c;而Modbus總線中只能傳輸最多16位的數據。解決方法&#xff1a;可以利用兩個整形數傳送一個浮點數&#xff08;即將一個32位的二進制數分割成兩個…

服務器虛擬化網口,服務器安裝虛擬網口

服務器安裝虛擬網口 內容精選換一換Atlas 800 訓練服務器(型號 9010)安裝上架、服務器基礎參數配置、安裝操作系統等操作請參見《Atlas 800 訓練服務器 用戶指南 (型號9010)》。Atlas 800 訓練服務器(型號 9010)適配操作系統如表1所示。請參考表2下載驅動和固件包。Atlas 800 訓…

芒果云接嗎_芒果糯米飯是生產力的關鍵嗎?

芒果云接嗎Would you like to know how your mood impact your sleep and how your parents influence your happiness levels?您想知道您的心情如何影響您的睡眠以及您的父母如何影響您的幸福感嗎&#xff1f; Become a data nerd, and track it!成為數據書呆子&#xff0c;…

hdoj4283 You Are the One

題意&#xff1a;每個人出場時獲得等待時間*值的unhappy值。有個棧換出場順序。問怎樣最小&#xff1f; 一開始的時候覺得在中間取斷點&#xff0c;dp[i][j]表示區間全出場后的最小值。那么dp[i][j]dp[i][k]dp[k1][j]&#xff0c;但這樣是不行的。因為有可能最優解是[i][k]只出…

laravel-admin 開發 bootstrap-treeview 擴展包

laravel-admin 擴展開發文檔https://laravel-admin.org/doc... 效果圖&#xff1a; 開發過程&#xff1a; 1、先創建Laravel項目&#xff0c;并集成laravel-admin&#xff0c;教程&#xff1a; http://note.youdao.com/notesh... 2、生成開發擴展包 php artisan admin:extend c…

怎么看服務器上jdk安裝位置,查看云服務器jdk安裝路徑

查看云服務器jdk安裝路徑 內容精選換一換用戶可以在公有云MRS集群以外的節點上使用客戶端&#xff0c;在使用客戶端前需要安裝客戶端。如果集群外的節點已安裝客戶端且只需要更新客戶端&#xff0c;請使用安裝客戶端的用戶例如root。針對MRS 3.x之前版本的集群&#xff0c;需要…

公司生日會生日禮物_你的生日有多受歡迎?

公司生日會生日禮物In the years before 2020, it was common for a large number of school children (20–30 or more) to physically colocate for their math lessons. And in many a class, students were asked to compute the probability that two of them had the sam…

Django思維導圖

轉載于:https://www.cnblogs.com/liangying666/p/9744477.html

XebiaLabs DevOps平臺推出軟件發布風險和合規性管理功能

XebiaLabs是DevOps和持續交付軟件工具供應商&#xff0c;通過其DevOps平臺推出了用于軟件版本發布的監管、安全和合規風險評估跟蹤功能。 這些新功能旨在幫助組織跟蹤應用程序的發布狀態信息&#xff0c;了解跨多個應用程序、團隊和環境的安全性和合規性風險。XebiaLabs表示&am…

wp7開發環境搭建

簡介 本文通過step by step的模式講述如何從0開始搭建Window Phone 7開發環境&#xff0c;如果開發簡單的Windows Phone 7程序。只是一篇介紹性的文章,但是邁進Windows Phone 7開發之路其實就那么簡單,一起來開發Windows Phone 7吧。 Windows 7安裝 目前Windows Phone 7開發…

舊金山字體_舊金山建筑業的興衰。 施工趨勢與歷史

舊金山字體This series of articles is devoted to the study of the construction activity of the main city of Silicon Valley — San Francisco. Charts and calculations were built with the help of Jupyter Notebook (Kaggle)該系列文章專門研究硅谷主要城市舊金山的建…

gym100825G. Tray Bien(輪廓線DP)

題意:3 * N的格子 有一些點是壞的 用1X1和1X2的磚鋪有多少種方法 題解:重新學了下輪廓線 寫的很舒服 #include <bits/stdc.h> using namespace std; typedef long long ll;int n, m; int vis[30][5]; ll dp[25][1 << 3];void dfs(int num, int i, int state, int n…

github上打包的樣式為什么在預覽的時候,出現404

這是資源引用的問題 在這里主要是需要在dist的index.html文件內將"./static/css/style.css"改為"static/css/style.css",就可以加載成功了&#xff0c; 至于js的路徑"./static/js/app.js"&#xff0c;就不用改了轉載于:https://www.cnblogs.com/…

lambda函數,函數符_為什么您永遠不應該在Lambda函數中使用print()

lambda函數&#xff0c;函數符兩個Lambda用戶的故事 (A Tale of Two Lambda Users) 故事1&#xff1a;業余 (Tale #1: The Amateur) One moment everything is fine, then … Bam! Your Lambda function raises an exception, you get alerted and everything changes instantl…

[ BZOJ 4668 ] 冷戰

\(\\\) \(Description\) 有\(N\)個點&#xff0c;開始沒有邊相連&#xff0c;進行按順序給出的\(M\)個操作&#xff1a; \(0\ u\ v\) 將\(u,v\)兩點連一條邊\(1\ u\ v\) 查詢\(u,v\)兩點最早在第幾條邊連接的時候被連通每次詢問輸出一個邊的編號&#xff0c;強制在線。 \(N,M\i…

使用容器和數據庫克隆進行數據庫遷移

SQL Server遷移在DBA的生命周期中是一個常量&#xff0c;SQL Server 2008的支持終結正在推動大量的遷移規劃。數據庫遷移通常涉及將備份還原到目標環境&#xff0c;為應用程序測試提供開發和QA環境&#xff0c;以及識別已棄用的功能。當處理涉及需要數小時恢復的大量數據庫的大…