authorRekhesh Mohan <reks@iiap.res.in>
Thu, 12 Jul 2012 11:24:30 +0000 (16:54 +0530)
committerRekhesh Mohan <reks@iiap.res.in>
Thu, 12 Jul 2012 11:24:30 +0000 (16:54 +0530)
.gitignore
ChangeLog.txt
README.txt
configure.ac
src/fits2jpeg.c
src/fits2jpeg.h
src/image.c
src/messages.c

index 3820d63..40495b4 100644 (file)
@@ -16,5 +16,6 @@ src/*.o
 stamp-h1
 *~
 .*.swp
 stamp-h1
 *~
 .*.swp
+.*swp
 *.bak
 *.lock
 *.bak
 *.lock
index e557841..4076135 100644 (file)
@@ -3,5 +3,31 @@ CHANGELOG for CADS/UVS fits2jpeg software
 ------------------------------------------------------------------------
 
 NOTE: This file records the changes made after the release of the stable
 ------------------------------------------------------------------------
 
 NOTE: This file records the changes made after the release of the stable
-version fits2jpeg-1.0 
+version fits2jpeg-1.0
 ------------------------------------------------------------------------
 ------------------------------------------------------------------------
+
+
+
+Updates in 2.0 Release
+----------------------
+
+  1. Merged scale & operations to single flag
+     v1.0 had normalize/equalize handled by "-e" flag and rest of
+     image operations by "-s" flag. Both are merged into "-s" in
+     this release.
+
+  2. New option to clip image min/max
+     You can limit the pixel-values in output image using the flag
+     "-r". For eg: -r 10:300 to generate jpegs with pixel values in
+     the range 10 to 300.
+
+  3. New option to negate image option
+     A negative image can be generated using "-n" flag.
+
+  4. New option to resize image
+     zoom or shrink output image using "-z <zoomfact>".
+
+  5. New option to choose jpeg quality factor
+     You can choose the jpeg quality factor using "-q <quality>"
+     Quality factor was fixed at 100 in previous release.
+
index df79f4a..c5f5ca1 100644 (file)
@@ -6,12 +6,11 @@ README file for CADS/UVS fits2jpeg software
 
 0. FEATURES
 -----------
 
 0. FEATURES
 -----------
-fits2jpeg is a tiny program to read FITS Images and convert them
-to jpeg, which is more popular. This software supports various
-type of intensity scaling and image enhancements. fits2jpeg do not
-support coordinate axes overlay. fits2jpeg supports batch mode
-operations - for instance, converting several fits files to jpeg
-at once.
+fits2jpeg is a tiny program to read FITS Images and convert them to jpeg, which
+is more popular. This software supports various type of intensity scaling and
+image enhancements. fits2jpeg do not support coordinate axes overlay. fits2jpeg
+supports batch mode operations - for instance, converting several fits files to
+jpeg at once.
 
 
 1. BUILD/INSTALL
 
 
 1. BUILD/INSTALL
@@ -26,9 +25,10 @@ Pre-requisites:
     http://heasarc.gsfc.nasa.gov/docs/software/fitsio/fitsio.html
 
  b) JPEGLIB
     http://heasarc.gsfc.nasa.gov/docs/software/fitsio/fitsio.html
 
  b) JPEGLIB
-    jpeg library and headers. libjpeg is installed by default on most
-    platforms, but we need the header files too. Once you have cfitsio
-    and jpeglib installed, you may proceed with compiling jpeg2fits.
+    jpeg library and headers. libjpeg is installed by default on most platforms,
+    but we need the header files too. Once you have cfitsio and jpeglib
+    installed, you may proceed with compiling jpeg2fits.
+
     Follow these 4 steps:
 
 
     Follow these 4 steps:
 
 
@@ -61,20 +61,19 @@ Pre-requisites:
   2. Type `make' to compile the package.
 
   3. Type `make install' to install the programs and any data files and
   2. Type `make' to compile the package.
 
   3. Type `make install' to install the programs and any data files and
-     documentation. By default, the binary is copied to /usr/local/bin.
-     You may change this destination by passing on the following
-     argument to configure:
+     documentation. By default, the binary is copied to /usr/local/bin. You may
+     change this destination by passing on the following argument to configure:
 
              --prefix=/your/chosen/destination
 
      Which would result in the binary in /your/chosen/destination/bin
      You may need to ensure that in $PATH to run the program.
 
 
              --prefix=/your/chosen/destination
 
      Which would result in the binary in /your/chosen/destination/bin
      You may need to ensure that in $PATH to run the program.
 
-  4. You can remove the program binaries and object files from the
-     source code directory by typing `make clean'.
+  4. You can remove the program binaries and object files from the source code
+     directory by typing `make clean'.
 
 
-You may read more about configure script and others in the accompanying
-file named `INSTALL.txt'.
+You may read more about configure script and others in the accompanying file
+named `INSTALL.txt'.
 
 
 2.USAGE
 
 
 2.USAGE
@@ -116,6 +115,9 @@ file named `INSTALL.txt'.
          0.5            Shrink output to half of input
          2.0            Magnify output to double the size
 
          0.5            Shrink output to half of input
          2.0            Magnify output to double the size
 
+       fits2jpeg uses a bilinear interpolation based algorithm
+       to scale the image. Allowed range: 0.01 to 4.0
+       NOTE: Anything outside the allowed range will be clipped
 
   Output will be written to <fits_file_root>.jpg. For eg.,
 
 
   Output will be written to <fits_file_root>.jpg. For eg.,
 
@@ -123,8 +125,8 @@ file named `INSTALL.txt'.
 
   writes output to jpeg file 30dor.jpg
 
 
   writes output to jpeg file 30dor.jpg
 
-  Wild card entries allowed in <fits_file>. For eg: *.fits,
-  m31*.fits ngc???.fits etc.
+  Wild card entries allowed in <fits_file>. For eg: *.fits, m31*.fits
+  ngc???.fits etc.
 
   More examples:
 
 
   More examples:
 
@@ -145,11 +147,22 @@ iv.  fits2jpeg -s square -n -r 10:2000 m31.fits
      units.
 
 
      units.
 
 
+3.1. Sequence of operations
+---------------------------
+Here is the sequence of operations, after reading the fits file:
+
+     i. clip the image to user specified pixel limits, if it was requested
+    ii. Squeeze image pixel values to jpeg limits (0 - 255)
+   iii. image scaling function, default being linear pixel scale
+    iv. Negate the image, if requested
+     v. Image zoom - magnify or shrink the image
+    vi. Write out jpeg file
+
 3. DOCUMENTATION
 ----------------
 3. DOCUMENTATION
 ----------------
-An extensive coverage of how this program works along with line
-by line account of the happenings within the code, are dealt with
-in the user manual, which is yet to be written :(
+An extensive coverage of how this program works along with line by line account
+of the happenings within the code, are dealt with in the user manual, which is
+yet to be written :(
 
 
 4. LICENSE: GPL [See the file COPYING.txt for details]
 
 
 4. LICENSE: GPL [See the file COPYING.txt for details]
@@ -158,10 +171,9 @@ in the user manual, which is yet to be written :(
 
 5. DISCLAIMER
 -------------
 
 5. DISCLAIMER
 -------------
-You may encounter bugs in this software. If you do, please
-report them. Your bug reports are valuable contributions,
-since they allow us to notice and fix problems on
-machines/platforms we don't have, and/or remained un-noticed.
+You may encounter bugs in this software. If you do, please report them. Your bug
+reports are valuable contributions, since they allow us to notice and fix
+problems on machines/platforms we don't have, and/or remained un-noticed.
 
 
 6. REPORTING BUGS
 
 
 6. REPORTING BUGS
@@ -174,6 +186,7 @@ If you are too lazy, drop in an email to: cads_AT_iiap.res.in
 
 Either way, please include as many details as possible.
 
 
 Either way, please include as many details as possible.
 
+
 -----------------------------------------------------------
 Reks, 28 June 2012 <reks_at_iiap.res.in>
       Last modified: 10 July 2012
 -----------------------------------------------------------
 Reks, 28 June 2012 <reks_at_iiap.res.in>
       Last modified: 10 July 2012
index dd6b85e..770550d 100644 (file)
@@ -13,15 +13,16 @@ AC_PROG_MAKE_SET
 # Checks for libraries.
 
 # Checks for header files.
 # Checks for libraries.
 
 # Checks for header files.
-AC_CHECK_HEADERS([stdio.h stdlib.h string.h math.h float.h ctype.h libgen.h dirent.h])
+AC_CHECK_HEADERS([string.h math.h float.h ctype.h libgen.h dirent.h])
 
 # Checks for typedefs, structures, and compiler characteristics.
 
 
 # Checks for typedefs, structures, and compiler characteristics.
 
+
 # Checks for library functions.
 AC_FUNC_MALLOC
 
 LIBS="$LIBS -L/usr/lib64 -L/usr/lib -lm -ljpeg -lcfitsio"
 # Checks for library functions.
 AC_FUNC_MALLOC
 
 LIBS="$LIBS -L/usr/lib64 -L/usr/lib -lm -ljpeg -lcfitsio"
-CFLAGS="-ansi $CFLAGS -I/usr/include -I/usr/include/cfitsio"
+CFLAGS="-ansi -Wall $CFLAGS -I/usr/include -I/usr/include/cfitsio"
 #---------------------------------------------------------------------#
 #           Now we check for cfitsio headers and library              #
 #---------------------------------------------------------------------#
 #---------------------------------------------------------------------#
 #           Now we check for cfitsio headers and library              #
 #---------------------------------------------------------------------#
index 60420e2..cc97e08 100644 (file)
   4. negate image option
   5. jpeg quality factor
   6. pixel scaling operations moved to image.c
   4. negate image option
   5. jpeg quality factor
   6. pixel scaling operations moved to image.c
-  7. Image resizing works for reducing size. segfaults for zoom > 1 :(
+  7. Image resizing
   TODO
       1. move fits read to image.c
       2. specify output directory
   TODO
       1. move fits read to image.c
       2. specify output directory
-      3. Image resizing options
  *---------------------------------------------------------------------------*/
 
 #include "fits2jpeg.h"
  *---------------------------------------------------------------------------*/
 
 #include "fits2jpeg.h"
