Using the data storage type defined on this page for raster images, read an image from a PPM file (binary P6 prefered).
(Read the definition of PPM file on Wikipedia.)

Task: Use write ppm file solution and grayscale image solution with this one in order to convert a color image to grayscale one.

 
/* BITMAP FILE: read in a file in PPM format, P6 (binary). 14/5/2010 */
test: procedure options (main);
   declare (m, n, max_color, i, j) fixed binary (31);
   declare ch character (1), ID character (2);
   declare 1 pixel union,
            2 color bit(24) aligned,
            2 primary_colors,
               3 R char (1),
               3 G char (1),
               3 B char (1);
   declare in file record;
 
   open file (in) title ('/IMAGE.PPM,TYPE(FIXED),RECSIZE(1)' ) input;
 
   call get_char;
   ID = ch;
   call get_char;
   substr(ID, 2,1) = ch;
   /* Read in the dimensions of the image */
   call get_integer (m);
   call get_integer (n);
 
   /* Read in the maximum color size used */
   call get_integer (max_color);
      /* The previous call reads in ONE line feed or CR or other terminator */
      /* character. */
 
begin;
   declare image (0:m-1,0:n-1) bit (24);
 
   do i = 0 to hbound(image, 1);
      do j = 0 to hbound(image,2);
         read file (in) into (R);
         read file (in) into (G);
         read file (in) into (B);
         image(i,j) = color;
      end;
   end;
end;
 
get_char: procedure;
   do until (ch ^= ' ');
      read file (in) into (ch);
   end;
end get_char;
 
get_integer: procedure (value);
   declare value fixed binary (31);
 
   do until (ch = ' ');
      read file (in) into (ch);
   end;
   value = 0;
   do until (is_digit(ch));
      value = value*10 + ch;
      read file (in) into (ch);
   end;
end get_integer;
 
is_digit: procedure (ch) returns (bit(1));
   declare ch character (1);
   return (index('0123456789', ch) > 0);
end is_digit;
end test;