明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: tcsl9621

[图形系统] 转发 完美解决VB.NET窗体中预览DWG图形(附完整代码)

  [复制链接]
发表于 2016-3-11 13:54 | 显示全部楼层
的确是,以前高人辈出
发表于 2018-7-1 15:38 | 显示全部楼层
标记下,dwg预览
发表于 2018-11-29 13:01 | 显示全部楼层
再来跟一个。好帖不能沉下去。
发表于 2019-9-5 11:17 | 显示全部楼层
谢谢楼主的资源,翻译成C#的:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.IO;
  6. using System.Drawing;

  7. namespace Changfeng.AcadNetLib
  8. {
  9.     public class AcadUtility
  10.     {
  11.         public struct BITMAPFILEHEADER
  12.         {
  13.             public short bfType;
  14.             public int bfSize;
  15.             public short bfReserved1;
  16.             public short bfReserved2;
  17.             public int bfOffBits;
  18.         }

  19.         public static Image GetDwgImage(string FileName)
  20.         {
  21.             if (!File.Exists(FileName)) return default(Image);

  22.             FileStream DwgF =null;
  23.             BinaryReader br =null;

  24.             //文件描述块的位置
  25.             int PosSentinel = 0;

  26.             //缩略图格式
  27.             int TypePreview = 0;

  28.             //缩略图位置
  29.             int PosBMP = 0;

  30.             //缩略图大小
  31.             int LenBMP = 0;

  32.             //缩略图比特深度
  33.             short biBitCount = 0;

  34.             //BMP文件头,DWG文件中不包含位图文件头,要自行加上去
  35.             BITMAPFILEHEADER biH = new BITMAPFILEHEADER();
  36.             byte[] BMPInfo = null; //包含在DWG文件中的BMP文件体
  37.             MemoryStream BMPF = new MemoryStream(); //保存位图的内存文件流
  38.             BinaryWriter bmpr = new BinaryWriter(BMPF); //写二进制文件类
  39.             Image myImg = default(Image);
  40.             try
  41.             {
  42.                 DwgF = new FileStream(FileName, FileMode.Open, FileAccess.Read); //文件流
  43.                 br = new BinaryReader(DwgF);
  44.                 DwgF.Seek(13, SeekOrigin.Begin); //从第十三字节开始读取

  45.                 PosSentinel = br.ReadInt32(); //第13到17字节指示缩略图描述块的位置

  46.                 DwgF.Seek(PosSentinel + 30, SeekOrigin.Begin); //将指针移到缩略图描述块的第31字节

  47.                 TypePreview = br.ReadByte(); //第31字节为缩略图格式信息,2 为BMP格式,3为WMF格式
  48.                 switch (TypePreview)
  49.                 {
  50.                     case 1:
  51.                         break;

  52.                     case 2:
  53.                     case 3:
  54.                         PosBMP = br.ReadInt32(); //DWG文件保存的位图所在位置
  55.                         LenBMP = br.ReadInt32(); //位图的大小
  56.                         DwgF.Seek(PosBMP + 14, SeekOrigin.Begin); //移动指针到位图块
  57.                         biBitCount = br.ReadInt16(); //读取比特深度
  58.                         DwgF.Seek(PosBMP, SeekOrigin.Begin); //从位图块开始处读取全部位图内容备用
  59.                         BMPInfo = br.ReadBytes(LenBMP); //不包含文件头的位图信息
  60.                         br.Close();
  61.                         DwgF.Close();
  62.                         biH.bfType = (short)(0x4D42);
  63.                         if (biBitCount < 9)
  64.                         {
  65.                             biH.bfSize = System.Convert.ToInt32(54 + 4 * (Math.Pow(2, biBitCount)) + LenBMP);
  66.                         }
  67.                         else
  68.                         {
  69.                             biH.bfSize = 54 + LenBMP;
  70.                         }
  71.                         biH.bfReserved1 = (short)0; //保留字节
  72.                         biH.bfReserved2 = (short)0; //保留字节
  73.                         biH.bfOffBits = 14 + 0x28 + 1024; //图像数据偏移
  74.                         //以下开始写入位图文件头
  75.                         bmpr.Write(biH.bfType); //文件类型
  76.                         bmpr.Write(biH.bfSize); //文件大小
  77.                         bmpr.Write(biH.bfReserved1); //0
  78.                         bmpr.Write(biH.bfReserved2); //0
  79.                         bmpr.Write(biH.bfOffBits); //图像数据偏移
  80.                         bmpr.Write(BMPInfo); //写入位图


  81.                         BMPF.Seek(0, SeekOrigin.Begin); //指针移到文件开始处

  82.                         myImg = (Image)(Image.FromStream(BMPF)); //创建位图文件对象
  83.                         return myImg;
  84.                     //        bmpr.Close();
  85.                     //        BMPF.Close();

  86.                     default:
  87.                         break;
  88.                 }
  89.             }
  90.             catch (Exception)
  91.             {
  92.                 return null;
  93.             }


  94.             return null;

  95.         }



  96.     }
  97. }

发表于 2019-10-14 16:39 | 显示全部楼层
感觉很厉害的样子,但是我就是不会用
发表于 2019-11-2 14:57 | 显示全部楼层
確實厲害,謝謝
发表于 2021-3-16 09:08 | 显示全部楼层
挺好的,非常感谢。
发表于 2023-3-18 10:08 | 显示全部楼层
这玩意怎么用
发表于 2023-3-22 21:46 | 显示全部楼层
很有意义,选哟仔细拜读了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-20 07:41 , Processed in 0.323733 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表