完美解决窗体中预览DWG图形(C#版)
<P>看到完美解决VB.NET窗体中预览DWG图形帖子后,用C#代码</P><P>实现如下:</P>
<P>原文在:<A href="dispbbs.asp?boardid=33&star=1&replyid=29619&id=50583&skin=0&page=1" target="_blank" >dispbbs.asp?boardid=33&star=1&replyid=29619&id=50583&skin=0&page=1</A></P>
<P> class ViewDWG<BR> {<BR> struct BITMAPFILEHEADER<BR> {<BR> public short bfType;<BR> public int bfSize;<BR> public short bfReserved1;<BR> public short bfReserved2;<BR> public int bfOffBits;<BR> }<BR> public static Image GetDwgImage(string FileName)<BR> {<BR> if (!(File.Exists(FileName)))<BR> {<BR> throw new FileNotFoundException("文件没有被找到");<BR> }<BR> FileStream DwgF; //文件流<BR> int PosSentinel; //文件描述块的位置<BR> BinaryReader br; //读取二进制文件<BR> int TypePreview; //缩略图格式<BR> int PosBMP; //缩略图位置 <BR> int LenBMP; //缩略图大小<BR> short biBitCount; //缩略图比特深度 <BR> BITMAPFILEHEADER biH; //BMP文件头,DWG文件中不包含位图文件头,要自行加上去<BR> byte[] BMPInfo; //包含在DWG文件中的BMP文件体<BR> MemoryStream BMPF = new MemoryStream(); //保存位图的内存文件流<BR> BinaryWriter bmpr = new BinaryWriter(BMPF); //写二进制文件类<BR> Image myImg = null;<BR> try<BR> {<BR> DwgF = new FileStream(FileName, FileMode.Open, FileAccess.Read); //文件流<BR> br = new BinaryReader(DwgF);<BR> DwgF.Seek(13, SeekOrigin.Begin); //从第十三字节开始读取<BR> PosSentinel = br.ReadInt32(); //第13到17字节指示缩略图描述块的位置<BR> DwgF.Seek(PosSentinel + 30, SeekOrigin.Begin); //将指针移到缩略图描述块的第31字节<BR> TypePreview = br.ReadByte(); //第31字节为缩略图格式信息,2 为BMP格式,3为WMF格式<BR> if (TypePreview == 1)<BR> {<BR> }<BR> else if (TypePreview == 2 || TypePreview == 3)<BR> {<BR> PosBMP = br.ReadInt32(); //DWG文件保存的位图所在位置<BR> LenBMP = br.ReadInt32(); //位图的大小<BR> DwgF.Seek(PosBMP + 14, SeekOrigin.Begin); //移动指针到位图块<BR> biBitCount = br.ReadInt16(); //读取比特深度<BR> DwgF.Seek(PosBMP, SeekOrigin.Begin); //从位图块开始处读取全部位图内容备用<BR> BMPInfo = br.ReadBytes(LenBMP); //不包含文件头的位图信息<BR> br.Close();<BR> DwgF.Close();<BR> biH.bfType = 19778; //建立位图文件头<BR> if (biBitCount < 9)<BR> {<BR> biH.bfSize = 54 + 4 * (int)(Math.Pow(2, biBitCount)) + LenBMP;<BR> }<BR> else<BR> {<BR> biH.bfSize = 54 + LenBMP;<BR> }<BR> biH.bfReserved1 = 0; //保留字节<BR> biH.bfReserved2 = 0; //保留字节<BR> biH.bfOffBits = 14 + 40 + 1024; //图像数据偏移<BR> //以下开始写入位图文件头<BR> bmpr.Write(biH.bfType); //文件类型<BR> bmpr.Write(biH.bfSize); //文件大小<BR> bmpr.Write(biH.bfReserved1); //0<BR> bmpr.Write(biH.bfReserved2); //0<BR> bmpr.Write(biH.bfOffBits); //图像数据偏移<BR> bmpr.Write(BMPInfo); //写入位图<BR> BMPF.Seek(0, SeekOrigin.Begin); //指针移到文件开始处<BR> myImg = Image.FromStream(BMPF); //创建位图文件对象<BR> bmpr.Close();<BR> BMPF.Close();<BR> }<BR> return myImg;<BR> }<BR> catch(Exception ex)<BR> {<BR> throw new Exception(ex.Message);<BR> }<BR> }<BR> }</P> 楼上的真是人才呀!以后多多努力。呵…… <P>我用上面的代码试了一下,可以看到DWG图,但是</P>
<P>怎么只显示很小一部分呀!</P>
<P>我的文件有4M左右大小,这段代码只显示了左上部一角的图形,大概只有总图的1/6 .</P>
<P>请问这是为什么?</P>
<P>我跟踪了一下程序,并以十六进制打开DWG文件,程序读到的图形数据是正确的!</P>
<P>但就是没有全部显示,</P>
<P>请知道的帮助一下,谢谢</P> 通过什么来实现缩放比例,获得CAD坐标? 关注!!!! 我怎么实现不了啊? 我也实现 不了,我用的是autocad2008?还请高手指点<img alt="" src="http://www.mjtd.com/BBS/Skins/default/topicface/face16.gif"/> 对于后台保存的文件,如果没打开过重新保存,就无法转图,请问楼主这个怎么解决?
页:
[1]