📄 gai01011.c
字号:
#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 + -