签到

06月21日
尚未签到

共有回帖数 0

    顾我心安

    等级:
    16BMP2H 使用说明

    功能:把一个或多个16色位图转换为一个可以被C或C++ 包含(include)的.H头文件.
    提示:开始之后,要求输入文件名,一般来说,将BMP文件放在一个较易敲打出来的路径可能是个不错的想法.
    但是,将BMP文件与16BMP2H放在同一路径可能更为方便,因为这样你可以不用打出前面的路径.
    16BMP2H 要求文件输入时带后缀!也就是文件全名.
    一般来说,.H文件输出是在程序所在目录(当前目录,运行时自动将当前目录改为程序所在目录),文件名为LOGO.H
    任何人拥有更改文件名和文件内容的权利.

    16BMP2H 并不会区别16色BMP与256,或24位的BMP,当然,你必需保证文件是16位BMP! 256色或其它格式的文件,程序本身不会出
    错,但结果显然不会如你所愿.

    另外,在使用此程序时你必须估计你的程序所能使用的静态内存,特别是 TC2或其它DOS下的编译器,实际上,本程序"为TC2设计,
    为TC2所设计",所以有一些关于内存的问题要提前声明,TC2在Model为Huge时所能用的静态内存为64K,关于Model的问题请参阅
    有关文档,所以,也就是说,如果使用16BMP2H处理大于64K的BMP(总)并产生.H,(使用这个.H时)TC2可能会报错,而除此之外,你还
    要为你原来的程序做好打算.所以使用16BMP2H时请注意,你的工程不是太大!太大时,还是建议额外的读入BMP文件好.

    编这个东西的灵感来自于网上的一篇"VB中嵌入文件的非常实现",显然这篇文件的作者(可能)不会使用资源文件,就是说这种
    笨拙的方法并不适用于VB,反而非常适用于C,实践表明,这样嵌入BMP文件,EXE本身不会剧增(大小),反而使我们极易地使用BMP
    文件编程.
    当然,不足的就是,16色显然在一些场合不够用...
        使用静态内存确也不太聪明...

    如果你有一些好的解决以上问题的方法,不妨与我联系.
    另外附上生成logo.h的使用方法:
    正确操作生成的logo.h声明了若干个字符数组,当然,如上面所说,如果数组总大小大于64K,可能会惹来TC2的抱怨.
    生成logo.h提供一个函数--logo(x,y,index,method)用于输出以上数组所包含的BMP图象(实际上是putimage格式)
    其中x,y是要显示的屏幕坐标,index是包含进时图象的次序,制作时第一个输入的BMP为1,第二个为2,...要注意的是
    这个index是从1开始,.H本身并不提供原来BMP文件的任何标识,这意味着,你在生成logo.h后,可能无法得知原来BMP与index
    的对应关系,假如你没有把你输入的次序记下来的话.   对于method的话,它实际是图象的输出方式,graphics.h中有定义:
    COPY_PUT, XOR_PUT, AND_PUT, OR_PUT, NOT_PUT,相关作用请参阅其它文档.

    对于使用自行生成的logo.h所产生的任何后果,16BMP2H作者不承担任何责任.

    文曦畅

    /*****************************代码*************************************/
    #include stdio.h
    #include dir.h
    #include dos.h
    #include string.h
    char *malloc();

    int BmpToTmpFile(char *bmpFile, int index){
       unsigned char outPutName[15];
       unsigned char c[8], scanTimes, scanPixs;
       unsigned char wkPos;
       int i, j, k, n, crtPos, imgWh, imgHt;
       static int color[16] = {0,4,2,6,1,5,3,7,8,12,10,14,9,13,11,15};
       unsigned char wkLine[640], scLine[640];
       FILE *fp, *tmpFileP;
       union{
           unsigned char value;
           struct{
               unsigned cl:4;
               unsigned ch:4;
           }color;
       }mycolor;

       if((fp = fopen(bmpFile, "rb")) == NULL) {
           printf("Open File Error!n");
           return(0);
       }
       sprintf(outPutName, "BMP2H%d.TMP", index);
       tmpFileP = fopen(outPutName, "wb");

       fseek(fp, 18, SEEK_SET);
       imgWh=0; imgHt=0;
       fread(&imgWh, 4, 1, fp);
       fread(&imgHt, 4, 1, fp);
       printf("Width: %d, Height: %dn", imgWh, imgHt);
       
       if(imgWh==0 || imgHt==0 || imgWh640 || imgHt480){
           fclose(fp);
           fclose(tmpFileP);
           return(0);
       }

       imgWh--;
       imgHt--;
       scanTimes = imgWh / 8 + 1;
       scanPixs = scanTimes * 4;

       fputc(imgWh % 256, tmpFileP);
       fputc(imgWh / 256, tmpFileP);
       fputc(imgHt % 256, tmpFileP);
       fputc(imgHt / 256, tmpFileP);
       
       fseek(fp, -scanPixs, SEEK_END);

       for(j = 0; j = imgHt; j++){
           crtPos = 0;

        fread(scLine, scanPixs, 1, fp);
           fseek(fp, -scanPixs * 2, SEEK_CUR);
           for(n = 3; n = 0; n--){
               for(i = 0; i  scanTimes; i++){
                   wkPos = 0;
                   for(k = 0; k  4; k++){
                       mycolor.value = scLine[i * 4 + k];
                       c[k * 2] = color[mycolor.color.ch];
                       c[k * 2 + 1] = color[mycolor.color.cl];
                   }
                   for(k = 0; k  8; k++)
                       wkPos += (c[k]  n & 1)  (7 - k);
                   wkLine[crtPos] = wkPos; crtPos++;
               }
           }
           fwrite(wkLine, scanPixs, 1, tmpFileP);
       }
       fclose(fp);
       fclose(tmpFileP);
       return(1);
    }
    main(){
       char fileKill[30];
       char fName[50];
       int fCount = 1, i;
       unsigned long n, tmpN;
       char buf[50];
       FILE *hp, *tmp;
       long codeNum = 0;
       int key = 0;
       unsigned char *buffer;
       struct ffblk *ff;
       
           system("cls");
           printf("ttttProgrammer :Wen Xichang.nntttttGDUFSn");
           printf("ttt     Xichang.wen@yahoo.com.cnnnn");
           printf("******************************************nn");
           printf("ttVER 1.0nn");
           printf("This program make a ".h" file that includesn");
           printf("ONE or MORE  16-color-BMP(s) file.nn");
           printf("You can Use "logo()" mathod to PAINT the BMP file(s)n");
           printf("WITHOUT loading the BMP file(s)!nn");
           printf("But, MAKE SURE that the BMP files are 16-color formatted!n");
           printf("And SMALL!!!(  64K)nn");
           printf("******************************************nn");

       printf("Press Any key to start...n    (Or Q to quit.)");
       key = getche();
       if (key == 'q' || key == 'Q') exit(0);
       
       for(;;){
           printf("nPlease input the name of the %dth BMP file.n:", fCount);
           gets(fName);
           if(BmpToTmpFile(fName, fCount))
               fCount++;
           printf("nAdd another?(Y/N)");
           key = getche();

           if(key == 'N' || key == 'n') break;
       }

       if((hp = fopen("logo.h", "w+")) == NULL) {

      printf("Open or Create a File Error!");
           return(0);
       }
       printf("nnPlease wait...n");
       fputs("/*logo.hn *此文件由16BMP2H自动生成.n *本文件提供logo(x,y,index,method)函数在屏幕x,y处以method方式输出第index个图象.n */nn", hp);
       fputs("#include graphics.hnn", hp);

       for(i = 1; i  fCount; i++){
           sprintf(buf, "char logoBmp%d[]={", i);
           fputs(buf, hp);
           codeNum = 0;

           sprintf(buf, "BMP2H%d.TMP", i);
           tmp=fopen(buf,"rb");

           findfirst(buf,ff,FA_ARCH);
           printf("nSize:%un",ff-ff_fsize);
           
           if((buffer=malloc(ff-ff_fsize))==NULL){
               printf("Not enough Memory.(molloc failed).");
               getch();
               exit(0);
           }
           n=0;
           while(!feof(tmp)){
               buffer[n]=fgetc(tmp);
               n++;
           }
           fclose(tmp);
           
           sprintf(fileKill, "del %s", buf);
           system(fileKill);

           tmpN=n-1;
           sprintf(buf, "%u", buffer[0]);
           fputs(buf,hp);
           for(n = 1,codeNum = 0; ntmpN;n++){
               fputc(',',hp);
               
               printf("%ldbbbbbbbbbb",++codeNum);
               if(codeNum % 30 == 0)
                   fputc('n', hp);
                   
               sprintf(buf, "%u", buffer[n]);
               fputs(buf,hp);
           }
           fputs("};nn", hp);
           free(buffer);
           printf("n%d Done!n", i);
       }
       fputs("nnint logo(int x, int y, int index, int method){n", hp);
       fputs("tswitch(index){n", hp);

       for(i = 1; i  fCount; i++){
           sprintf(buf, "ttcase %d:n", i);
           fputs(buf, hp);
           sprintf(buf, "tttputimage(x,y,logoBmp%d,method);n", i);
           fputs(buf, hp);
           fputs("tttbreak;n", hp);
       }
       fputs("t}n}", hp);
       fclose(hp);
       printf("nALL DONE!!nn"logo.h" writed!nnPress any key to exit...");
       getch();
    }
    /*********************************代码结束********************************/

    本程序在编译时会有2/3个warning...不要紧,生成exe就没此问题。
    在TC2+winXP下通过.

    楼主 2016-03-16 17:46 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知