#include #include unsigned char c1, c2, c3, c4, *argbbuf; unsigned char r, g, b, a; unsigned int i1, i2, i3, i4; float readintelfloat(), *buf, getrms(); main () { int nx, ny, i, index; float val, max, rms; /* read two integers from front of file, nx and ny */ nx = readintelint(); ny = readintelint(); if (nx < 1 || ny < 1 || nx > 1000000 || ny > 1000000) { fprintf(stderr, "convimage: nx=%d ny=%d improper, abort\n", nx, ny); exit(-1); } /* read five more integers from front (20 extra bytes); the last is a one */ for (i=0; i<5; i++) index = readintelint(); if (index != 1) fprintf(stderr, "convimage: warning, unexpected seventh integer=%d\n", index); fprintf(stderr, "convimage: nx=%d ny=%d\n", nx, ny); buf = (float *)malloc(nx*ny*sizeof(float)); max = 0; for (i=0; i < nx*ny; i++) { val = readintelfloat(); if (val < -1e30 || val > 1e30) { fprintf(stderr, "convimage: i=%d val=%g improper, abort\n", i, val); exit(-1); } val = (val<0 ? -1 : 1)* (float)(pow((double)(val<0 ? -val : val), (double)(0.8))); if ((val<0 ? -val : val) > max) max = val<0 ? -val : val; buf[i] = val; } rms = getrms(nx*ny); argbbuf = (unsigned char *)malloc(nx*ny*4); for (i=0; i < nx*ny; i++) { /* index = (int)(127.5 + buf[i]/max*127.5); a = (unsigned char)(255); r = (unsigned char)(index); g = (unsigned char)(index); b = (unsigned char)(index); */ if (buf[i] >= 0) { index = (int)(255 - (buf[i]/3/rms*255)); if (index > 255) index = 255; if (index < 0) index = 0; a = (unsigned char)(255); r = (unsigned char)(255); g = (unsigned char)(index); b = (unsigned char)(index); } else { index = (int)(255 + (buf[i]/3/rms*255)); if (index > 255) index = 255; if (index < 0) index = 0; a = (unsigned char)(255); r = (unsigned char)(index); g = (unsigned char)(index); b = (unsigned char)(255); } /*writeargb();*/ argbbuf[4*i] = a; argbbuf[4*i + 1] = r; argbbuf[4*i + 2] = g; argbbuf[4*i + 3] = b; } write(1, argbbuf, nx*ny*4); } int readintelint() { read(0, &c4, 1); read(0, &c3, 1); read(0, &c2, 1); read(0, &c1, 1); i1 = c1; i2 = c2; i3 = c3; i4 = c4; /*fprintf(stderr, "%d %d %d %d\n", i1<<24, i2<<16, i3<<8, i4);*/ return((i1<<24) + (i2<<16) + (i3<<8) + i4); /*return((i1*16777216) + (i2*65536) + (i3*256) + i4);*/ } float readintelfloat() { unsigned ibuf; float fval, *fv; read(0, &c4, 1); read(0, &c3, 1); read(0, &c2, 1); read(0, &c1, 1); i1 = c1; i2 = c2; i3 = c3; i4 = c4; ibuf = i1<<24 | i2<<16 | i3<<8 | i4; fv = (float *)(&ibuf); fval = *fv; return(fval); } writeargb() { write(1, &a, 1); write(1, &r, 1); write(1, &g, 1); write(1, &b, 1); } float getrms(n) int n; { int j; float sum; sum = 0; for (j=0; j