/************************************************** * * file d:\cips\display.c * * Functions: This file contains * display_image * display_image_portion * display_menu_for_display_image * map_16_shades_of_gray * map_64_shades_of_gray * transform_the_colors * * Purpose: * These functions display images on a the * monitor. * * External Calls: * rtiff.c - read_tiff_image * cips.c - my_clear_text_screen * hist.c - zero_histogram * calculate_histogram * perform_histogram_equalization * display_histogram * * Modifications: * 17 June 1987 - created * August 1990 - extension modifications for use * in the C Image Processing System. * ***************************************************/ #include "cips.h" /*************************** * * display_image(... * ****************************/ display_image(file_name, image, il, ie, ll, le, image_header, monitor_type, color_transform, invert, image_colors, display_colors, show_hist, title) char color_transform[], file_name[], monitor_type[], title[]; int display_colors, image_colors, invert, il, ie, ll, le, show_hist; short image[ROWS][COLS]; struct tiff_header_struct *image_header; { char channels[80], response[80]; int a, b, c, channel, count, display_mode, dx_offset, dy_offset, key, horizontal, len, max_horizontal, max_vertical, not_finished, q, r, vertical, x_offset, y_offset; unsigned int block, color, i, j, x, y; unsigned long histogram[256], new_hist[256]; /********************************************** * * If you want to display the histogram and * do not want to perform hist equalization, * then zero the histogram for calculations. * **********************************************/ if( (show_hist == 1) && (color_transform[0] != 'H')) zero_histogram(histogram); not_finished = 1; while(not_finished){ if(display_colors == 16){ if(monitor_type[0] == 'V'){ horizontal = 4; vertical = 6; display_mode = _VRES16COLOR; /* MSC 6.0 */ } /* ends if V */ if(monitor_type[0] == 'E'){ horizontal = 3; vertical = 6; display_mode = _ERESCOLOR; /* MSC 6.0 */ } /* ends if E */ } /* ends if colors == 16 */ else{ horizontal = 2; vertical = 2; display_mode = _MAXCOLORMODE; /* MSC 6.0 */ } /******************************************** * * Somehow, my dx and dy offsets are * backwards from my horizontal and vertical * variables. Trying to center the images * on the screen. March 21 1992 * ********************************************/ max_horizontal = (image_header->image_length+50) /COLS; max_vertical = (image_header->image_width+50) /ROWS; dy_offset = ((horizontal-max_horizontal)/2) *COLS + 50; dx_offset = ((vertical-max_vertical)/2) *ROWS + 20; if(max_horizontal > horizontal) dy_offset = 0; if(max_vertical > vertical) dx_offset = 0; if(horizontal > max_horizontal) horizontal = max_horizontal; if(vertical > max_vertical) vertical = max_vertical; /**************************************** * * If color transform wants histogram * equalization, then read in the * image arrays and calculate the * histogram. Zero both the histogram * and the new_hist. You will need the * new_hist if you want to display the * equalized hist. * *****************************************/ if(color_transform[0] == 'H'){ count = 1; zero_histogram(histogram); zero_histogram(new_hist); for(a=0; a Calculating histogram"); printf(" %d of %d", count,vertical*horizontal); count++; read_tiff_image(file_name, image, il+y, ie+x, ll+y, le+x); calculate_histogram(image, histogram); } /* ends loop over b */ } /* ends loop over a */ } /* ends if display_mode == H */ /* set graphics mode */ _setvideomode(display_mode); /* MSC 6.0 */ if(display_colors == 16) map_16_shades_of_gray(display_mode); if(display_colors == 256) map_64_shades_of_gray(); /**************************************** * * Loop over this size and * read and display ROWSxCOLS arrays. * * If you want to show the histogram AND * do not want to do hist equalization * then calculate the hist from the * original image array. * * If you want to do hist equalization * then calculate the new_hist AFTER * the image has been equalized by the * the transform_the_colors function. * * NOTE: Remember that the function * transform_the_colors changes the * gray shade values in image array. * *****************************************/ /***************************************** * * These statements place a gray * background across the display area of * a VGA screen. This reduces the * contrast between the screen background * and the images you display. This makes * it easier to take photos. * *******************************************/ _setlinestyle(0xFFFF); _setcolor(10); for(i=0; i<640;i++){ _moveto(i, 0); _lineto(i, 480); } for(a=0; a Enter choice " "(0 for no change) "); printf("\nDISPLAY> 1. Invert is %d (1=on 0=off)", *invert); printf("\nDISPLAY> 2. Color Transform-- %s", color_transform); printf("\nDISPLAY> 3. Input image has %d colors", *image_colors); printf("\nDISPLAY> 4. Display will show %d colors", *display_colors); printf("\nDISPLAY> 5. Monitor type is %s", monitor_type); printf("\nDISPLAY> 6. Histogram is %d", *show_hist); printf(" (1=show 0=don't show)"); printf("\nDISPLAY> _\b"); get_integer(&r); if(r == 0){ not_finished = 0; } if(r == 1){ printf("\nDISPLAY> Enter 1 for invert on"); printf(" 0 for invert off"); printf("\nDISPLAY> ___"); get_integer(&int_response); *invert = int_response; } /* ends if r == 1 */ if(r == 2){ printf("\nDISPLAY> Enter the new color " "transform mode "); printf("\nDISPLAY> (S) Straight mode"); printf(" (H) Histogram Equalization"); printf("\nDISPLAY> _\b"); gets(response); if((response[0] == 'S') || (response[0] == 's')) strcpy(color_transform, "Straight mode"); else strcpy(color_transform, "Histogram Equalization mode"); } /* ends if r == 2 */ if(r == 3){ printf("\nDISPLAY> Enter the number " "of colors"); printf(" in the input image"); printf("\nDISPLAY> ___"); get_integer(&int_response); *image_colors = int_response; } /* ends if r == 3 */ if(r == 4){ printf( "\nDISPLAY> Enter the number of colors " "for the display"); printf("\nDISPLAY> ___"); get_integer(&int_response); *display_colors = int_response; } /* ends if r == 4 */ if(r == 5){ printf("\nDISPLAY> Enter the new monitor type"); printf("\nDISPLAY> (E) EGA (V) VGA"); printf(" (C) CGA (M) Monochrome"); printf("\nDISPLAY> _\b"); gets(response); if((response[0] == 'E') || (response[0] == 'e')) strcpy(monitor_type, "EGA"); if((response[0] == 'V') || (response[0] == 'v')) strcpy(monitor_type, "VGA"); if((response[0] == 'C') || (response[0] == 'c')) strcpy(monitor_type, "CGA"); if((response[0] == 'M') || (response[0] == 'm')) strcpy(monitor_type, "Monochrome"); } /* ends if r == 5 */ if(r == 6){ printf( "\nDISPLAY> Enter 1 for show histogram " "0 for don't"); printf("\nDISPLAY> ___"); get_integer(&int_response); *show_hist = int_response; } /* ends if r == 6 */ } /* ends while not_finished */ } /* ends display_menu */ /******************************** * * display_image_portion(... * *********************************/ display_image_portion(image, x, y, display_colors, image_colors, invert) int invert, display_colors, image_colors; short image[ROWS][COLS]; unsigned int x, y; { unsigned int color, i, j; if(invert == 1){ for(i=0; i