专栏首页VB小源码VB.NET 直接读取CAD DWG文件转换成BMP位图进行预览

VB.NET 直接读取CAD DWG文件转换成BMP位图进行预览

vb.net 直接从DWG文件中提取位图放在PictureBox中预览

Imports System.IO

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click


        BackgroundImage = GetDwgImage("VB小源码.dwg")

    End Sub
    Private Structure BITMAPFILEHEADER
        Dim bfType As Short
        Dim bfSize As Integer
        Dim bfReserved1 As Short
        Dim bfReserved2 As Short
        Dim bfOffBits As Integer
    End Structure

    Public Function GetDwgImage(ByVal FileName As String) As Image
        Dim DwgF As FileStream    '文件流
        Dim PosSentinel As Integer  '文件描述块的位置
        Dim br As BinaryReader  '读取二进制文件
        Dim TypePreview As Integer '缩略图格式
        Dim PosBMP As Integer '缩略图位置
        Dim LenBMP As Integer '缩略图大小
        Dim biBitCount As Short '缩略图比特深度
        Dim biH As BITMAPFILEHEADER 'BMP文件头,DWG文件中不包含位图文件头,要自行加上去
        Dim BMPInfo() As Byte  '包含在DWG文件中的BMP文件体
        Dim BMPF As New MemoryStream  '保存位图的内存文件流
        Dim bmpr As New BinaryWriter(BMPF) '写二进制文件类
        Dim myImg As Image = Nothing
        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格式

        Select Case TypePreview
            Case 1

            Case 2, 3
                PosBMP = br.ReadInt32 'DWG文件保存的位图所在位置
                LenBMP = br.ReadInt32 '位图的大小
                DwgF.Seek(PosBMP + 14, SeekOrigin.Begin) '移动指针到位图块
                biBitCount = br.ReadInt32 '读取比特深度
                DwgF.Seek(PosBMP, SeekOrigin.Begin) '从位图块开始处读取全部位图内容备用
                BMPInfo = br.ReadBytes(LenBMP)  '不包含文件头的位图信息
                br.Close()
                DwgF.Close()
                With biH  '建立位图文件头
                    .bfType = &H4D42
                    If biBitCount < 9 Then .bfSize = 54 + 4 * (2 ^ biBitCount) + LenBMP Else .bfSize = 54 + LenBMP
                    .bfReserved1 = 0 '保留字节
                    .bfReserved2 = 0 '保留字节
                    .bfOffBits = 14 + &H28 + 1024 '图像数据偏移
                End With
                '以下开始写入位图文件头
                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 = Image.FromStream(BMPF) '创建位图文件对象
        End Select
        Return myImg
        bmpr.Close()
        BMPF.Close()

    End Function
End Class

本文分享自微信公众号 - VB小源码(vb_xym),作者:巴西_prince

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • CAD VBA通过两点创建构造线

    basePoint(0) = 2#: basePoint(1) = 2#: basePoint(2) = 0#

    巴西_prince
  • VB.NET 发送QQ邮件,可用于发送验证码和批量文件,通知信息

    首先打开邮箱的POP3/IMAP/SMTP,获取邮箱授权码,具体操作如下:

    巴西_prince
  • VB.NET OLEDB创建Excel数据库

    巴西_prince
  • Golang Leetcode 123. Best Time to Buy and Sell Stock III.go

    https://blog.csdn.net/anakinsun/article/details/89578373

    anakinsun
  • angular基本知识学习笔记 - NgModule的基本概念

    Angular NgModules是对JavaScript ES2015 Module概念的补充。NgModules为一系列components定义了一个编译上...

    Jerry Wang
  • Signal之基本操作

    要想使用Signal,首先需要注册Signal的处理函数,就像中断的ISR。最基本的方法是POSIX定义的sigaction()

    Taishan3721
  • C语言和C++本质区别在哪?

    疑惑一 做网站前端开发需要具备哪些基础知识? 做网站开发分为前端和后台,如果从事前端开发需要学习哪些基础知识呢?现在为大家总结一下。 html: ...

    程序员互动联盟
  • 资源 | Distill详述「可微图像参数化」:神经网络可视化和风格迁移利器!

    图像分类神经网络拥有卓越的图像生成能力。DeepDream [1]、风格迁移 [2] 和特征可视化 [3] 等技术利用这种能力作为探索神经网络内部原理的强大工具...

    机器之心
  • 在ubuntu16.04上安装owncloud

    cn華少
  • 如何看待和学习人工智能?这是五位哈佛博士生的AMA

    最近,五位哈佛的在读博士生集体来到著名社区reddit,展开一场围绕人工智能和认知科学的AMA(Ask Me Anything)。 简单介绍一下这几位博士生:R...

    小莹莹

扫码关注云+社区

领取腾讯云代金券