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

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);
    }
}

 

posted @   多见多闻  阅读(132)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示