点晴MIS内部交流论坛加入收藏
新手上路
论坛搜索
 您的位置:点晴MIS系统问题答疑『 技术文档交流 』浏览当前帖子  
登 陆注 册论坛帮助  

  网站搜索
  搜索范围: 搜索方式: 关键词(可用空格分开)  

  作者及文章信息: 本文热度:279 % 
admin

积分:72258
等级:网站管理员
文数:12859
注册:2004-7-20

 信息   留言   主页   编辑   引用    

楼 顶 

 C#预览DWG文件方法:直接读取文件结构


struct BITMAPFILEHEADER

        {

            public short bfType;

            public int bfSize;

            public short bfReserved1;

            public short bfReserved2;

            public int bfOffBits;

        }

        public static System.Drawing.Image GetDwgImage(string FileName)

        {

            if (!(File.Exists(FileName)))

            {

                throw new FileNotFoundException("文件没有被找到");

            }

            FileStream DwgF=null;   //文件流

            int PosSentinel;   //文件描述块的位置

            BinaryReader br=null;   //读取二进制文件

            int TypePreview;   //缩略图格式

            int PosBMP;    //缩略图位置

            int LenBMP;    //缩略图大小

            short biBitCount; //缩略图比特深度

            BITMAPFILEHEADER biH; //BMP文件头,DWG文件中不包含位图文件头,要自行加上去

            byte[] BMPInfo;    //包含在DWG文件中的BMP文件体

            MemoryStream BMPF = new MemoryStream(); //保存位图的内存文件流

            BinaryWriter bmpr = new BinaryWriter(BMPF); //写二进制文件类

            System.Drawing.Image myImg = null;

            try

            {

                DwgF = new FileStream(FileName, FileMode.Open, FileAccess.Read); //文件流

                br = new BinaryReader(DwgF);

                DwgF.Seek(13, SeekOrigin.Begin); //从第十三字节开始读取

                PosSentinel = br.ReadInt32();   //1317字节指示缩略图描述块的位置

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

                TypePreview = br.ReadByte();   //31字节为缩略图格式信息,2 BMP格式,3WMF格式

                if (TypePreview == 1)

                {

                }

                else if (TypePreview == 2 || TypePreview == 3)

                {

                    PosBMP = br.ReadInt32(); //DWG文件保存的位图所在位置

                    LenBMP = br.ReadInt32(); //位图的大小

                    DwgF.Seek(PosBMP + 14, SeekOrigin.Begin); //移动指针到位图块

                    biBitCount = br.ReadInt16(); //读取比特深度

                    DwgF.Seek(PosBMP, SeekOrigin.Begin); //从位图块开始处读取全部位图内容备用

                    BMPInfo = br.ReadBytes(LenBMP); //不包含文件头的位图信息

                    br.Close();

                    DwgF.Close();

                    biH.bfType = 19778; //建立位图文件头

                    if (biBitCount < 9)

                    {

                        biH.bfSize = 54 + 4 * (int)(Math.Pow(2, biBitCount)) + LenBMP;

                    }

                    else

                    {

                        biH.bfSize = 54 + LenBMP;

                    }

                    biH.bfReserved1 = 0; //保留字节

                    biH.bfReserved2 = 0; //保留字节

                    biH.bfOffBits = 14 + 40 + 1024; //图像数据偏移

                    //以下开始写入位图文件头

                    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 = System.Drawing.Image.FromStream(BMPF); //创建位图文件对象

                    bmpr.Close();

                    BMPF.Close();

                }

                return myImg;

            }

            catch (EndOfStreamException)

            {

                throw new EndOfStreamException("文件不是标准的DWG格式文件,无法预览!");

            }

            catch (IOException ex)

            {

                if (ex.Message == "试图将文件指针移到文件开头之前。/r/n")

                {

                    throw new IOException("文件不是标准的DWG格式文件,无法预览!");

                }

                else if (ex.Message == "文件“" + FileName + "”正由另一进程使用,因此该进程无法访问该文件。")

                {

                    //复制文件,继续预览

                    File.Copy(FileName, Application.StartupPath + @"/linshi.dwg", true);

                    Image image = GetDwgImage(Application.StartupPath + @"/linshi.dwg");

                    File.Delete(Application.StartupPath + @"/linshi.dwg");

                    return image;

                }

                else

                {

                    throw new Exception(ex.Message);

                }

            }

            catch (Exception ex)

            {

                throw new Exception(ex.Message);

            }

            finally

            {

                if (DwgF != null)

                {

                    DwgF.Close();

                }

                if (br != null)

                {

                    br.Close();

                }

                bmpr.Close();

                BMPF.Close();

            }

        }

读取出来的背景色为白色,效果比较差,很多颜色显示不出来,当时认为显示DWG文件出错误了,问了些高手,(呵呵,别人告诉自己本身取出的就是白色背景,需要自己改变背景色,在此鄙视一下自己)所以继续用C#操作返回的IMAGE对象,改变背景色

///<summary>

        ///显示DWG文件

        ///</summary>

        ///<param name="Pwidth">要显示的宽度</param>

        ///<param name="PHeight">要显示的高度</param>

        ///<returns></returns>

        public static System.Drawing.Image ShowDWG(int Pwidth,int PHeight,string FilePath)

        {

            System.Drawing.Image image = GetDwgImage(FilePath);

            Bitmap bitmap = new Bitmap(image);

            int Height = bitmap.Height;

            int Width = bitmap.Width;

            Bitmap newbitmap = new Bitmap(Width, Height);

            Bitmap oldbitmap = (Bitmap)bitmap;

            Color pixel;

            for (int x = 1; x < Width; x++)

            {

                for (int y = 1; y < Height; y++)

                {

                    pixel = oldbitmap.GetPixel(x, y);

                    int r = pixel.R, g = pixel.G, b = pixel.B;

                    if (pixel.Name == "ffffffff" || pixel.Name == "ff000000")

                    {

                        r = 255 - pixel.R;

                        g = 255 - pixel.G;

                        b = 255 - pixel.B;

                    }

                    newbitmap.SetPixel(x, y, Color.FromArgb(r, g, b));

                }

            }

            Bitmap bt = new Bitmap(newbitmap, Pwidth, PHeight);

            return newbitmap;

        }


该文章在 2021/12/14 10:31:33 编辑过

  离 线  2021/12/14 10:28:48 
  本文章共有 0 页, 0 张回文,每页有 10 张回文 >> [ ]
页码:
Copyright 2003-2022 ClickSun All Rights Reserved