C#预览DWG文件方法:直接读取文件结构
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
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; } 该文章在 2021/12/14 10:31:33 编辑过 |
关键字查询
相关文章
正在查询... |