/* rawvga converts raspiraw VGA resolution .raw to .ppm/.pgm without dcraw A) https://www.johndcook.com/blog/2009/08/24/algorithms-convert-color-grayscale */ #include #include #include int hdr=0x8000, siz=640*480*5/4, shl=4, col=0; char M[2][2]={{'B','G'},{'G','R'}}; int L[17] = { 1/*B*/, 0,0,0,0, 10/*G*/, 0,0,0,0,0,0,0,0,0,0, 3/*R*/}; /* A) */ void out(char C, unsigned char u) { unsigned U = u * (col ? 1 : L[C-'B']); U <<= shl; if (U>255) { U=255; } if (col<1) { putchar(U); } else { switch (C) { case 'B': putchar(0); putchar(0); putchar(U); break; case 'G': putchar(0); putchar(U); putchar(0); break; case 'R': putchar(U); putchar(0); putchar(0); break; } } } int main(int argc, char *argv[]) { FILE *src; int i,j; if (argc!=3) { fprintf(stderr,"%s -C|-c|-g|-l file.raw\n",argv[0]); return(1); } if (strcasecmp(argv[1], "-c")==0) { printf("P6"); col=argv[1][1]-'b'; } else if (strcmp(argv[1], "-g")==0) { printf("P5"); L['G'-'B']=L['R'-'B']=1; } else if (strcmp(argv[1], "-l")==0) { printf("P5"); shl=1; } else { assert( !"-C|-c|-g|-l needed"); } assert( src = fopen(argv[2],"rb") ); fseek(src,0,SEEK_END); if (ftell(src) != hdr+siz) { hdr=0; } assert(ftell(src) == hdr+siz); fseek(src, hdr, 0); if (col>=0) { printf("\n640 480\n255\n"); for(i=0; i<480; ++i) { for(j=0; j<640; ++j) { out(M[i%2][j%2], fgetc(src)); if (j%4 == 3) { fgetc(src); } } } } else { unsigned char line[640/4*5], b, g, G, r, m; printf("\n320 240\n255\n"); for(i=0; i<480; i+=2) { int ofs=0; assert(640/4*5 == fread(line, 1, 640/4*5, src)); for(j=0; j<640; j+=2) { b=line[j+ofs]; g=line[j+ofs+1]; G=fgetc(src); r=fgetc(src); m=(((unsigned)g)+G)>>1; out('?', r); out('?', m); out('?', b); if (j%4 == 2) { fgetc(src); ++ofs; } } } } return fclose(src); }