前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >VB.NET 直接读取CAD DWG文件转换成BMP位图进行预览

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

作者头像
一线编程
发布2019-07-22 14:54:35
4.1K1
发布2019-07-22 14:54:35
举报
文章被收录于专栏:办公魔盒

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

代码语言:javascript
复制
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
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 办公魔盒 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档