C#预览DWG文件方法(一)直接读取文件结构
C#读取DWG文件方法(一)直接读取文件结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 | 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(); //第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 = 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; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律