diff --git a/src/image.c b/src/image.c
--- a/src/image.c
+++ b/src/image.c
/*---------------------------------------------------------------------------*
* SCALE_PIXELS: Changes the pixel scale to linear/log/sqroot/etc..
*---------------------------------------------------------------------------*/
-void scale_pixels(int scale, unsigned int npixels,
- float *data, JSAMPLE *image_buffer)
+void scale_pixels(int scale, unsigned int npixels, float *data,
+ JSAMPLE ** image_buffer)
{
unsigned int i = 0;
int JMAXVAL = 255;
for (i = 1; i <= JMAXVAL; ++i)
cumhist[i] += cumhist[i - 1] + hist[i];
+ /* Allocate image buffer */
+ (*image_buffer) = malloc(sizeof(unsigned char) * npixels);
+
+
/* Linear scale (min-max) : This is the default scaling
* histo-eq will fail if we dont generate image_buffer here */
for (i = 0; i < npixels; ++i)
- image_buffer[i] = (int)(data[i]);
+ (*image_buffer)[i] = (int)(data[i]);
/*-----------------------------------------------------------------------*/
printinfo("Using square-root scale");
scl_data = sqrt((float)JMAXVAL)/(float)JMAXVAL;
for (i = 0; i < npixels; ++i)
- image_buffer[i] = (int)(sqrt(data[i])/scl_data);
+ (*image_buffer)[i] = (int)(sqrt(data[i])/scl_data);
break;
case 2 : /* Square */
printinfo("Using quadratic scale");
scl_data = pow((float)JMAXVAL,2)/(float)JMAXVAL;
for (i = 0; i < npixels; ++i)
- image_buffer[i] = (int)abs((pow(data[i],2) - 1.0)/scl_data);
+ (*image_buffer)[i] = (int)abs((pow(data[i],2) - 1.0)/scl_data);
break;
case 3 : /* Cubic */
printinfo("Using cubic scale");
scl_data = pow((float)JMAXVAL,3)/(float)JMAXVAL;
for (i = 0; i < npixels; ++i)
- image_buffer[i] = (int)abs((pow(data[i],3) - 1.0)/scl_data);
+ (*image_buffer)[i] = (int)abs((pow(data[i],3) - 1.0)/scl_data);
break;
case 4 : /* log */
printinfo("Using log scale");
scl_data = log(1.0 + (float)JMAXVAL)/(float)JMAXVAL;
for (i = 0; i < npixels; ++i)
- image_buffer[i] = (int)((log(abs(data[i]) + 1.0))/scl_data);
+ (*image_buffer)[i] = (int)((log(abs(data[i]) + 1.0))/scl_data);
break;
case 5 :
scl_data = (datamax - datamin)/(float)JMAXVAL;
for (i = 0; i < npixels; ++i)
{
- if (image_buffer[i] >= datamax)
- image_buffer[i] = JMAXVAL;
- else if (image_buffer[i] <= datamin)
- image_buffer[i] = 0;
+ if ((*image_buffer)[i] >= datamax)
+ (*image_buffer)[i] = JMAXVAL;
+ else if ((*image_buffer)[i] <= datamin)
+ (*image_buffer)[i] = 0;
else
- image_buffer[i] = (int) abs((image_buffer[i]
+ (*image_buffer)[i] = (int) abs(((*image_buffer)[i]
- datamin)/scl_data);
}
break;
/* histogram equalization */
printinfo("Performing Histogram Equalization");
for (i = 0; i < npixels; ++i)
- image_buffer[i] = cumhist[image_buffer[i]] * JMAXVAL;
+ (*image_buffer)[i] = cumhist[(*image_buffer)[i]] * JMAXVAL;
break;
default :
printinfo("Using linear scale");
break;
}
-
}
/*---------------------------------------------------------------------------*
- * RESIZE_IMAGE: Scales down/up the image_buffer
+ * RESIZE_IMAGE: Scales down/up the image_buffer using bilinear scaling
+ * Based on an article by "John" at
+ * http://tech-algorithm.com/articles/bilinear-image-scaling/
*---------------------------------------------------------------------------*/
-void resize_image(long *xdim, long *ydim, float zoomfact, JSAMPLE *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;
@@ -186,8 +192,8 @@ void resize_image(long *xdim, long *ydim, float zoomfact, JSAMPLE *image_buffer)
xratio = ((float)(w - 1))/zxdim;
yratio = ((float)(h - 1))/zydim;
- /* allocate space for *buff */
- buff = (unsigned char *) malloc(sizeof(char) * zxdim * zydim);
+ /* allocate space for *buff */
+ buff = malloc(sizeof(unsigned char) * zxdim * zydim);
index = 0;
offset = 0;
@@ -203,10 +209,10 @@ void resize_image(long *xdim, long *ydim, float zoomfact, JSAMPLE *image_buffer)
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;
+ 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)
@@ -218,10 +224,8 @@ void resize_image(long *xdim, long *ydim, float zoomfact, JSAMPLE *image_buffer)
}
*xdim = zxdim;
*ydim = zydim;
- image_buffer = realloc(image_buffer, sizeof(char) * npixels);
- if (!image_buffer)
- printerro("Failed to allocate memory");
-
+ (*image_buffer) = realloc((*image_buffer), sizeof(unsigned char) * npixels);
for (i = 0; i < npixels; ++i)
- image_buffer[i] = buff[i];
+ (*image_buffer)[i] = buff[i];
+ free(buff);
}