正文

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

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

分享到:

自己用ACSEE把BMP转成PCX文件就行了注意文件格式:320*200*256http://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 0x03unsigned 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 buffercount=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 whilefor (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); }

阅读(8131) | 评论(0)


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

评论

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