LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

C#預覽DWG文件方法:直接讀取文件結構

admin
2021年12月14日 10:28 本文熱度 2453
struct BITMAPFILEHEADER
        {
            public short bfType;
            public int bfSize;
            public short bfReserved1;
            public short bfReserved2;
            public int bfOffBits;
        }



        public static System.Drawing.Image GetDwgImage(string FileName)
        {
            if (!(File.Exists(FileName)))
            {
                throw new FileNotFoundException("文件沒有被找到");
            }
            FileStream DwgF=null;   //文件流
            int PosSentinel;   //文件描述塊的位置
            BinaryReader br=null;   //讀取二進制文件
            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); //寫二進制文件類
            System.Drawing.Image myImg = null;
            try
            {
                DwgF = new FileStream(FileName, FileMode.Open, FileAccess.Read); //文件流
                br = new BinaryReader(DwgF);
                DwgF.Seek(13, SeekOrigin.Begin); //從第十三字節開始讀取
                PosSentinel = br.ReadInt32();   //1317字節指示縮略圖描述塊的位置
                DwgF.Seek(PosSentinel + 30, SeekOrigin.Begin);   //將指針移到縮略圖描述塊的第31字節
                TypePreview = br.ReadByte();   //31字節為縮略圖格式信息,2 BMP格式,3WMF格式
                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 = System.Drawing.Image.FromStream(BMPF); //創建位圖文件對象
                    bmpr.Close();
                    BMPF.Close();
                }
                return myImg;
            }
            catch (EndOfStreamException)
            {
                throw new EndOfStreamException("文件不是標準的DWG格式文件,無法預覽!");
            }
            catch (IOException ex)
            {
                if (ex.Message == "試圖將文件指針移到文件開頭之前。/r/n")
                {
                    throw new IOException("文件不是標準的DWG格式文件,無法預覽!");
                }
                else if (ex.Message == "文件“" + FileName + "”正由另一進程使用,因此該進程無法訪問該文件。")
                {
                    //復制文件,繼續預覽
                    File.Copy(FileName, Application.StartupPath + @"/linshi.dwg", true);
                    Image image = GetDwgImage(Application.StartupPath + @"/linshi.dwg");
                    File.Delete(Application.StartupPath + @"/linshi.dwg");
                    return image;
                }
                else
                {
                    throw new Exception(ex.Message);
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                if (DwgF != null)
                {
                    DwgF.Close();
                }
                if (br != null)
                {
                    br.Close();
                }
                bmpr.Close();
                BMPF.Close();
            }
        }



讀取出來的背景色為白色,效果比較差,很多顏色顯示不出來,當時認為顯示DWG文件出錯誤了,問了些高手,(呵呵,別人告訴自己本身取出的就是白色背景,需要自己改變背景色,在此鄙視一下自己)所以繼續用C#操作返回的IMAGE對象,改變背景色
///<summary>
        ///顯示DWG文件
        ///</summary>
        ///<param name="Pwidth">要顯示的寬度</param>
        ///<param name="PHeight">要顯示的高度</param>
        ///<returns></returns>
        public static System.Drawing.Image ShowDWG(int Pwidth,int PHeight,string FilePath)
        {
            System.Drawing.Image image = GetDwgImage(FilePath);
            Bitmap bitmap = new Bitmap(image);
            int Height = bitmap.Height;
            int Width = bitmap.Width;
            Bitmap newbitmap = new Bitmap(Width, Height);
            Bitmap oldbitmap = (Bitmap)bitmap;
            Color pixel;
            for (int x = 1; x < Width; x++)
            {
                for (int y = 1; y < Height; y++)
                {
                    pixel = oldbitmap.GetPixel(x, y);
                    int r = pixel.R, g = pixel.G, b = pixel.B;
                    if (pixel.Name == "ffffffff" || pixel.Name == "ff000000")
                    {
                        r = 255 - pixel.R;
                        g = 255 - pixel.G;
                        b = 255 - pixel.B;
                    }
                    newbitmap.SetPixel(x, y, Color.FromArgb(r, g, b));
                }
            }
            Bitmap bt = new Bitmap(newbitmap, Pwidth, PHeight);
            return newbitmap;
        }

該文章在 2021/12/14 10:31:33 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
最新欧美国产91麻豆免费观看 | 五月丁香六月婷婷网线视频 | 亚洲欧美成aⅴ人在线观看 精品在线视频一区 | 欧美亚洲色综久久精品国产 | 日韩国产亚洲欧美不卡观看 | 亚洲精品911在线 |