在Quick Basic中调用PCX图象文件

Author: 上海 汪 箴 Date: 1996-09-27

        PCX格式的图形有个128字节的文件头,依次包含了以下信息(括号内的数字表示其所占的字节):制造商编码(1)、版本号(1)、编码号(1)、像素占Bit数(1)、左上角坐标(4)、右下角坐标(4)、水平分辨率(2)、垂直分辨率(2)、调色板(48)、保留(1)、每条扫描线占字节数(2)、调色板格式(1)、保留(60)。从第129字节起是压缩过的图形。解压缩是用QB调用PCX文件的关键。PCX的解压缩方法是这样的:若读到的字节最前两个Bit都是1(即大于C0 h),则此字节的后六个Bit表示下一字节的重复遍数。例如压缩字串12 C3 00 34 C4 FF解压后就成为12 00 00 00 34 FF FF FF FF。
        了解了其存储格式,编程也就不是件难事了。以下是一个QB实例。
        DIM X1,X2,Y1,Y2,AS INTEGER   ;定义两角坐标
        DIM BPD,TMP AS STRING*1   ;BPD即像素占Bit数变量
        DIM P(10000)   ;可按需要设置
        OPEN "B",1,"PCX.PCX"   ;注意,必须用二进制方式打开PCX文件!
        GET #1,14,BPD   ;读取重要信息
        GET #1,5,X1
        GET #1,7,Y1
        GET #1,9,X2
        GET #1,11,Y2
        P(0)=X2-X1+1   ;设定图形宽度
        P(0)=Y2-Y1+1   ;设定图形高度
        DEF SEG=VARSEG(P(2))   ;设定段地址
        ADDR=VARPTR(P(2))   设定偏移地址
        SEEK #1,129   ;定位,准备解压
        DO WHILE NOT EOF(1)
        GET #1,,TMP
        IF (ASC(TMP) AND & HCO)=&HCO THEN   判断6、7位Bit是否为1
        C=ASC(TMP)-&HCO
        GET #1,,TMP
        FOR I=1 TO C
        POKE ADDR,ASC(TMP)
        ADDR=ADDR+1
        NEXT I   ;若是则解压
        ELSE
        POKE ADDR,ASC(TMP)
        ADDR=ADDR+1
        END IF
        LOOP   ;循环至文件末
        以后,可根据BPD值和需要,设定图形模式,即可用PUT命令SHOW出想要的图了!