VGA色彩编辑技术
毕业论文1.08W
RGB色彩混合模型应用在VGA上可呈现64个辉度级,通过64种不同亮度的红色、绿色和蓝色叠加可产生出262144(64×64×64)种不同的色彩。在VGA的640×480×16模式下,因受到显示存储区的限制,VGA每次仅能从262144种颜色中选出16种颜色同时使用。虽然可以通过对VGA色彩控制寄存器DAC的操作选取所需要的色彩,在262144种颜色中进行16种色彩交换,用理想的色调绘制较高质量的图形图像,获得如模拟光照,色彩的自然过度等特殊效果,但由于没有现成的VGA色彩混合模型调色工具,因此对一般的用户来说色彩的调配是很不方便的,用户实际用到多数是VGA提供的16种缺省值色彩。本文给出了一个VGA色彩调配工具程序,使用本色彩调配工具提供的颜色编辑功能,可以方便的调试出所有的VGA模拟色彩。
色彩调配工具提供了下述四方面功能。
(1)颜色索引功能 本功能从色彩调配工具提供的调色板的16种颜色中每次选出一种颜色供用户调配,同时提示出当前被调配色彩中的RGB各分量值(辉度),RGB取值范围是0到63。使用‘i’和‘s’键改变颜色索引号号,通过颜色索引号在调色板上选取各种需调配的颜色。
(2)颜色调配功能 本功能在颜色选好后,对指定色号的`颜色进行调配。使用‘1’和‘2’键增加和减少该颜色的红色分量。使用‘3’和‘4’键增加和减少绿色分量,使用‘5’和‘6’键增加和减少蓝色分量。在RGB分量值变化时,调配的颜色跟随着变化,且RGB各分量值也显示出来。调配中的颜色同时自动写入用户调色板。
(3)显示调色板功能 本功能显示色彩调配工具提供的3个调色板。第一个是缺省值调色板,显示16种标准颜色,使用‘d’键弹出。第二个是灰色调色板,显示16种灰度的灰色,使用‘g’键弹出。第三个是用户调色板,它的初始值是16种标准颜色,用户使用颜色索引功能和颜色调配功能在它上面进行色彩编辑,编辑好的颜色的RGB值自动保存起来。使用‘u’键将用户调色板弹出。
(4)调色板打印功能 本功能将用户编辑好的用户调色板中的16种颜色的RGB值打印在屏幕上,供用户记录下来后在自己的应用程序中使用。
色彩调配工具在Turbo C和Borland C下运行,读者可以单独使用它,也可以把它改成函数加在应用程序中。程序清单附后:
#include <dos.h>
#include <graphics.h>
int adapter, mode;
int screen-x,screen-y;
int sx, sy, wsx, wsy, sx1, sy1, sx2, sy2, x1, y1, x2, y2, t1;
int red-vol, grn-vol, blu-vol, key-num, idx-num, row, col;
int rgb-flag, adj, clr-idx;
int vga-default[16][3]={
0,0,0,0,0,42,0,42,0,0,42,42,42,0,0,42,0,42,
42,21,0,42,42,42,21,21,21,21,21,63,0,63,0,
0,63,63,63,21,17,63,19,63,63,63,0,63,63,63};
int vga-gray[16][3]={
0,0,0,10,10,10,13,13,13,15,15,15,17,17,17,20,20,20,
24,24,24,28,28,28,33,33,33,37,37,37,41,41,41,
46,46,46,50,50,50,54,54,54,58,58,58,63,63,63};
int vga-user[16][3]={
0,0,0,0,0,42,0,42,0,0,42,42,42,0,0,42,0,42,
42,21,0,42,42,42,21,21,21,21,21,63,0,63,0,
0,63,63,63,21,17,63,19,63,63,63,0,63,63,63};
char string[]="0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15";
char title[]="VGA color pattern";
union REGS regs;
main(){
detectgraph(&adapter,&mode);
initgraph(&adapter, &mode,“ ”);
setfillstyle(SOLID-FILL,0); bar(118,100,507,239);
setfillstyle(SOLID-FILL,7); bar(120,103,509,237);
setcolor(0), rectangle(122,105,507,235);
sx=146,sy=138,wsx=20,wsy=80;
settextstyle(3,0,1);
outtextxy(250,105,title);
settextstyle(2,0,5);
outtextxy(sx,sy-15,string);
sx1=sx-4,sy1=sy-4,sx2=sx+(16*(wsx+1))+4;sy2=
sy+wsy+4;
rectangle(sx1,sy1,sx2,sy2);
for(t1=0;t1<16;t1++) {
x1=sx,y1=sy,x2=wsx,y2=wsy;
setfillstyle(SOLID-FILL,t1);
bar(sx,sy,sx+wsx,sy+wsy);
sx=sx+wsx+1;{
setcolor(0);
sx=146;idx-num=1;clr-idx=15;
rectangle(sx,sy,sx2-4,sy2-4);
rectangle(sx-1,sy-1,sx2-3,sy2-3);
sx=285,sy=40,wsx=80,wsy=20;
x1=sx,y1=sy,x2=wsx,y2=wsy;
setfillstyle(SOLID-FILL,clr-idx);
bar(sx,sy,sx+wsx,sy+wsy);
red-vol=63;grn-vol=63;blu-vol=63;
display-status();
clr-bar-loop:
key-num=getch();
if(key-num==‘0’) return;
switch(key-num){
case `i′:clr-idx++;
if(clr-idx>15) clr-idx=0;
if(clr-idx<0) clr-idx=15;
change-idx();break;
case 's':clr-idx--;
if(clr-idx>15) clr-idx=0;
if(clr-idx<0) clr-idx=15;
change-idx();break;
case '1':rgb-flag=1;adj=0;
change-rgb();break;
case '2':rgb-flag=1;adj=1;
change-rgb();break;
case '3':rgb-flag=2;adj=0;
change-rgb();break;
case '4':rgb-flag=2;adj=1;
change-rgb();break;
case '5':rgb-flag=3,adj=0;
change-rgb();break;
case '6':rgb-flag=3;adj=1;
change-rgb();break;
case 'd':reset-defaults();
idx-num=1;reset-pattern();break;
case 'g':reset-grays();
idx-num=2;reset-pattern();break;
case 'u':reset-user();
idx-num=3;reset-pattern();break;
case 'p':print-user();break;}
goto clr-bar-loop;}
display-status(){
setcolor(7);
row=1;col=15;
set=cursor(row,col);
printf(“Index: %2d”, clr-idx);
set-cursor(row+1,col);
printf(“Red : %d”, red-vol);
set-cursor(row+2,col);
printf(“Green:%d”,grn-vol);
set-cursor(row+3,col);
printf(“Blue :%d”,blu-vol);
return;}
adjust-color(){
switch(rgb-flag){
case 1:
if(adj==0) red-vol++;
if(adj==1) red-vol--;
if(red-vol>63) red-vol=63;
if(red-vol<0) red-vol=0;
break;
case 2:
if(adj==0) grn-vol++;
if(adj==1) grn-vol--;
if(grn-vol>63) grn-vol=63;
if(grn-vol<0) grn-vol=0);
break;
case 3:
if(adj==0) blu-vol++;
if(adj==1) blu-vol--;
if(blu-vol>63) blu-vol=63;
if(blu-vol<0) blu-vol=0;
break;}
return;}
write-rgb(clr,red-vol,grn-vol,blu-vol){
switch(clr){
case 6: clr=20;break;
case 8: clr=20;break;
case 9: clr=57;break;
case 10: clr=58;break;
case 11: clr=59;break;
case 12: clr=60;break;
case 13: clr=61;break;
case 14: clr=62;break;
case 15: clr=63;break;
default:break;}
=0x10;
=0x10;
=clr;
=grn-vol;
=blu-vol;
=red-vol;
int86(0x10,®s,®s);
return;}
set-index(){
switch(idx-num){
case 1:red-vol=vga-default[clr-idx][0];
grn-vol=vga-default[clr-idx][1];
blu-vol=vga-default[clr-idx][2];break;
case 2:red-vol=vga-gray[clr-idx][0];
grn-vol=vga-gray[clr-idx][1];
blu-vol=vga-gray[clr-idx][2];break;
case 3:red-vol=vga-user[clr-idx][0];
grn-vol=vga-user[clr-idx][1];
blu-vol=vga-user[clr-idx][2];break;}
return;}
reset-defaults(){
for(t1=0; t1<16; t1++){
clr-idx=t1;
red-vol=vga-default[t1][0];
grn-vol=vga-default[t1][1];
blu-vol=vga-default[t1][2];
write-rgb(clr-idx,red-vol,grn-vol,blu-vol);}
t1=15; clr-idx=t1;
display-status();return;}
reset-grays(){
for(t1=0;t1<16;t1++){
clr-idx=t1;
red-vol=vga-gray[t1][0];
grn-vol=vga-gray[t1][1];
blu-vol=vga-gray[t1][2];
write-rgb(clr-idx,red-vol,grn-vol,blu-vol);}
t1=15;clr-idx=t1;
display-status();return;}
reset-user(){
for(t1=0;t1<16;t1++){
clr-idx=t1;
red-vol=vga-user[t1][0];
grn-vol=vga-user[t1][1];
blu-vol=vga-user[t1][2];
write-rgb(clr-idx,red-vol,grn-vol,blu-vol);}
t1=15;clr-idx=t1;
display-status();return;}
store-user(){
vga-user[clr-idx][0]=red-vol;
vga-user[clr-idx][1]=grn-vol;
vga-user[clr-idx][2]=blu-vol;
return;}
print-user(){
row=16;col=15;
set-cursor(row,col);
printf(“RGB value:”);
set-cursor(row+1,col);
printf(“Index:”);
for(t1=0;t1<16;t1++) printf(“%2d,”,t1);
set-cursor(row+2,col);
printf(“Red: ”);
for(t1=0;t1<16;t1++) printf(“%2d,”,vga-user[t1][0]);
set-cursor(row+3,col);
printf(“Green:”);
for(t1=0;t1<16;t1++) printf(“%2d,”,vga-user[t1][1]);
set-cursor(row+4,col);
printf(“Blue:”);
for(t1=0;t1<16;t1++) printf(“%2d,”,vga-user[t1][2]);
return;}
change-idx(){
set-index();display-status();
setfillstyle(SOLID-FILL,clr-idx);
bar(sx,sy,sx+wsx,sy+wsy);
return;}
change-rgb(){
adjust-color();display-status();
write-rgb(clr-idx,red-vol,grn-vol,blu-vol);
store-user();
return;}
reset-pattern(){
display-status();
setfillstyle(SOLID-FILL,clr-idx);
bar(x1,y1,x1+x2,y1+y2);
return:}
set-cursor(x,y){
=0x02,=0;
=x,=y;
int86(0x10,®s,®s);
return;}
作者:陈永平
色彩调配工具提供了下述四方面功能。
(1)颜色索引功能 本功能从色彩调配工具提供的调色板的16种颜色中每次选出一种颜色供用户调配,同时提示出当前被调配色彩中的RGB各分量值(辉度),RGB取值范围是0到63。使用‘i’和‘s’键改变颜色索引号号,通过颜色索引号在调色板上选取各种需调配的颜色。
(2)颜色调配功能 本功能在颜色选好后,对指定色号的`颜色进行调配。使用‘1’和‘2’键增加和减少该颜色的红色分量。使用‘3’和‘4’键增加和减少绿色分量,使用‘5’和‘6’键增加和减少蓝色分量。在RGB分量值变化时,调配的颜色跟随着变化,且RGB各分量值也显示出来。调配中的颜色同时自动写入用户调色板。
(3)显示调色板功能 本功能显示色彩调配工具提供的3个调色板。第一个是缺省值调色板,显示16种标准颜色,使用‘d’键弹出。第二个是灰色调色板,显示16种灰度的灰色,使用‘g’键弹出。第三个是用户调色板,它的初始值是16种标准颜色,用户使用颜色索引功能和颜色调配功能在它上面进行色彩编辑,编辑好的颜色的RGB值自动保存起来。使用‘u’键将用户调色板弹出。
(4)调色板打印功能 本功能将用户编辑好的用户调色板中的16种颜色的RGB值打印在屏幕上,供用户记录下来后在自己的应用程序中使用。
色彩调配工具在Turbo C和Borland C下运行,读者可以单独使用它,也可以把它改成函数加在应用程序中。程序清单附后:
#include <dos.h>
#include <graphics.h>
int adapter, mode;
int screen-x,screen-y;
int sx, sy, wsx, wsy, sx1, sy1, sx2, sy2, x1, y1, x2, y2, t1;
int red-vol, grn-vol, blu-vol, key-num, idx-num, row, col;
int rgb-flag, adj, clr-idx;
int vga-default[16][3]={
0,0,0,0,0,42,0,42,0,0,42,42,42,0,0,42,0,42,
42,21,0,42,42,42,21,21,21,21,21,63,0,63,0,
0,63,63,63,21,17,63,19,63,63,63,0,63,63,63};
int vga-gray[16][3]={
0,0,0,10,10,10,13,13,13,15,15,15,17,17,17,20,20,20,
24,24,24,28,28,28,33,33,33,37,37,37,41,41,41,
46,46,46,50,50,50,54,54,54,58,58,58,63,63,63};
int vga-user[16][3]={
0,0,0,0,0,42,0,42,0,0,42,42,42,0,0,42,0,42,
42,21,0,42,42,42,21,21,21,21,21,63,0,63,0,
0,63,63,63,21,17,63,19,63,63,63,0,63,63,63};
char string[]="0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15";
char title[]="VGA color pattern";
union REGS regs;
main(){
detectgraph(&adapter,&mode);
initgraph(&adapter, &mode,“ ”);
setfillstyle(SOLID-FILL,0); bar(118,100,507,239);
setfillstyle(SOLID-FILL,7); bar(120,103,509,237);
setcolor(0), rectangle(122,105,507,235);
sx=146,sy=138,wsx=20,wsy=80;
settextstyle(3,0,1);
outtextxy(250,105,title);
settextstyle(2,0,5);
outtextxy(sx,sy-15,string);
sx1=sx-4,sy1=sy-4,sx2=sx+(16*(wsx+1))+4;sy2=
sy+wsy+4;
rectangle(sx1,sy1,sx2,sy2);
for(t1=0;t1<16;t1++) {
x1=sx,y1=sy,x2=wsx,y2=wsy;
setfillstyle(SOLID-FILL,t1);
bar(sx,sy,sx+wsx,sy+wsy);
sx=sx+wsx+1;{
setcolor(0);
sx=146;idx-num=1;clr-idx=15;
rectangle(sx,sy,sx2-4,sy2-4);
rectangle(sx-1,sy-1,sx2-3,sy2-3);
sx=285,sy=40,wsx=80,wsy=20;
x1=sx,y1=sy,x2=wsx,y2=wsy;
setfillstyle(SOLID-FILL,clr-idx);
bar(sx,sy,sx+wsx,sy+wsy);
red-vol=63;grn-vol=63;blu-vol=63;
display-status();
clr-bar-loop:
key-num=getch();
if(key-num==‘0’) return;
switch(key-num){
case `i′:clr-idx++;
if(clr-idx>15) clr-idx=0;
if(clr-idx<0) clr-idx=15;
change-idx();break;
case 's':clr-idx--;
if(clr-idx>15) clr-idx=0;
if(clr-idx<0) clr-idx=15;
change-idx();break;
case '1':rgb-flag=1;adj=0;
change-rgb();break;
case '2':rgb-flag=1;adj=1;
change-rgb();break;
case '3':rgb-flag=2;adj=0;
change-rgb();break;
case '4':rgb-flag=2;adj=1;
change-rgb();break;
case '5':rgb-flag=3,adj=0;
change-rgb();break;
case '6':rgb-flag=3;adj=1;
change-rgb();break;
case 'd':reset-defaults();
idx-num=1;reset-pattern();break;
case 'g':reset-grays();
idx-num=2;reset-pattern();break;
case 'u':reset-user();
idx-num=3;reset-pattern();break;
case 'p':print-user();break;}
goto clr-bar-loop;}
display-status(){
setcolor(7);
row=1;col=15;
set=cursor(row,col);
printf(“Index: %2d”, clr-idx);
set-cursor(row+1,col);
printf(“Red : %d”, red-vol);
set-cursor(row+2,col);
printf(“Green:%d”,grn-vol);
set-cursor(row+3,col);
printf(“Blue :%d”,blu-vol);
return;}
adjust-color(){
switch(rgb-flag){
case 1:
if(adj==0) red-vol++;
if(adj==1) red-vol--;
if(red-vol>63) red-vol=63;
if(red-vol<0) red-vol=0;
break;
case 2:
if(adj==0) grn-vol++;
if(adj==1) grn-vol--;
if(grn-vol>63) grn-vol=63;
if(grn-vol<0) grn-vol=0);
break;
case 3:
if(adj==0) blu-vol++;
if(adj==1) blu-vol--;
if(blu-vol>63) blu-vol=63;
if(blu-vol<0) blu-vol=0;
break;}
return;}
write-rgb(clr,red-vol,grn-vol,blu-vol){
switch(clr){
case 6: clr=20;break;
case 8: clr=20;break;
case 9: clr=57;break;
case 10: clr=58;break;
case 11: clr=59;break;
case 12: clr=60;break;
case 13: clr=61;break;
case 14: clr=62;break;
case 15: clr=63;break;
default:break;}
=0x10;
=0x10;
=clr;
=grn-vol;
=blu-vol;
=red-vol;
int86(0x10,®s,®s);
return;}
set-index(){
switch(idx-num){
case 1:red-vol=vga-default[clr-idx][0];
grn-vol=vga-default[clr-idx][1];
blu-vol=vga-default[clr-idx][2];break;
case 2:red-vol=vga-gray[clr-idx][0];
grn-vol=vga-gray[clr-idx][1];
blu-vol=vga-gray[clr-idx][2];break;
case 3:red-vol=vga-user[clr-idx][0];
grn-vol=vga-user[clr-idx][1];
blu-vol=vga-user[clr-idx][2];break;}
return;}
reset-defaults(){
for(t1=0; t1<16; t1++){
clr-idx=t1;
red-vol=vga-default[t1][0];
grn-vol=vga-default[t1][1];
blu-vol=vga-default[t1][2];
write-rgb(clr-idx,red-vol,grn-vol,blu-vol);}
t1=15; clr-idx=t1;
display-status();return;}
reset-grays(){
for(t1=0;t1<16;t1++){
clr-idx=t1;
red-vol=vga-gray[t1][0];
grn-vol=vga-gray[t1][1];
blu-vol=vga-gray[t1][2];
write-rgb(clr-idx,red-vol,grn-vol,blu-vol);}
t1=15;clr-idx=t1;
display-status();return;}
reset-user(){
for(t1=0;t1<16;t1++){
clr-idx=t1;
red-vol=vga-user[t1][0];
grn-vol=vga-user[t1][1];
blu-vol=vga-user[t1][2];
write-rgb(clr-idx,red-vol,grn-vol,blu-vol);}
t1=15;clr-idx=t1;
display-status();return;}
store-user(){
vga-user[clr-idx][0]=red-vol;
vga-user[clr-idx][1]=grn-vol;
vga-user[clr-idx][2]=blu-vol;
return;}
print-user(){
row=16;col=15;
set-cursor(row,col);
printf(“RGB value:”);
set-cursor(row+1,col);
printf(“Index:”);
for(t1=0;t1<16;t1++) printf(“%2d,”,t1);
set-cursor(row+2,col);
printf(“Red: ”);
for(t1=0;t1<16;t1++) printf(“%2d,”,vga-user[t1][0]);
set-cursor(row+3,col);
printf(“Green:”);
for(t1=0;t1<16;t1++) printf(“%2d,”,vga-user[t1][1]);
set-cursor(row+4,col);
printf(“Blue:”);
for(t1=0;t1<16;t1++) printf(“%2d,”,vga-user[t1][2]);
return;}
change-idx(){
set-index();display-status();
setfillstyle(SOLID-FILL,clr-idx);
bar(sx,sy,sx+wsx,sy+wsy);
return;}
change-rgb(){
adjust-color();display-status();
write-rgb(clr-idx,red-vol,grn-vol,blu-vol);
store-user();
return;}
reset-pattern(){
display-status();
setfillstyle(SOLID-FILL,clr-idx);
bar(x1,y1,x1+x2,y1+y2);
return:}
set-cursor(x,y){
=0x02,=0;
=x,=y;
int86(0x10,®s,®s);
return;}
作者:陈永平
-
形式与意义兼顾外语的教学论文
一、研究方法首先,这是一个准实验研究。研究对象非随机选取,而是使用研究者教授的一个非英语专业自然班级。该研究方法由于不必重组课堂和打乱现行的教学进程、易于寻找研究对象而常被应用于教学研究。其次,研究采用定性与定量相结合的方法,建立在严密的逻辑步骤上...
-
浅议建构主义理论在中医教育中的运用论文
【关键词】建构主义理论;中医教育建构主义教育理论的运用不仅带来教学形式的改变,更是教学模式和教学理念的变革。其教学模式概括为:以学生为中心,在整个教学过程中由教师起组织者、指导者、帮助者和促进者的作用,利用情境、协作、会话等学习环境要素充分发挥学...
-
浅议体育课多班同课窘境的应对策略论文
随着学校规模的不断扩大,在同一课次、同一场地上体育课的班级数也越来越多,而由于受场地、器材等因素的影响,造成了体育课多班同课教学的窘境。一、体育课多班同课教学窘境的原因1、体育设施配备滞后,同场教学有序开展受到制约。场地、器材配备与同课教学需求的差...
-
企业网站翻译研究现状与发展新方向论文
摘要:以中国企业网站的英译为主要讨论对象,将其置身于目前飞速发展的语言服务大背景下,结合传统的网站文本翻译与网站本地化的过程,讨论在语言服务行业发展背景下企业网站翻译的三大趋势,为我国“走出去”进程中的企业网站建设和翻译提供启示和借鉴。关键词:企业网站...