首页 > 编程语言 >C# 读取CAD文件缩略图(DWG文件)

C# 读取CAD文件缩略图(DWG文件)

时间:2024-10-31 15:22:44浏览次数:1  
标签:文件 biH 缩略图 C# int br new using public

using System;
using System.Drawing;
using System.IO;
using System.Windows.Forms;

public class MainForm : Form
{
    private PictureBox pictureBox1;

    private void Form1_Load(object sender, EventArgs e)
    {
        ViewDWG viewDwg = new ViewDWG();
        try
        {
            pictureBox1.Image = viewDwg.GetDwgImage("c:\\1.dwg");
        }
        catch (Exception ex)
        {
            MessageBox.Show($"错误: {ex.Message}");
        }
    }
}

public class ViewDWG
{
    private struct BITMAPFILEHEADER
    {
        public short bfType;
        public int bfSize;
        public short bfReserved1;
        public short bfReserved2;
        public int bfOffBits;
    }

    public Image GetDwgImage(string fileName)
    {
        if (!File.Exists(fileName))
            throw new FileNotFoundException("文件没有被找到");

        using (FileStream dwgStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
        using (BinaryReader br = new BinaryReader(dwgStream))
        {
            dwgStream.Seek(13, SeekOrigin.Begin);
            int posSentinel = br.ReadInt32();
            dwgStream.Seek(posSentinel + 30, SeekOrigin.Begin);
            int typePreview = br.ReadByte();

            if (typePreview != 2 && typePreview != 3)
                throw new InvalidOperationException("不支持的缩略图格式");

            int posBMP = br.ReadInt32();
            int lenBMP = br.ReadInt32();
            dwgStream.Seek(posBMP + 14, SeekOrigin.Begin);
            short biBitCount = br.ReadInt16();

            byte[] bmpInfo = br.ReadBytes(lenBMP);
            BITMAPFILEHEADER biH = CreateBitmapFileHeader(biBitCount, lenBMP);

            using (MemoryStream bmpStream = new MemoryStream())
            using (BinaryWriter bmpr = new BinaryWriter(bmpStream))
            {
                WriteBitmapFileHeader(bmpr, biH);
                bmpr.Write(bmpInfo);
                bmpStream.Seek(0, SeekOrigin.Begin);
                return Image.FromStream(bmpStream);
            }
        }
    }

    private BITMAPFILEHEADER CreateBitmapFileHeader(short biBitCount, int lenBMP)
    {
        BITMAPFILEHEADER biH;
        biH.bfType = 19778; // 'BM'
        biH.bfSize = 54 + (biBitCount < 9 ? 4 * (int)Math.Pow(2, biBitCount) : 0) + lenBMP;
        biH.bfReserved1 = 0;
        biH.bfReserved2 = 0;
        biH.bfOffBits = 14 + 40 + 1024; // 图像数据偏移
        return biH;
    }

    private void WriteBitmapFileHeader(BinaryWriter writer, BITMAPFILEHEADER biH)
    {
        writer.Write(biH.bfType);
        writer.Write(biH.bfSize);
        writer.Write(biH.bfReserved1);
        writer.Write(biH.bfReserved2);
        writer.Write(biH.bfOffBits);
    }
}

 

标签:文件,biH,缩略图,C#,int,br,new,using,public
From: https://www.cnblogs.com/guangzhiruijie/p/18517897

相关文章

  • celery报错笔记
    报错:Invalidvaluefor'-P'/'--pool'Invalidvaluefor'-P'/'--pool':<class'celery.concurrency.prefork.TaskPool'>isnotoneof'prefork','eventlet','gevent',&#......
  • 中国积极开展空间探索活动 China has actively carried out space exploration missio
    近年来,中国积极开展空间探索活动,“嫦娥”揽月、“天问”探火、“羲和”逐日、空间站巡天,不断深化人类对宇宙的认知,致力增进人类共同福祉。Chinahasactivelycarriedoutspaceexplorationmissionsinrecentyears,includingthelaunchesofChang'elunarprobes,theMar......
  • Docker+Jenkins:一键自动化部署,让你的项目管理飞跃!
    使用Docker安装Jenkins并实现项目自动化部署是一种高效且便捷的方法。以下是详细的步骤和代码示例,帮助你完成这一过程。一、准备工作安装Docker:确保你的系统已经安装了Docker。如果没有安装,请参考 Docker官方文档进行安装。拉取Jenkins镜像:从DockerHub上拉取Je......
  • 【解决MongoDB安装难题!】计算机丢失VCRUNTIME140D.dll?一招教你快速修复!
    在安装或运行Java的MongoDB相关程序时,如果遇到“无法启动此程序,因为计算机丢失VCRUNTIME140D.dll”的错误,通常是由于缺少MicrosoftVisualC++Redistributable包。VCRUNTIME140D.dll是VisualC++2015-2019Redistributable的一部分,用于支持C++应用程序的运行时库。以下是解......
  • 网安人必备的知识库/漏洞库/代码审计/SRC漏洞挖掘/攻防演练应急响应
    免责声明:本文仅用于技术学习和讨论。请勿使用本文所提供的内容及相关技术从事非法活动,若利用本文提供的内容或工具造成任何直接或间接的后果及损失,均由使用者本人负责,所产生的一切不良后果均与文章作者及本账号无关。再次说明文章所涉及内容,仅供安全研究与教学之用,由于传播、利......
  • 阿里云 K8S ACK服务 创建使用教程
    目录1.1  阿里云容器服务ACK介绍和创建1.1.1 什么是容器服务Kubernetes版?1.1.2 创建专有版Kubernetes集群1.1.3 访问专有版Kubernetes集群1.1.4在专有版ACK集群创建资源并访问通过百度网盘分享的文件:第12章-阿里云托管k8s集群ACK创建和使用链接:https://pan.ba......
  • 学习笔记490—mac版本向日葵远程控制 忘记解锁密码如何解决
    mac版本向日葵远程控制忘记解锁密码如何解决卸载重新安装还是无法进入解决办法:一、删除配置文件1、首先进入Mac端cd/etc目录并查看目录清单(命令如下) cd/etclsorayconfig.conf#确认存在orayconfig.conf文件2、执行删除命令(记住管理员运行删除)sudorm-fo......
  • Vue3+Elementplus+Univer-Sheet实现在线excel及其需要注意的点
    1、准备项目环境Vue3自行准备node.js环境2、ElementPlus官网官网安装教程自行参照官网3、Univer插件官网1)官网网址2)开始直接点击GetStarted侧边栏点击  后面直接按照教程走即可 4、配置插件需要注意如果上述插件包已经下载并成功引入vue......
  • Pycharm快捷键
    1、编辑(Editing)Ctrl+Space基本的代码完成(类、方法、属性)Ctrl+Alt+Space快速导入任意类Ctrl+Shift+Enter语句完成Ctrl+P参数信息(在方法中调用参数)Ctrl+Q快速查看文档Shift+F1外部文档Ctrl+鼠标简介Ctrl+F1显示错误描述或警告信息Alt+Insert......
  • bacnet DDC控制器
    bacnet协议对于国内网站来说,几乎可以说资料为零,通俗大论一遍,具体操作方法屁都没说先从工具说起开发工具BACnetScan:(讯绕提供)(工具1)链接:https://pan.baidu.com/s/1TJxc0xaEsCT3lJOlG78B7w提取码:t7bwYabe:(工具2)链接:https://pan.baidu.com/s/1jfsbGQwv08GISF0VeOjY_g提取码:mmdc......