⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gai01011.c

📁 此程序是一个数字图像灰度处理程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "graphics.h"
#include "stdio.h"
#include "fcntl.h"
#include "malloc.h"
#include "io.h"
#include "math.h"
#include "stdlib.h"
#include "conio.h"
#include "dos.h"
#include "Svga64k.h"
/*********************定义的灰度处理方法*****************************/
#define  gragvalue(r,g,b)((r+g+b)/3)
/**********************鼠标信息的记录量*******************************/
 /*鼠标信息宏定义*/   
  #define   WAITING   0xff00   
  #define   LEFTPRESS   0xff01   
  #define   LEFTCLICK   0xff10   
  #define   LEFTDRAG   0xff19   
  #define   RIGHTPRESS   0xff02   
  #define   RIGHTCLICK   0xff20   
  #define   RIGHTDRAG   0xff2a   
  #define   MIDDLEPRESS   0xff04   
  #define   MIDDLECLICK   0xff40   
  #define   MIDDLEDRAG   0xff4c   
  #define   MOUSEMOVE   0xff08   
    
  int   Keystate;   
  int   MouseExist;   
  int   MouseButton;   
  int   MouseX;   
  int   MouseY;   
  int   up[16][16],down[16][16],mouse_draw[16][16],pixel_save[16][16];
/**************************程序使用的全局变量******************************/

char fliename[20];
long xiangsu[256];
int kuan=0,gao=0;
/***************************图片文件相关信息*******************************/
struct  TGAHEAD
  {   
        int    bfType;/*   类型标志,总是BM*/
        long   bfSize;/*   文件大小*/
        int    bfReserved1;
        int    bfReserved2;
        long   bfOffBits;/*   位图点阵偏移量*/
        long   biSize;/*   结构体字节总数*/   
        long   Width;/*   图像宽度*/
        long   Height;/*图像高度*/
        int    biPlanes;/*   必须为1*/
        int    biBitCount;/*   每个像素所占二进制位数,可能是1,4,8或24*/
        long   biCompress;/*压缩方式*/   
        long   biSizeImage;/*像素点阵大小*/   
        long   biXPelsPerMeter;/*   水平像素数*/   
        long   biYPelsPerMeter;/*   垂直像素数*/   
        long   biClrUsed;/*使用的颜色数*/   
        long   biClrImportant;/*重要颜色数*/   
  }tgahead;
  /********像素颜色记录结构体********/
struct  DAC
  {   
        unsigned   char     rgbBlue;    /*蓝色所占比重*/
        unsigned   char     rgbGreen;   /*绿色所占比重*/   
        unsigned   char     rgbRed;     /*红色所占比重*/
  }RGB;
/********************显示图像时需要的一些量***************************/
int huge Return_SVGA64K(void)
{
  return(5);                      /* 返回各种分辨率的对应编号 0~6 宏定义 */
}
/************************灰度调色板函数*************************************/
void HuiDuTiaoSeBan(int x, int y, struct  DAC RGB)
{
  unsigned char yanse;
  yanse=gragvalue(RGB.rgbRed,RGB.rgbGreen,RGB.rgbBlue);
  setrgbpalette(1026, yanse >> 3, yanse >> 2, yanse>> 3);
  putpixel(x, y, 0);
}
/***************************彩色调色板函数********************************/
void CaiSeTiaoSeBan(int x, int y,struct  DAC RGB)
{
  setrgbpalette(1026, RGB.rgbRed>> 3, RGB.rgbGreen >> 2, RGB.rgbBlue>> 3);
  putpixel(x, y, 0);
}
/*******************同时显示灰度和彩色图像函数*************************/

