imgproc.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:6k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /* imgproc.c - by David Blythe, SGI */
  2. /* Examples of various image processing operations coded as OpenGL
  3.    accumulation buffer operations.  This allows extremely fast   
  4.    image processing on machines with hardware accumulation buffers
  5.    (RealityEngine, InfiniteReality, VGX). */
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <stdio.h>
  9. #include <GL/glut.h>
  10. #include "texture.h"
  11. static unsigned *image, *null;
  12. static int width, height, components;
  13. static void (*func) (void);
  14. static float alpha = 1.;
  15. static float luma = .5;
  16. static int reset = 1;
  17. static int format = GL_RGBA;
  18. void
  19. brighten(void)
  20. {
  21.   if (reset) {
  22.     memset(null, 0, width * height * sizeof *null);
  23.     reset = 0;
  24.   }
  25.   glDrawPixels(width, height, format, GL_UNSIGNED_BYTE, image);
  26.   glAccum(GL_LOAD, alpha / 2.);
  27.   glDrawPixels(width, height, format, GL_UNSIGNED_BYTE, null);
  28.   glAccum(GL_ACCUM, (1 - alpha) / 2.);
  29.   glAccum(GL_RETURN, 2.0);
  30. }
  31. void
  32. saturate(void)
  33. {
  34.   if (reset) {
  35.     memset(null, 0xff, width * height * sizeof *null);
  36.     reset = 0;
  37.   }
  38.   glDrawPixels(width, height, format, GL_UNSIGNED_BYTE, image);
  39.   glAccum(GL_LOAD, alpha / 2.);
  40.   glDrawPixels(width, height, format, GL_UNSIGNED_BYTE, null);
  41.   glAccum(GL_ACCUM, (1 - alpha) / 2.);
  42.   glAccum(GL_RETURN, 2.0);
  43. }
  44. void
  45. contrast(void)
  46. {
  47.   if (reset) {
  48.     memset(null, luma, width * height * sizeof *null);
  49.     reset = 0;
  50.   }
  51.   glDrawPixels(width, height, format, GL_UNSIGNED_BYTE, image);
  52.   glAccum(GL_LOAD, alpha / 2.);
  53.   glDrawPixels(width, height, format, GL_UNSIGNED_BYTE, null);
  54.   glAccum(GL_ACCUM, (1 - alpha) / 2.);
  55.   glAccum(GL_RETURN, 2.0);
  56. }
  57. void
  58. balance(void)
  59. {
  60.   if (reset) {
  61.     memset(null, luma, width * height * sizeof *null);
  62.     reset = 0;
  63.   }
  64.   glDrawPixels(width, height, format, GL_UNSIGNED_BYTE, image);
  65.   glAccum(GL_LOAD, alpha / 2.);
  66.   glDrawPixels(width, height, format, GL_UNSIGNED_BYTE, null);
  67.   glAccum(GL_ACCUM, (1 - alpha) / 2.);
  68.   glAccum(GL_RETURN, 2.0);
  69. }
  70. void
  71. sharpen(void)
  72. {
  73.   if (reset) {
  74.     gluScaleImage(format, width, height, GL_UNSIGNED_BYTE, image,
  75.       width / 4, height / 4, GL_UNSIGNED_BYTE, null);
  76.     gluScaleImage(format, width / 4, height / 4, GL_UNSIGNED_BYTE, null,
  77.       width, height, GL_UNSIGNED_BYTE, null);
  78.     reset = 0;
  79.   }
  80.   glDrawPixels(width, height, format, GL_UNSIGNED_BYTE, image);
  81.   glAccum(GL_LOAD, alpha / 2.);
  82.   glDrawPixels(width, height, format, GL_UNSIGNED_BYTE, null);
  83.   glAccum(GL_ACCUM, (1 - alpha) / 2.);
  84.   glAccum(GL_RETURN, 2.0);
  85. }
  86. void 
  87. set_brighten(void)
  88. {
  89.   func = brighten;
  90.   reset = 1;
  91.   printf("brightenn");
  92. }
  93. void 
  94. set_saturate(void)
  95. {
  96.   func = saturate;
  97.   reset = 1;
  98.   printf("saturaten");
  99. }
  100. void 
  101. set_contrast(void)
  102. {
  103.   func = contrast;
  104.   reset = 1;
  105.   printf("contrastn");
  106. }
  107. void 
  108. set_balance(void)
  109. {
  110.   func = balance;
  111.   reset = 1;
  112.   printf("balancen");
  113. }
  114. void 
  115. set_sharpen(void)
  116. {
  117.   func = sharpen;
  118.   reset = 1;
  119.   printf("sharpenn");
  120. }
  121. void
  122. help(void)
  123. {
  124.   printf("'h'   - helpn");
  125.   printf("'b'   - brightenn");
  126.   printf("'s'   - saturaten");
  127.   printf("'c'   - contrastn");
  128.   printf("'z'   - sharpenn");
  129.   printf("'a'   - color balancen");
  130.   printf("left mouse     - increase alphan");
  131.   printf("middle mouse   - decrease alphan");
  132. }
  133. void
  134. init(char *filename)
  135. {
  136.   double l = 0;
  137.   int i;
  138.   func = brighten;
  139.   if (filename) {
  140.     image = read_texture(filename, &width, &height, &components);
  141.     if (image == NULL) {
  142.       fprintf(stderr, "Error: Can't load image file "%s".n",
  143.         filename);
  144.       exit(1);
  145.     } else {
  146.       printf("%d x %d image loadedn", width, height);
  147.     }
  148.     if (components < 3 || components > 4) {
  149.       printf("must be RGB or RGBA imagen");
  150.       exit(1);
  151.     }
  152.   } else {
  153.     int i, j;
  154.     components = 4;
  155.     width = height = 512;
  156.     image = (unsigned *) malloc(width * height * sizeof(unsigned));
  157.     for (j = 0; j < height; j++)
  158.       for (i = 0; i < width; i++) {
  159.         if (i & 1)
  160.           image[i + j * width] = 0xff;
  161.         else
  162.           image[i + j * width] = 0xff00;
  163.         if (j & 1)
  164.           image[i + j * width] |= 0xff0000;
  165.       }
  166.   }
  167.   null = (unsigned *) malloc(width * height * sizeof *image);
  168.   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  169.   glClearColor(.25, .25, .25, .25);
  170.   /* compute luminance */
  171.   for (i = 0; i < width * height; i++) {
  172.     GLubyte *p = (GLubyte *) (image + i);
  173.     double r = p[0] / 255.;
  174.     double g = p[1] / 255.;
  175.     double b = p[2] / 255.;
  176.     l += r * .3086 + g * .0820 + b * .114;
  177.   }
  178.   luma = l / (width * height);
  179.   printf("average luminance = %fn", luma);
  180. }
  181. void
  182. display(void)
  183. {
  184.   printf("alpha = %fn", alpha);
  185.   glClear(GL_COLOR_BUFFER_BIT);
  186.   (*func) ();
  187.   glutSwapBuffers();
  188. }
  189. void
  190. reshape(int w, int h)
  191. {
  192.   glViewport(0, 0, w, h);
  193.   glMatrixMode(GL_PROJECTION);
  194.   glLoadIdentity();
  195.   glOrtho(0., (GLdouble) width, 0., (GLdouble) height, -1., 1.);
  196.   glMatrixMode(GL_MODELVIEW);
  197.   glLoadIdentity();
  198. }
  199. /* ARGSUSED1 */
  200. void
  201. key(unsigned char key, int x, int y)
  202. {
  203.   switch (key) {
  204.   case 'b':
  205.     set_brighten();
  206.     break;
  207.   case 's':
  208.     set_saturate();
  209.     break;
  210.   case 'c':
  211.     set_contrast();
  212.     break;
  213.   case 'z':
  214.     set_sharpen();
  215.     break;
  216.   case 'a':
  217.     set_balance();
  218.     break;
  219.   case 'h':
  220.     help();
  221.     break;
  222.   case '33':
  223.     exit(0);
  224.     break;
  225.   default:
  226.     return;
  227.   }
  228.   glutPostRedisplay();
  229. }
  230. /* ARGSUSED2 */
  231. void
  232. mouse(int button, int state, int x, int y)
  233. {
  234.   if (state == GLUT_DOWN) {
  235.     switch (button) {
  236.     case GLUT_LEFT_BUTTON:
  237.       alpha += .1;
  238.       break;
  239.     case GLUT_MIDDLE_BUTTON:
  240.       alpha -= .1;
  241.       break;
  242.     case GLUT_RIGHT_BUTTON:
  243.       break;
  244.     }
  245.   }
  246.   glutPostRedisplay();
  247. }
  248. int
  249. main(int argc, char **argv)
  250. {
  251.   glutInit(&argc, argv);
  252.   glutInitWindowSize(512, 512);
  253.   glutInitDisplayMode(GLUT_RGBA | GLUT_ACCUM | GLUT_DOUBLE);
  254.   (void) glutCreateWindow("imgproc");
  255.   init(argv[1]);
  256.   glutDisplayFunc(display);
  257.   glutKeyboardFunc(key);
  258.   glutReshapeFunc(reshape);
  259.   glutMouseFunc(mouse);
  260.   glutMainLoop();
  261.   return 0;             /* ANSI C requires main to return int. */
  262. }