+ -
当前位置:首页 → 问答吧 → 写了一个读取CAD文件生成缩略图的类,和大家分享

写了一个读取CAD文件生成缩略图的类,和大家分享

时间:2009-09-23

来源:互联网

终于能在这版发贴了! dwgthumb.zip (1.39 KB)
下载次数: 12
2009-9-23 12:52

[code]<?php
/**
+------------------------------------------------------------------------------
* 读取CAD dwg文件,生成缩略图
+------------------------------------------------------------------------------
* 作者:杨嵩 netyum
* 邮箱:[email protected]
* QQ  :8025628
* MSN :[email protected]
* 时间:2009-9-17 8:38
* 调用方法:
* $dwg = new dwgthumb();
* $dwg->read("./2.dwg")    //读取文件
*            ->show()                            //页面显示
*           ->save("./2.bmp");        //保存文件
+------------------------------------------------------------------------------
*/

class dwgthumb {
       
        var $fp = null;
        var $sentinelpos = 0;
        var $thumbtype = 0;
       
        var $bmpData = null;        //bmpData数据
        var $bmpHead = null;
        var $bmpBody = null;        //bmpData数据
       
        var $bmpSizeBitmapHeader = 0;
        var $bmpWidth = 0;
        var $bmpHeight = 0;
        var $bmpBitPlanes = 0;
        var $bmpBitCount = 8;
        var $bmpRelCompression = 0;
        var $bmpWidthxHeight = 0;
        var $bmpBitXPelsPerMeter = 0;
        var $bmpBitYPelsPerMeter = 0;
        var $bmpNumberOfPalettesUsed = 0;
        var $bmpNumberOfImportantColors = 0;
       
        function dwgthumb($filename="") {
                if ($filename!="") $this->readinfo($filename);
        }
       
        function read($filename) {
                if (!file_exists($filename)) {
                        echo "文件未找到";die();
                }
               
                $this->fp = fopen($filename,"rb");
                fseek($this->fp, 13);                //移动到13字节

                $this->sentinelpos = $this->fread2unpack(); //读4个字节
                fseek($this->fp, $this->sentinelpos + 30);        //移动
                $this->thumbtype = $this->fread2unpack(1); //读1个字节
                if ($this->thumbtype<0 && $this->thumbtype>3) {
                        echo "文件无缩图或各式不正确";die();
                }
               


                $bmpPos = $this->fread2unpack();
                $bmpLen = $this->fread2unpack();
               

                //开始读取bmpHeader图片信息
                fseek($this->fp, $bmpPos);
                $this->bmpSizeBitmapHeader =         $this->fread2unpack();
               
                $this->bmpWidth                    = $this->fread2unpack();        //获得宽高 用来计算header size
                $this->bmpHeight                   = $this->fread2unpack();

               
                $this->bmpBitPlanes                = $this->fread2unpack(2);
                $this->bmpBitCount                 = $this->fread2unpack(2);                //获得bit位数,
                /*
                $this->bmpRelCompression           = $this->fread2unpack();
                $this->$bmpWidthxHeight            = $this->fread2unpack();
                $this->$bmpBitXPelsPerMeter        = $this->fread2unpack();
                $this->$bmpBitYPelsPerMeter        = $this->fread2unpack();
                $this->$bmpNumberOfPalettesUsed    = $this->fread2unpack();
                $this->$bmpNumberOfImportantColors = $this->fread2unpack();*/


                fseek($this->fp, $bmpPos);
                $this->bmpBody = fread($this->fp,$bmpLen);
                fclose($this->fp);
                return $this;
        }       
       
        function makebmp() {
                $size = (4-($this->bmpWidth/(8/$this->bmpBitCount)) %4)%4;
                if ($this->bmpBitCount<24) $palsize=pow(2,$this->bmpBitCount)*4;
                $size = (floor($this->bmpWidth/(8/$this->bmpBitCount)) + $size) * $this->bmpHeight + 54;
                $size += $palsize;
                $offset = 54 + $palsize;
               
                // Bitmap 头
                $this->bmpHead = "BM";                                                           
                $this->bmpHead .= $this->fwrite2pack($size);
                $this->bmpHead .= $this->fwrite2pack(0);
                $this->bmpHead .= $this->fwrite2pack($offset);
               
                $this->bmpData = $this->bmpHead . $this->bmpBody;
        }
       
        function show() {
                if (is_null($this->bmpData)) $this->makebmp();
                header("Content-type:image/bmp");
                echo $this->bmpData;
                return $this;
        }
       
        function save($filename) {
                $fp = fopen($filename,"wb");
                fwrite($fp,$this->bmpData);
                fclose($fp);
                return true;
        }
       
        function fread2unpack($bit=4) {
                $bit = intval($bit);
                switch($bit) {
                        case "1":
                                $b = unpack("a",fread($this->fp,1));break;
                        case "2":
                                $b = unpack("s",fread($this->fp,2));break;
                        case "4":                       
                                $b = unpack("l",fread($this->fp,4));break;                               
                }
                if (isset($b[1])) return $b[1];
                else return fread($this->fp,$num);
        }
       
        function fwrite2pack($data,$bit=4) {
                $bit = intval($bit);
                switch($bit) {
                        case "1":
                                $b = pack("a",$data);break;
                        case "2":
                                $b = pack("s",$data);break;
                        case "4":
                                $b = pack("l",$data);break;       
                        default:
                                return $data;                       
                }
                return $b;
        }
       

}[/code]

作者: netyum   发布时间: 2009-09-23

作者: tdhfgg   发布时间: 2009-09-23