void TuXianShi(char filename[],int fangshi)
{
  int width, height, i = DETECT, j = 0, x0=0, y0=0, fp;
  char fix;
  struct  DAC *buffer;
  installuserdriver("Svga64K", Return_SVGA64K); /*对于svga64k必需执行该函数以安装BGI驱动*/
  registerbgidriver(EGAVGA_driver);
  initgraph(&i, &j, "");                       /* 执行TC默认的BGI初始化函数 */

      /*************3种方式显示***************/
switch(fangshi)
  {
     /*************彩色显示***************/
 case 1:
  if((fp = open(filename, O_RDONLY | O_BINARY)) == -1)
  {
    puts("Can't find file !");
  }
  lseek(fp, 18, SEEK_SET);
  read(fp, &width, 4);
  read(fp, &height, 4);
  fix = width % 4;
  x0 =20;
  y0 =50;
  lseek(fp, 54, SEEK_SET);
  buffer = (struct  DAC *)malloc(width*sizeof(RGB));

  for(j = height - 1; j >= 0; j--)
  {
    read(fp, buffer, width*sizeof(RGB));
    lseek(fp, fix, SEEK_CUR);
    for(i = 0; i < width; i++)
      CaiSeTiaoSeBan(x0 + i, y0 + j, buffer[i]);
  }
  free(buffer);
  close(fp);
  break;

        /**************灰度显示**************/
  case 2:
  if((fp = open(filename, O_RDONLY | O_BINARY)) == -1)
  {
    puts("Can't find file !");
  }
  lseek(fp, 18, SEEK_SET);
  read(fp, &width, 4);
  read(fp, &height, 4);
  fix = width % 4;
  x0 =20;
  y0 =50;
  lseek(fp, 54, SEEK_SET);
  buffer = (struct  DAC *)malloc(width*sizeof(RGB));

  for(j = height - 1; j >= 0; j--)
  {
    read(fp, buffer, width*sizeof(RGB));
    lseek(fp, fix, SEEK_CUR);
    for(i = 0; i < width; i++)
      HuiDuTiaoSeBan(x0 + i, y0 + j, buffer[i]);
  }
  free(buffer);
  close(fp);
  break;
  /**************同时显示灰度和彩色*****************/
  case 3:
  if((fp = open(filename, O_RDONLY | O_BINARY)) == -1)
  {
    puts("Can't find file !");
  }
  lseek(fp, 18, SEEK_SET);
  read(fp, &width, 4);
  read(fp, &height, 4);
  fix = width % 4;
  x0 =20;
  y0 =50;
  lseek(fp, 54, SEEK_SET);
  buffer = (struct  DAC *)malloc(width*sizeof(RGB));

  for(j = height - 1; j >= 0; j--)
  {
    read(fp, buffer, width*sizeof(RGB));
    lseek(fp, fix, SEEK_CUR);
    for(i = 0; i < width; i++)
      CaiSeTiaoSeBan(x0 + i, y0 + j, buffer[i]);
  }
  free(buffer);
  close(fp);
  if((fp = open(filename, O_RDONLY | O_BINARY)) == -1)
  {
    puts("Can't find file !");
  }
  lseek(fp, 18, SEEK_SET);
  read(fp, &width, 4);
  read(fp, &height, 4);
  fix = width % 4;
  x0 =x0+width+30;
  y0 =50;
  lseek(fp, 54, SEEK_SET);
  buffer = (struct  DAC *)malloc(width*sizeof(RGB));

  for(j = height - 1; j >= 0; j--)
  {
    read(fp, buffer, width*sizeof(RGB));
    lseek(fp, fix, SEEK_CUR);
    for(i = 0; i < width; i++)
      HuiDuTiaoSeBan(x0 + i, y0 + j, buffer[i]);
  }
  free(buffer);
  close(fp);
  break;
 }
  getch();
  closegraph();

}
/**********************统计像素的灰度信息******************************/
int duhuiduzhi(long xiangsu[],char Filename[])
{
   long width,height;
   int i,j,r,b,g,agv;
   FILE   *fp;
   for(i=0;i<256;i++)  xiangsu[i]=0;
   if((fp=fopen(Filename,"rb"))==NULL)
   {
    return 0;
   }
   fread(&tgahead,1,sizeof(tgahead),fp);
   width=tgahead.Width;
   kuan=width;
   height=tgahead.Height;
   gao=height;
   while(--height>=0){
    for(i=0;i<width;i++)
    {
      fread(&RGB,1,sizeof(RGB),fp);
      b=RGB.rgbBlue;
      g=RGB.rgbGreen;
      r=RGB.rgbRed;
      agv=(int)((r+g+b)/3);
      xiangsu[agv]=xiangsu[agv]+1;
    }
   }
   fclose(fp);
  return 1;
}
 /****************输出像素灰度的具体数值*********************/
