X-Git-Url: https://cads.iiap.res.in/gitview/?p=fits2jpeg.git;a=blobdiff_plain;f=src%2Fimage.c;fp=src%2Fimage.c;h=d1c22f07bfa79d885c512505d8258a5dc1eff96e;hp=7a068e95892274491916e9ebca6027524081b3e6;hb=60d065b23a2bdd48da5b8ef3ce591b7b0313c979;hpb=e31da38fa70e45758bd0c82b124c018c25e78e23 diff --git a/src/image.c b/src/image.c index 7a068e9..d1c22f0 100644 --- a/src/image.c +++ b/src/image.c @@ -24,7 +24,10 @@ /*Header Definitions*/ #include "fits2jpeg.h" -void scale_image(int scale, int npixels, +/*---------------------------------------------------------------------------* + * SCALE_PIXELS: Changes the pixel scale to linear/log/sqroot/etc.. + *---------------------------------------------------------------------------*/ +void scale_pixels(int scale, unsigned int npixels, float *data, JSAMPLE *image_buffer) { unsigned int i = 0; @@ -34,7 +37,7 @@ void scale_image(int scale, int npixels, float scl_data = 0.0; - /* first find min & max in data */ + /* first find min & max in data */ datamax = -1.0 * FLT_MAX; datamin = FLT_MAX; for (i = 0; i < npixels; ++i) @@ -43,19 +46,22 @@ void scale_image(int scale, int npixels, if (data[i] < datamin) datamin = data[i]; } /*endfor*/ - /* Convert data into bytscaled values for jpeg file */ - /* the dynamic range is reduced to 255 for jpeg */ + + /* Convert data into bytscaled values for jpeg file */ + /* the dynamic range is reduced to 255 for jpeg */ scl_data = (datamax - datamin)/(float)JMAXVAL; + for (i = 0; i < npixels; ++i) data[i] = (data[i] - datamin)/scl_data; - /* All data is now squeezed into the range 0 - 255 */ - /* NOTE: At this point onwards min & max is 0 and 255 respectively */ + + /* All data is now squeezed into the range 0 - 255 */ + /* NOTE: At this point onwards min & max is 0 and 255 respectively */ datamax = (float)JMAXVAL; datamin = 0.0; - /* initialize image histogram. ensure all are zeroes in hist[] */ - /*-------------------------------------------------------------------*/ + /* initialize image histogram. ensure all are zeroes in hist[] */ + /*-----------------------------------------------------------------------*/ for (i = 0; i <= JMAXVAL; ++i) hist[i] = 0; /* construct the image histogram */ @@ -69,11 +75,11 @@ void scale_image(int scale, int npixels, cumhist[i] += cumhist[i - 1] + hist[i]; /* Linear scale (min-max) : This is the default scaling - * if we dont generate image_buffer here, histo-eq will fail */ + * histo-eq will fail if we dont generate image_buffer here */ for (i = 0; i < npixels; ++i) image_buffer[i] = (int)(data[i]); - /*-------------------------------------------------------------------*/ + /*-----------------------------------------------------------------------*/ switch (scale) @@ -140,7 +146,8 @@ void scale_image(int scale, int npixels, else if (image_buffer[i] <= datamin) image_buffer[i] = 0; else - image_buffer[i] = (int) abs((image_buffer[i] - datamin)/scl_data); + image_buffer[i] = (int) abs((image_buffer[i] + - datamin)/scl_data); } break; @@ -148,7 +155,7 @@ void scale_image(int scale, int npixels, /* histogram equalization */ printinfo("Performing Histogram Equalization"); for (i = 0; i < npixels; ++i) - image_buffer[i] = cumhist[image_buffer[i]] * 255; + image_buffer[i] = cumhist[image_buffer[i]] * JMAXVAL; break; default : printinfo("Using linear scale"); @@ -156,3 +163,65 @@ void scale_image(int scale, int npixels, } } + +/*---------------------------------------------------------------------------* + * RESIZE_IMAGE: Scales down/up the image_buffer + *---------------------------------------------------------------------------*/ +void resize_image(long *xdim, long *ydim, float zoomfact, JSAMPLE *image_buffer) +{ + int offset = 0, index = 0; + int A, B, C, D, x, y, gray; + JSAMPLE *buff; + unsigned int i = 0, j = 0; + unsigned long npixels = 0; + long w = *xdim, h = *ydim; + long zxdim = 0, zydim = 0; + float xdiff, ydiff, xratio, yratio; + + zxdim = (int)(w * zoomfact); + zydim = (int)(h * zoomfact); + + npixels= zxdim * zydim; + + xratio = ((float)(w - 1))/zxdim; + yratio = ((float)(h - 1))/zydim; + + /* allocate space for *buff */ + buff = (unsigned char *) malloc(sizeof(char) * zxdim * zydim); + + index = 0; + offset = 0; + for (i = 0; i < zydim; i++) + { + y = (int)(yratio * i); + ydiff = (yratio * i) - y; + + for (j = 0; j < zxdim; j++) + { + x = (int)(xratio * j); + + xdiff = (xratio * j) - x; + index = y * w + x; + + A = image_buffer[index] & 0xff; + B = image_buffer[index + 1] & 0xff; + C = image_buffer[index + w] & 0xff; + D = image_buffer[index + w + 1] & 0xff; + + gray = (int)(A * (1 - xdiff) * (1 - ydiff) + + B * (xdiff) * (1 - ydiff) + + C * (ydiff) * (1 - xdiff) + + D * (xdiff) * (ydiff) + ); + buff[offset++] = gray; + } + } + *xdim = zxdim; + *ydim = zydim; + image_buffer = realloc(image_buffer, sizeof(char) * npixels); + if (!image_buffer) + printerro("Failed to allocate memory"); + + for (i = 0; i < npixels; ++i) + image_buffer[i] = buff[i]; +}