@@ -94,7 +93,7 @@ int main(int argc, char *argv[], char *envp[])
 {
     fitsfile *fptr;
 
 {
     fitsfile *fptr;
 
-    int scale = 0, process = 0, status = 0, jpgqual = 100, nfound, anynull;
+    int scale = 0, status = 0, jpgqual = 100, nfound, anynull;
     unsigned int i = 0, j = 0, usrclip = 0, usrnegt = 0, usrzoom = 0;
     long xdim = 0, ydim = 0, naxes[2], row_stride;
     unsigned long npixels = 0;
     unsigned int i = 0, j = 0, usrclip = 0, usrnegt = 0, usrzoom = 0;
     long xdim = 0, ydim = 0, naxes[2], row_stride;
     unsigned long npixels = 0;
@@ -133,6 +132,7 @@ int main(int argc, char *argv[], char *envp[])
             else if (strcmp(optarg, "normalize")==0) scale = 5;
             else if (strcmp(optarg, "equalize") ==0) scale = 6;
             else
             else if (strcmp(optarg, "normalize")==0) scale = 5;
             else if (strcmp(optarg, "equalize") ==0) scale = 6;
             else
+                printwarn(strcat(optarg, " -- Unrecognized option"));
                 scale = 0;
             break;
 
                 scale = 0;
             break;
 
@@ -165,7 +165,6 @@ int main(int argc, char *argv[], char *envp[])
                 sptr = strtok(tmpstr, ":");
                 datamin = atof(sptr);
             }
                 sptr = strtok(tmpstr, ":");
                 datamin = atof(sptr);
             }