void shuchuhuidu(long xiangsu[],int kaishi,int jieshu)
{
 int i;
 printf("ni da kaide tubianshi:%s\n",fliename);
 printf("tu xing de kuandu gaodu shi: %d * %d xiangsu\n",kuan,gao);
 printf("tu xing de huidu xinxi da yin cong %d kaishi dao %d jieshu:\n",kaishi,jieshu);
 for(i=kaishi;i<=jieshu;i++)
 {
  printf("%d->%d*",i,xiangsu[i]);
 }
 getch();
}
/**********************绘制灰度直方图**************************/
 void huatuZHFT()
{
  int  i;
  long max=0;
  char fich[40];
  int driver=DETECT,mode;
  registerbgidriver(EGAVGA_driver);
  detectgraph(&driver, &mode);
  initgraph(&driver, &mode,"");
  for(i=0;i<256;i++)
     if(xiangsu[i]>max)
        max=xiangsu[i];
  setbkcolor(8);
  /********YY*******/
  setcolor(5);
  line(50,10,50,210);   /***** Y******/
  line(50,10,53,10);
  line(50,60,53,60);
  line(50,110,53,110);
  line(50,160,53,160);
  line(562,10,562,210);    /*******2Y******/
  line(559,10,561,10);
  line(559,60,561,60);
  line(559,110,561,110);
  line(559,160,561,160);

  /*********XXX***********/
  setcolor(15);            /**********X*****/
  line(50,210,562,210);
  setcolor(4);
  outtextxy(150,220,"50");
  line(150,211,150,214);
  outtextxy(250,220,"100");
  line(250,211,250,214);
  outtextxy(350,220,"150");
  line(350,211,350,214);
  outtextxy(450,220,"200");
  line(450,211,450,214);
  outtextxy(550,220,"250");
  line(550,211,550,214);
  setcolor(2);
  sprintf(fich,"tupian %s huiduzhifangtu",fliename);
  outtextxy(190,240,fich);
   /***********小于1000*************/
 if((max/1000<=1)&&(max/1000>=0))
 {
  for(i=0;i<256;i++)
   {
   if(xiangsu[i]<=100){
            setcolor(2);
            line(50+2*i,(210-xiangsu[i]),50+2*i,210);
           }
   if(xiangsu[i]>100&&xiangsu[i]<=500){
            setcolor(2);
            line(50+2*i,(110-xiangsu[i]/10),50+2*i,210);
           }
   if(xiangsu[i]>500&xiangsu[i]<=1000){
            setcolor(2);
            line(50+2*i,(60-xiangsu[i]/20),50+2*i,210);
           }
   if(xiangsu[i]>1000){
            setcolor(2);
            line(50+2*i,10,50+2*i,210);
           }
  }
  setcolor(1);
  outtextxy(30,160,"50");
  outtextxy(24,110,"100");
  outtextxy(24,60,"500");
  outtextxy(18,10,"1000");
  outtextxy(563,160,"50");
  outtextxy(563,110,"100");
  outtextxy(563,60,"500");
  outtextxy(563,10,"1000");
 }

 /*************大于1000小于10000*************/
 if((max/1000<=10)&&(max/1000>1))
 {
  for(i=0;i<256;i++)
   {
   if(xiangsu[i]<=100){
            setcolor(2);
            line(50+2*i,(210-xiangsu[i]/2),50+2*i,210);
           }
   if(xiangsu[i]>100&&xiangsu[i]<=1000){
            setcolor(2);
            line(50+2*i,(160-xiangsu[i]/20),50+2*i,210);
           }
   if(xiangsu[i]>1000&&xiangsu[i]<=5000){
            setcolor(2);
            line(50+2*i,(110-xiangsu[i]/100),50+2*i,210);
           }
   if(xiangsu[i]>5000&xiangsu[i]<=10000){
            setcolor(2);
            line(50+2*i,(60-xiangsu[i]/200),50+2*i,210);
           }
   if(xiangsu[i]>10000){
            setcolor(2);
            line(50+2*i,10,50+2*i,210);
           }
  }
  setcolor(1);
  outtextxy(18,160,"100");
  outtextxy(15,110,"1000");
  outtextxy(15,60,"5000");
  outtextxy(10,10,"10000");
  outtextxy(563,160,"100");
  outtextxy(563,110,"1000");
  outtextxy(563,60,"5000");
  outtextxy(563,10,"10000");
 }

  /****** 大于10000********/
if((max/1000)>10)
 {
  for(i=0;i<256;i++)
   {
   if(xiangsu[i]<=100){
            setcolor(2);
            line(50+2*i,(210-xiangsu[i]/2),50+2*i,210);
           }
   if(xiangsu[i]>100&&xiangsu[i]<=1000){
            setcolor(2);
            line(50+2*i,(160-xiangsu[i]/20),50+2*i,210);
           }
   if(xiangsu[i]>1000&&xiangsu[i]<=10000){
            setcolor(2);
            line(50+2*i,(110-xiangsu[i]/200),50+2*i,210);
           }
   if(xiangsu[i]>10000&xiangsu[i]<100000){
            setcolor(2);
            line(50+2*i,(60-xiangsu[i]/2000),50+2*i,210);
           }
   if(xiangsu[i]>100000){
            setcolor(2);
            line(50+2*i,10,50+2*i,210);
           }
  }
  setcolor(1);
  outtextxy(18,160,"100");
  outtextxy(15,110,"1000");
  outtextxy(10,60,"10000");
  outtextxy(2,10,"100000");
  outtextxy(563,160,"100");
  outtextxy(563,110,"1000");
  outtextxy(563,60,"10000");
  outtextxy(563,10,"100000");
 }
  getch();
  closegraph();
}

