Dr. Dobb's is part of the Informa Tech Division of Informa PLC

This site is operated by a business or businesses owned by Informa PLC and all copyright resides with them. Informa PLC's registered office is 5 Howick Place, London SW1P 1WG. Registered in England and Wales. Number 8860726.


Channels ▼
RSS

Image Processing


May 1991/New Products/Listing 4

Listing 4

/*****************************************************
*   file c:\cips\display.c
*
*   Purpose: These functions display images on
*   a the monitor.
*
*       External Calls:
*          cips.c - clear_text_screen
*
*       Modifications:
*          17 June 1987 - created
*          August 1990 - extension modifications for use
*              in the C Image Processing System
********************************************************/

#include "d:\cips\cips.h"

/*****************************
 *   display_image(...
 *******************************/

display_image(file_name, image, il, ie, ll, le,
            image_header, monitor_type,
            color_transform, invert,
            image_colors, display_colors)
   char    color_transform[],
          file_name[],
          monitor_type[];
   int     display_colors,
          image_colors,
          invert,
          il,
          ie,
          ll,
          le;
   short   image[ROWS][COLs];
   struct  tiff_header_struct *image_header;
{
   char  channels[80],
        response[80];

   int   a,
        b,
        c,
        channel,
        display_mode,
        key,
        horizontal,
        max_horizontal,
        max_vertical,
        not_finished,
        r,
        vertical;

   unsigned int block,
              color,
              i,
              j,
              x,
              y;


   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 */
   }

   max_horizontal = (image_header->image_length+50)/100;
   max_vertical   = (image_header->image_width+50)/100;

   if(horizontal > max_horizontal) horizontal = max_horizontal;
   if(vertical > max_vertical) vertical = max_vertical;

     /* set graphics mode */

_setvideomode(display_mode); /* MSC 6.0 */
if(display_colors == 16) map_16_shades_of_gray(display_mode);

/****************************************
*   Loop over this size and
*   read and display ROWSxCOLS arrays.
*****************************************/
   for(a=0; a<vertical; a++){
      for(b=0; b<horizontal; b++){
         x = a*100;
         y = b*100;
         read_tiff_image(file_name, image, il+y,
                      ie+x, ll+y, le+x);
            display_image_portion(image, x, y, display_colors,
                              image_colors, invert);
         }      /* ends loop over b */
      }       /* ends loop over a */

      read_string(response);
      printf("\nEnter 0 to quit 1 to do again");
      get_integer(¬_finished);

         /* set display back to text mode */
      clear_text_screen();

   }  /* ends while not_finished */
}  /* ends main */
 /**********************************
 *   display_menu_for_display_image(
 ***********************************/

display_menu_for_display_image(image_colors,
           display_colors, invert,
           color_transform, monitor_type)
   char color_transform[], monitor_type[];
   int *invert, *image_colors, *display_colors;
{
   char response[80];
   int int_response, not_finished, r;

   not_finished = 1;
   while(not_finished){
      printf("\n\nDISPLAY> 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> _\b");
      get_integer(&r);

      if(r == 0){
        not_finished = 0;
      }
      if(r == 1){
        printf(
           "\nDISPLAY> Enter 1 for invert on 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  (M) Modified mode");
        printf("\nDISPLAY> \b");
        read_string(response);
        if((response[0] == 'S') ||
           (response[0] == 's'))
             strcpy(color_transform, "Straight mode");
        else
             strcpy(color_transform, "Modified mode*);
      } /* ends if r == 2 */

      if(r == 3){
        printf(
        "\nDISPLAY> Enter the number of colors 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("\nDISPLAY> _\b");
        read_string(response);
        if(response[0] == 'E') ||
          (response[0] == 'e'))
            strcpy(monitor_type, "EGA");
          else
                strcpy(monitor_type, "VGA");
      }   /* ends if r == 5 */

   }  /* ends white 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){
         if(image_colors == 256){
            for(i=0; i<ROWS; i++)
               for(j=0; j<COLS; j++)
                  image[i] [j] = 255 - image[i][j];
         } /* ends if image_colors = 256 */

         if(image_colors == 16){
            for(i=0; i<ROWS; i++)
               for(j=0; j<COLS; j++)
                  image[i][j] = 15 - image[i][j];
         } /* ends if image_colors = 16 */

      }  /* ends if invert == 1 */

      for(i=0; i<ROWS; i++){
         for(j=0; j<COLS; j++){

            if( (display_colors == 16) &&
                (image_colors == 256))
              color = image[i] [j]/16;
            if( (display_colors == 16) &&
                (image_colors == 16))
              color = image[i] [j];
            if( (display_colors == 256) &&
                (image_colors == 256))
              color = image[i][j];
            if( (display_colors == 256) &&
                (image colors == 16))
              color = image[i][j]*16;
            _setcolor(color);   /* MSC 6.0 statements */
            _setpixel(j+x, i+y);

            /*my_set_pixel(j+x, i+y, color);*/
         }  /* ends loop over j */
      }     /* ends loop over i */

}  /*  ends display_image_portion */