-            printinfo("User defined pixel range");
 
             /* Remember.. now we have user specified range */
             usrclip = 1;
 
             /* Remember.. now we have user specified range */
             usrclip = 1;
@@ -187,7 +186,9 @@ int main(int argc, char *argv[], char *envp[])
             /* Do something to scale image
              */
             zoomfact = atof(optarg);
             /* Do something to scale image
              */
             zoomfact = atof(optarg);
-            if (zoomfact < 0.0) zoomfact = 1.0;
+            zoomfact = abs(zoomfact);
+            if (zoomfact < 0.01) zoomfact = 0.01;
+            if (zoomfact > 4.0) zoomfact = 4.0;
             usrzoom = 1;
             break;
 
             usrzoom = 1;
             break;
 
@@ -225,7 +226,7 @@ int main(int argc, char *argv[], char *envp[])
 
         /* Read in data */
         npixels = naxes[0] * naxes[1];
 
         /* Read in data */
         npixels = naxes[0] * naxes[1];
-        data = (float *) malloc(sizeof(float) * npixels);
+        data = malloc(sizeof(float) * npixels);
 
         nullval = 0;
         if (fits_read_img(fptr, TFLOAT, 1, npixels, &nullval, data, &anynull,
 
         nullval = 0;
         if (fits_read_img(fptr, TFLOAT, 1, npixels, &nullval, data, &anynull,
@@ -243,6 +244,7 @@ int main(int argc, char *argv[], char *envp[])
         /* IF user has provided a range, fix them as min & max in image */
         if (usrclip == 1)
         {
         /* IF user has provided a range, fix them as min & max in image */
         if (usrclip == 1)
         {
+            printinfo("user defined pixel range");
             for (i = 0; i < npixels; ++i)
             {
                 if (data[i] > datamax) data[i] = datamax;
             for (i = 0; i < npixels; ++i)
             {
                 if (data[i] > datamax) data[i] = datamax;
@@ -250,9 +252,7 @@ int main(int argc, char *argv[], char *envp[])
             } /*endfor*/
         }
 
             } /*endfor*/
         }
 
-        /* Allocate image buffer */
-        image_buffer = (unsigned char *) malloc(sizeof(char) * npixels);
-        scale_pixels(scale, npixels, data, image_buffer);
+        scale_pixels(scale, npixels, data, &image_buffer);
 
         /* Before we write jpeg, check if there is any requirement to negate
          * the image (usrnegt = 1)                                           */
 
         /* Before we write jpeg, check if there is any requirement to negate
          * the image (usrnegt = 1)                                           */
@@ -264,7 +264,11 @@ int main(int argc, char *argv[], char *envp[])
 
         xdim = naxes[0];
         ydim = naxes[1];
 
         xdim = naxes[0];
         ydim = naxes[1];
-        if (usrzoom == 1) resize_image(&xdim, &ydim, zoomfact, image_buffer);
+        if (usrzoom == 1)
+        {
+            printf("INFO   : Image zoom factor = %3.2f\n", zoomfact);
+            resize_image(&xdim, &ydim, zoomfact, &image_buffer);
+        }
 
         /*Write out data into JPEG file*/
         jpeg_file = fopen(jpeg_file_name, "wb");/* Open JPEG file for writing*/
 
         /*Write out data into JPEG file*/
         jpeg_file = fopen(jpeg_file_name, "wb");/* Open JPEG file for writing*/
index a96f9fb..3920d82 100644 (file)
 
 #define PROGRAM "fits2jpeg"
 #define r2d (90./atan2(1,0))
 
 #define PROGRAM "fits2jpeg"
 #define r2d (90./atan2(1,0))
-#define MAX_TEXT 150
+#define MAX_TEXT 1024
 
 int my_getopt(int, char * const *, const char *);
 
 int my_getopt(int, char * const *, const char *);
+void PRINT_BANNER(void);
+void usage(void);
 void signals_handler(int);
 void set_signals(void);
 void printinfo(const char *);
 void printwarn(const char *);
 void printerro(const char *);
 void signals_handler(int);
 void set_signals(void);
 void printinfo(const char *);
 void printwarn(const char *);
 void printerro(const char *);
-void scale_pixels(int, unsigned int, float *, JSAMPLE *);
-void resize_image(long *, long *, float, JSAMPLE *);
+void scale_pixels(int, unsigned int, float *, JSAMPLE **);
+void resize_image(long *, long *, float, JSAMPLE **);
index d1c22f0..f5f6c46 100644 (file)
@@ -27,8 +27,8 @@
 /*---------------------------------------------------------------------------*
  * SCALE_PIXELS: Changes the pixel scale to linear/log/sqroot/etc..
  *---------------------------------------------------------------------------*/
 /*---------------------------------------------------------------------------*
  * 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;
 {
     unsigned int i = 0;
     int JMAXVAL = 255;
@@ -74,10 +74,14 @@ void scale_pixels(int scale, unsigned int npixels,
     for (i = 1; i <= JMAXVAL; ++i)
         cumhist[i] += cumhist[i - 1] + hist[i];
 
     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)
     /* 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]);
 
     /*-----------------------------------------------------------------------*/
 
 
     /*-----------------------------------------------------------------------*/
 
@@ -88,28 +92,28 @@ void scale_pixels(int scale, unsigned int npixels,
             printinfo("Using square-root scale");
             scl_data = sqrt((float)JMAXVAL)/(float)JMAXVAL;
             for (i = 0; i < npixels; ++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)
             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)
             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)
             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 :
             break;
 
         case 5 :
@@ -141,12 +145,12 @@ void scale_pixels(int scale, unsigned int npixels,
             scl_data = (datamax - datamin)/(float)JMAXVAL;
             for (i = 0; i < npixels; ++i)
             {
             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
                 else
-                    image_buffer[i] = (int) abs((image_buffer[i]
+                    (*image_buffer)[i] = (int) abs(((*image_buffer)[i]
                                     - datamin)/scl_data);
             }
             break;
                                     - datamin)/scl_data);
             }
             break;
@@ -155,19 +159,21 @@ void scale_pixels(int scale, unsigned int npixels,
             /* histogram equalization */
             printinfo("Performing Histogram Equalization");
             for (i = 0; i <  npixels; ++i)
             /* 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;
     }
             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;
 {
     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;
 
     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;
 
     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;
 
             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)
 
             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;
     }
     *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)
     for (i = 0; i <  npixels; ++i)
-        image_buffer[i] = buff[i];
+        (*image_buffer)[i] = buff[i];
+    free(buff);
 }
 }
index edcdc68..75f890c 100644 (file)
@@ -62,6 +62,9 @@ void usage()
     printf ("       Resize/Scale output image by <zoomfactor>. Eg:      \n");
     printf ("         0.5            Shrink output to half of input     \n");
     printf ("         2.0            Magnify output to double the size  \n");
     printf ("       Resize/Scale output image by <zoomfactor>. Eg:      \n");
     printf ("         0.5            Shrink output to half of input     \n");
     printf ("         2.0            Magnify output to double the size  \n");
+    printf ("                        Allowed range: 0.01 to 4.0         \n");
+    printf ("       NOTE: Zooming will be carried out after all other   \n");
+    printf ("             operations, before writing out jpeg image     \n");
     printf ("  Output will be written to <fits_file_root>.jpg. Wild card\n");
     printf ("  entries allowed in <fits_file>; For eg: *.fits, m31*.fits\n");
     printf ("  ngc???.fits etc.                                         \n");
     printf ("  Output will be written to <fits_file_root>.jpg. Wild card\n");
     printf ("  entries allowed in <fits_file>; For eg: *.fits, m31*.fits\n");
     printf ("  ngc???.fits etc.                                         \n");