正文

BMP转成PCX文件2008-06-15 20:25:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/vfdff/36145.html

分享到:

自己用ACSEE把BMP转成PCX文件就行了注意文件格式:320*200*256
http://bbs.pfan.cn/showpost.asp?id=56348&t=o
#include<io.h>
#include<stdio.h>
#include<dos.h>
#include<string.h>
#include<math.h>
#include<stdio.h>
#include<bios.h>
#include<mem.h>
#include<fcntl.h>
#include<stdlib.h>
#include<conio.h>

#define SCREEN_HEIGHT 200
#define SCREEN_WIDTH 320
#define PALETTE_MASK 0x3c6
#define PALETTE_REGISTER_RD 0x3c7
#define PALETTE_REGISTER_WR 0x3c8
#define PALETTE_DATA 0x3c9

#define VGA256 0x13
#define TEXT_MODE 0x03
unsigned char far *video_buffer=(char far *)0xA0000000L;
typedef struct pcx_header_typ
    {
    char manufacturer;
    char version;
    char encoding;
    char bits_per_pixel;
    int x,y;
    int width,height;
    int horz_res;
    int vert_res;
    char ega_palette[48];
    char reserved;
    char num_color_planes;
    int bytes_per_line;
    int palette_type;
    char padding[58];

    } pcx_header, *pcx_header_ptr;

typedef struct RGB_color_typ
{
unsigned char red;
unsigned char green;
unsigned char blue;
}RGB_color,*RGB_color_ptr;

 

typedef struct pcx_picture_typ
    {
    pcx_header header;
    RGB_color palette[256];
    char far *buffer;

    } pcx_picture, *pcx_picture_ptr;


void Set_Palette_Register(int index,RGB_color_ptr color)
{
outp(PALETTE_MASK,0xff);
outp(PALETTE_REGISTER_WR,index);
outp(PALETTE_DATA,color->red);
outp(PALETTE_DATA,color->green);
outp(PALETTE_DATA,color->blue);
}


void PCX_Load_Screen(char *filename,int enable_palette)
{
// this function loads a pcx file into a picture structure, the actual image
// data for the pcx file is decompressed and expanded into a secondary buffer
// within the picture structure, the separate images can be grabbed from this
// buffer later.  also the header and palette are loaded

FILE *fp;
int num_bytes,index;
unsigned int count;
unsigned char data;
RGB_color palette[256];
// open the file


fp = fopen(filename,"rb");


fseek(fp,128L,SEEK_SET);
// load the data and decompress into buffer
count=0;


while(count<=(unsigned int)SCREEN_WIDTH * SCREEN_HEIGHT)
     {
     // get the first piece of data

     data = getc(fp);

     // is this a rle?

     if (data>=192 && data<=255)
    {
    // how many bytes in run?

        num_bytes = data-192;

    // get the actual data for the run

    data  = getc(fp);

        // replicate data in buffer num_bytes times

        while(num_bytes-->0)
         {
//             image->buffer[count++] = data;
  video_buffer[count++]=data;
         } // end while

    } // end if rle
     else
    {
    // actual data, just copy it into buffer at next location

    //image->buffer[count++] = data;
      video_buffer[count++]=data;
    } // end else not rle

     } // end while
for (index=0; index<256; index++)
    {
    // get the red component

    palette[index].red   = (getc(fp) >> 2);

    // get the green component

    palette[index].green = (getc(fp) >> 2);

    // get the blue component

    palette[index].blue  = (getc(fp) >> 2);

    } // end for index

fclose(fp);

// change the palette to newly loaded palette if commanded to do so

if (enable_palette)
   {

   for (index=0; index<256; index++)
       {

       Set_Palette_Register(index,(RGB_color_ptr)&palette[index]);

       } // end for index

   } // end if change palette

} // end PCX_Load

void Set_Video_Mode(int mode)
{
    union REGS inregs,outregs;
    inregs.h.ah=0;
    inregs.h.al=(unsigned char)mode;
    int86(0x10,&inregs,&outregs);
}

void Delay(int clicks)
{
    unsigned int far *clock=(unsigned int far *)0x0000046CL;
    unsigned int now;
    now=*clock;
    while(abs(*clock-now)<clicks){}
}


void main(void)
{
int i;
char *pcx[5];
pcx[1]="mark.pcx";
pcx[2]="mark1.pcx";
pcx[3]="mark2.pcx";

Set_Video_Mode(VGA256);
for(i=1;i<=3;i++)/*循环变量的值为数组的大小*/
    {
    PCX_Load_Screen(pcx[i],1);
    Delay(30);
    }   
getch();
Set_Video_Mode(TEXT_MODE);

}

阅读(4907) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册