From 648b966c8358f0c215be516d339f2f64f706a902 Mon Sep 17 00:00:00 2001 From: mutantturkey Date: Thu, 28 Jun 2012 16:03:57 -0400 Subject: no segfaults anymore :-) --- fly-tools/derive-background/pixel.c | 200 ++++++++++++++++++++---------------- 1 file changed, 110 insertions(+), 90 deletions(-) diff --git a/fly-tools/derive-background/pixel.c b/fly-tools/derive-background/pixel.c index 9316e0d..7fde6ae 100644 --- a/fly-tools/derive-background/pixel.c +++ b/fly-tools/derive-background/pixel.c @@ -11,77 +11,72 @@ int main(int argc, char **argv ) { - MagickWand *magick_wand; - MagickWand *first; - double green = 0; - double red = 0; - double blue = 0; - int image = 0; + MagickWand *magick_wand; + MagickWand *output_wand; + MagickWand *first_wand; - int i = 0; - int j = 0; - int k = 0; - int l = 0; + double green, red, blue; + int i,j, k; + int image = 0; int height = 0; int width = 0; int nImages = 0; + unsigned long number_wands; + + char filename[256]; + char *temp; + + uint8_t ****array; + MagickWandGenesis(); - first = NewMagickWand(); - // Check the height and width of the first image - MagickReadImage(first, "Background.png"); - height = MagickGetImageHeight(first); - width = MagickGetImageWidth(first); + // open the first image and get the height and width + first_wand = NewMagickWand(); + if(MagickReadImage(first_wand, "Background.png") == MagickFalse) { + ThrowWandException(first_wand); + } + height = MagickGetImageHeight(first_wand); + width = MagickGetImageWidth(first_wand); - printf("%d %d \n", height, width); + first_wand = DestroyMagickWand(first_wand); + printf("height: %d width:%d \n", height, width); - // Count how many images there are in the input file - char fname[256]; + // count how many images there are in the input file FILE *count = fopen( argv[1], "r"); if(count != NULL) { - while((fgets(fname, sizeof(fname), count)) != NULL) { + while((fgets(filename, sizeof(filename), count)) != NULL) { nImages++; } fclose(count); } printf("%d \n", nImages); - //this will store the number of pixels in each row - unsigned long number_wands; - - char filename[256]; - char *temp; - FILE *file = fopen ( argv[1], "r" ); - // initialize this crazy array. - uint8_t ****array; - int dim1 = nImages; - int dim2 = height; - int dim3 = width; - int dim4 = 3; - - array = calloc(dim1, sizeof(array[0])); - for(i = 0; i < dim1; i++) + // initialize the storage array. + array = calloc(nImages, sizeof(array[0])); + for(i = 0; i < nImages; i++) { - array[i] = calloc(dim2, sizeof(array[0][0])); - for(j = 0; j < dim2; j++) + array[i] = calloc(height, sizeof(array[0][0])); + for(j = 0; j < height; j++) { - array[i][j] = calloc(dim3, sizeof(array[0][0][0])); - for(k = 0; k < dim3; k++) + array[i][j] = calloc(width, sizeof(array[0][0][0])); + for(k = 0; k < width; k++) { - array[i][j][k] = calloc(dim4, sizeof(array[0][0][0][0])); + array[i][j][k] = calloc(3, sizeof(array[0][0][0][0])); } } } - if ( file != NULL ) { - while ((fgets(filename, sizeof(filename), file)) != NULL ) { + // store each pixel in the storage array. array[nImage][height][width][ { R, G, B} ] + FILE *input_file = fopen ( argv[1], "r" ); + if ( input_file != NULL ) { + while ((fgets(filename, sizeof(filename), input_file)) != NULL ) { temp = strchr(filename, '\n'); if (temp != NULL) *temp = '\0'; @@ -114,7 +109,7 @@ int main(int argc, char **argv ) { image++; } - fclose ( file ); + fclose ( input_file ); } else { exit(0); @@ -142,65 +137,90 @@ int main(int argc, char **argv ) { gsl_histogram_increment (r, array[i][j][k][0]); gsl_histogram_increment (g, array[i][j][k][1]); gsl_histogram_increment (b, array[i][j][k][2]); - // printf("height %d width %d image %d %hhu %hhu %hhu \n", j, k, i, array[i][j][k][0], array[i][j][k][1], array[i][j][k][2]); + //printf("height %d width %d image %d %hhu %hhu %hhu \n", j, k, i, array[i][j][k][0], array[i][j][k][1], array[i][j][k][2]); } - size_t red = gsl_histogram_max_val(r); - size_t green = gsl_histogram_max_val(r); - size_t blue = gsl_histogram_max_val(r); - output[j][k][0] = array[red][j][k][0]; - output[j][k][1] = array[green][j][k][1]; - output[j][k][2] = array[blue][j][k][2]; - - printf("calculated histogram for (%d,%d) \n ", j, k); - /* int red_val = array[red - 1 ][j][k][0]; - int blue_val = array[blue - 1 ][j][k][1]; - int green_val = array[green - 1][j][k][2]; - printf("h:%d w:%d rm: %d gm: %d bm: %d rv: %lu bv: %lu gv:%lu\n", - j, k, red_val, green_val, blue_val, red, blue, green); - */ + size_t red = gsl_histogram_max_bin(r); + size_t green = gsl_histogram_max_bin(g); + size_t blue = gsl_histogram_max_bin(b); + int red_index = gsl_histogram_get(r, red); + int green_index = gsl_histogram_get(g, green); + int blue_index = gsl_histogram_get(b, blue); + output[j][k][0] = array[red_index - 1 ][j][k][0]; + output[j][k][1] = array[blue_index - 1 ][j][k][1]; + output[j][k][2] = array[green_index - 1 ][j][k][1]; + + printf("i (%d,%d) rgb(%d,%d,%d) \n ", j, k, output[j][k][0], output[j][k][1], output[j][k][2]); + gsl_histogram_free (r); gsl_histogram_free (g); gsl_histogram_free (b); } } - MagickWand *m_wand = NULL; - PixelWand *p_wand = NULL; - PixelIterator *iterator = NULL; - PixelWand **pixels = NULL; - - int x,y; - int grey; - MagickWandGenesis(); - - p_wand = NewPixelWand(); - PixelSetColor(p_wand,"white"); - m_wand = NewMagickWand(); - - MagickNewImage(m_wand,height,width,p_wand); - - // Get a new pixel iterator - iterator=NewPixelIterator(m_wand); + MagickWand *m_wand = NULL; + PixelWand *p_wand = NULL; + PixelIterator *iterator = NULL; + PixelWand **pixels = NULL; + int x,y; + char rgb[128]; + + MagickWandGenesis(); + + p_wand = NewPixelWand(); + PixelSetColor(p_wand,"white"); + m_wand = NewMagickWand(); + // Create a 100x100 image with a default of white + MagickNewImage(m_wand,height,width,p_wand); + // Get a new pixel iterator + iterator=NewPixelIterator(m_wand); + for(y=0;y<100;y++) { + // Get the next row of the image as an array of PixelWands + pixels=PixelGetNextIteratorRow(iterator,&x); + // Set the row of wands to a simple gray scale gradient + for(x=0;x<100;x++) { + sprintf(rgb, "rgb(%d,%d,%d)", array[0][i][j][0], array[0][i][j][1], array[0][i][j][2]); + PixelSetColor(pixels[x],rgb); + } + // Sync writes the pixels back to the m_wand + PixelSyncIterator(iterator); + } + // Clean up + iterator=DestroyPixelIterator(iterator); + MagickWriteImage(m_wand,"output.png"); + DestroyMagickWand(m_wand); + MagickWandTerminus(); + + + // write the histogram data to an image + // output_wand = NewMagickWand(); + // PixelWand *p = NewPixelWand(); + // PixelSetColor(p, "white"); + // if(MagickNewImage(output_wand, height, width, p) == MagickFalse) { + // ThrowWandException(output_wand); + // } + + // PixelIterator* iterator = NewPixelIterator(output_wand); + // PixelWand **pixels = PixelGetNextIteratorRow(iterator,&number_wands); + + // printf("Image number:%d Filename: %s \n", image, filename); + // for (i=0; i<=height; i++) { + // for (j=0; j