/*****************菜单界面的绘制函数************************/
void caidan()
{
    /******顶层框的设计和属性*********/     /***标题栏***/
   setfillstyle(1,9);
   bar(0,1,638,20);
   setcolor(14);
   rectangle(0,1,639,20);
   settextstyle(2,0,8);
   setcolor(15);
   outtextxy(3,5,"tuxiangchulirujian");  /**  结束 **/

    /* 绘制各个菜单 */         /*********** 菜单的位置属性************/
   setcolor(14);
   rectangle(1,21,639,50);
   setfillstyle(1,8);           /*设置填充样式和颜色*/
   bar(2,22,638,49);
   /***********菜单项各个按钮的绘制*********/
   /******1******/
   setcolor(0);
   rectangle(4,26,64,46);
   setfillstyle(1,2);
   bar(6,28,62,44);
   outtextxy(8,30,"WenJian");
   /****2****/
   setcolor(0);
   rectangle(80,26,130,46);
   setfillstyle(1,2);
   bar(82,28,128,44);
   outtextxy(84,30,"DaKai");
   /*****3*****/
   setcolor(0);
   rectangle(150,26,260,46);
   setfillstyle(1,2);
   bar(152,28,258,44);
   outtextxy(154,30,"HuiDuTuXiang");
   /*****4*****/
   setcolor(0);
   rectangle(280,26,390,46);
   setfillstyle(1,2);
   bar(282,28,388,44);
   outtextxy(284,30,"HuiZhiFangTu");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -