#include #define VERSION "0.01" #define AUTHOR "Mishiki Sakana" #define MYMAIL "osakana@ofo.jp" void showUsage(char *filename){ fprintf (stderr, "\"%s\" Ver. %s by %s <%s>\nUsage: %s FILE(.bmp)\n\t(if you omit FILE, read from STDIN.)\n\n",filename, VERSION, AUTHOR, MYMAIL, filename); return; } int checkBmpSig(FILE *fp){ rewind(fp); if ( fgetc(fp) != 'B' || fgetc(fp) != 'M') { return (0); } return (1); } FILE *stdin2tmpfile(FILE *fp){ FILE *ft; int c; if (fp!=stdin){return (fp);} ft = tmpfile(); while((c = fgetc(fp)) != EOF){ fputc(c, ft); } return (ft); } int main(int argc, char **argv){ FILE *fp; char filename[255]; if (argv[1]){ if (strcmp(argv[1],"-h")==0 || strcmp(argv[1],"--help")==0){ showUsage(argv[0]); exit(1); } strcpy (filename, argv[1]); } if ((fp = fopen (filename, "rb")) == NULL){ fp = stdin; fp = stdin2tmpfile(fp); strcpy (filename, "STDIN"); } if (!checkBmpSig(fp)){ fprintf(stderr,"%s is NOT a bmp file.\n", filename); exit(1); } fseek(fp,0x1C,SEEK_SET); if (fgetc(fp) != 0x10){ fprintf(stderr,"%s is NOT a 16-bit bmp file.\n", filename); exit(1); } fseek(fp,0x1E,SEEK_SET); if (fgetc(fp) != 0x00){ fprintf(stderr,"biCompression is not 0x00. Not supported format.\n"); exit(1); } unsigned long imgwidth; unsigned long imgheight; fseek(fp,0x12,SEEK_SET); fread (&imgwidth,4,1,fp); fread (&imgheight,4,1,fp); printf ("P3\n%d %d\n31\n\n",imgwidth,imgheight); //check the header length and skip it. fseek(fp,0x0A,SEEK_SET); int startat=fgetc(fp); fseek(fp,startat,SEEK_SET); unsigned short filebit; unsigned short rval=0; unsigned short gval=0; unsigned short bval=0; int realbitwidth=imgwidth*2; int bitwidth = (realbitwidth%4)?((realbitwidth/4+1)*4):(realbitwidth); int i=0; while (i> 11; gval = filebit << 6; gval = gval >> 11; rval = filebit << 1; rval = rval >> 11; printf ("%d %d %d\n",rval,gval,bval); } i++; } fclose (fp); }