/**********************************************
*   map_16_shades_of_gray(...
*
*  This function maps 16 shades of gray into
*  the first 16 color indices. This allows
*  you to display a true "black and white"
*  image on a color monitor.
**********************************************/

map_16_shades_of_gray(display_mode)
   int display_mode;
{
   /* all MSC 6.0 statements */
_setvideomode(display_mode);
_remappalette(0,  0x000000L);
_remappalette(1,  0x040404L);
_remappalette(2,  0x080808L);
_remappalette(3,  0x0c0c0cL);
_remappelette(4,  0x101010L);
_remappalette(5,  0x141414L);

_remappalette(6,  0x181818L);
_remappalette(7,  0x1c1c1cL);
_remappalette(8,  0x202020L);
_remappalette(9,  0x242424L);
_remappalette(10, 0x282828L);
_remappalette(11, 0x2c2c2cL);
_remappalette(12, 0x303030L);
_remappalette(13, 0x343434L);
_remappalette(14, 0x383838L);
_remappalette(15, 0x3f3f3fL);
}


Related Reading


More Insights






Currently we allow the following HTML tags in comments:

Single tags

These tags can be used alone and don't need an ending tag.

<br> Defines a single line break

<hr> Defines a horizontal line

Matching tags

These require an ending tag - e.g. <i>italic text</i>

<a> Defines an anchor

<b> Defines bold text

<big> Defines big text

<blockquote> Defines a long quotation

<caption> Defines a table caption

<cite> Defines a citation

<code> Defines computer code text

<em> Defines emphasized text

<fieldset> Defines a border around elements in a form

<h1> This is heading 1

<h2> This is heading 2

<h3> This is heading 3

<h4> This is heading 4

<h5> This is heading 5

<h6> This is heading 6

<i> Defines italic text

<p> Defines a paragraph

<pre> Defines preformatted text

<q> Defines a short quotation

<samp> Defines sample computer code text

<small> Defines small text

<span> Defines a section in a document

<s> Defines strikethrough text

<strike> Defines strikethrough text

<strong> Defines strong text

<sub> Defines subscripted text

<sup> Defines superscripted text

<u> Defines underlined text

Dr. Dobb's encourages readers to engage in spirited, healthy debate, including taking us to task. However, Dr. Dobb's moderates all comments posted to our site, and reserves the right to modify or remove any content that it determines to be derogatory, offensive, inflammatory, vulgar, irrelevant/off-topic, racist or obvious marketing or spam. Dr. Dobb's further reserves the right to disable the profile of any commenter participating in said activities.

 
Disqus Tips To upload an avatar photo, first complete your Disqus profile. | View the list of supported HTML tags you can use to style comments. | Please read our commenting policy.