241 cputs(" respectively."); gotoxy(1,4); cputs("You can also use the up and down arrow keys."); gotoxy(1,5); cputs(" Then press + to increase or - to decrease"); cputs(" value."); gotoxy(1,6); cputs( " To exit adjustment press ESC\n"); gotoxy(30,8); textattr(WHITE+(RED<<4)); cprintf("Hue %4d",k1); gotoxy(30,9); cprintf("Contrast %4d",k2); gotoxy(30,10); cprintf ( "Sat urati on %4d",k3); gotoxy(30,11); cprintf ( "Brightness %4d",k4); a=getch(); ind2=1; i=-1; while(ind2) { if((a==D_ARROW)||(a==U_ARROW)) { switch(a) { case D_ARROW: i++; if(i>3) i=0; break; case U_ARROW: i ; if(i<0) i=3; } switch(i) { case 0: a='H'; break; case 1: a='C'; break; case 2: a='S'; break; case 3: 242 a='B'; } } textattr(WHITE+(GREEN<<4)); gotoxy(1,10); cprintf("Key pressed %c\n",a); switch(a) { case 'h': case 'H': gotoxy(30,8); cprintf("Hue %4d",k1); while(((a=(char)getch())=='+')||(a=='-')) { switch(a) { case '+': ++k1 ; if(k1>255) k1=0; break; case '-': k1; if(k1<0) k1=255; } SetHue(k1); gotoxy(30,14); cprintf("Key pressed %c",a); gotoxy(30,8); cprintf("Hue %4d",k1); } textattr(WHITE+(RED<<4)); gotoxy(30,8); cprintf("Hue %4d",k1); break; case 'c': case 'C': gotoxy(30,9); cprintf("Contrast %4d",k2); while(((a=(char)getch())-='+')||(a-='-')) { switch(a) { case '+': ++k2 ; 243 if(k2>255) k2=0; break; case '-': k2; if(k2<0) k2=255; } SetContrast(k2); gotoxy(30,14); cprintf("Key pressed %c",a); gotoxy(30,9); cprintf("Contrast %4d",k2); } textattr(WHITE+(RED<<4)); gotoxy(30,9); cprintf("Contrast %4d",k2); break; case 's': case 'S': gotoxy(30,10); cprintf("Saturation %4d",k3); while(((a=(char)getch())=='+')||(a=='-')) { switch(a) { case '+': ++k3; if(k3>255) k3=0; break; case '-': k3; if(k3<0) k3=255; } SetSaturation(k3); gotoxy(30,14); cprintf("Key pressed %c",a); gotoxy(30,10); cprintf("Saturation %4d",k3); } textattr(WHITE+(RED<<4)); gotoxy(30,10); cprintf("Saturation %4d",k3); break; case 'b': case 'B': 244 gotoxy(30,11); cprintf("Brightness %4d",k4); while(((a=(char)getch())=='+')||(a=='-')) { switch(a) { case '+': ++k4 ; if(k4>255) k4=0; break; case '-': k4; if(k4<0) k4=255; } SetBright(k4); gotoxy(30,14); cprintf("Key pressed %c",a); gotoxy(30,11); cprintf("Brightness %4d",k4); } textattr(WHITE+(RED<<4)); gotoxy(30,11); cprintf("Brightness %4d",k4); break; case (char)27: ind2=0; break; default: a=getch(); break; } } ind=0; break; case 'N': case 'n': ind=0; break ; default: gotoxy(40,1); break; } } textattr((BLACK<<4)); 245 clrscr(); textattr(WHITE+(BLUE<<4)); gotoxy(1,1); cputs("Do you wish to freeze image (y or n) >"); while(((a=getch())!='y')&&(a!='n')); gotoxy(40,1); cprintf("%c",a); if(a=='n') { textattr(LIGHTGRAY+(BLACK<<4)); clrscr(); exit(1); } CaptureFrame(); SetInDispMode(); gotoxy(1,2); cputs( "DO You wish to save image on disk (y or n) >"); while(((a=getch())!='y')&&(a!='n')); gotoxy(46,2); cprintf( "%c", a); if(a=='n') { textattr(LIGHTGRAY+(BLACK<<4)); clrscr(); exit(1); } gotoxy(1,3); cprintf("Enter name of fi I e to save image to ->"); scanf( "%s" , file_name); fptro=fopen( file_name,"wb"); gotoxy(70,25); textattr(WHITE+(GREEN<<4)+BLINK); cputs( "WAIT"); for(i=0;i<256;i++) { FGetPibRow(buff,0,511,i); fwrite(buff,512,2,fptro); } fclose(fptro); gotoxy(70,25); textattr(LIGHTGRAY+(BLACK<<4)); cputs(" "); clrscr(); 246 } Để hiện thị màu bằng vỉ mạch VGA bạn có thể dùng chung bảng màu được phát triển cho hiện biểu đồ màu. Bảng màu này không phải là bảng màu tốt nhất cho tất cả các ảnh màu, và có thể tạo ra một bảng màu tối thiểu cho hiển thị ảnh. Một phép gần đúng cho phát triển bảng màu 8 bit (256 màu) cho các ảnh màu đặc biệt có thể mô tả bằng các bước sau đây: Giá trị ban đầu của bốn mảng, tất cả của 256 mức, đến giá trị không: palette.blue[256], palette.green[256], palette.red[256] palette.count[256] ở đây mỗi màu là một của bốn mảng số nguyên không dấu: đỏ, lục, lam, và số thứ tự. Quét toàn bộ ảnh và cho mỗi điểm màu: 1. Nhân ba màu chính r, g, b với một hệ số hằng sao cho giá trị chỉ đến 255. Trong ảnh 5 bit /màu chính có nghĩa là dịch trái 3 bit (ví dụ giá trị lớn nhất cho màu chính là 31 8), hoặc bạn có thể chia khoảng cách giữa các giá trị sao cho màu chính với cường độ sáng lớn nhất nàm trong khoảng từ 0 đến 255. 2. Tính cường độ chói dùng y = 0,59g + 0,30r + 0,11b, hoặc bạn có thể dùng công thức cho Y cho ở biểu thức (11.1). Làm tròn y đến giá trị nguyên gần nhất. Nếu giá trị làm tròn là k, thì tăng palette.count[k] thêm 1. Đặt n = palette.count[k] Tính palette.blue[k] = (n palette.blue[k] + b)/(n + 1) palette.green[k] = (n palette.green[k] + g)/(n + 1) palette.red[k] = (n palette.red[k] + r)/(n + 1) Ảnh màu có thể hiển thị như một ảnh mức cường độ sáng 8 bit tính dùng biểu thức độ chói và mục màu tính ra. Chú ý là ảnh màu cung cấp trong cuốn sách này có chiều rộng là 512, và chiều cao là 256 điểm. Ảnh sẽ chỉ hiện lên cân xứng chỉ khi ta dùng vỉ mạch PIB ATI. Khi hiển thị ảnh dùng bộ chuyển đổi đồ hoạ video, để cho ảnh có tỷ lệ hợp lý, bạn cần chuyển ảnh có kích thước 256 256. Chương trình thực hiện chuyển đổi này lưu giữ trên đĩa trong file có tên là ATI_SCAL.C. Ảnh có thể hiện lên dưới chế độ Microsoft Window bằng cách đầu tiên chuyển ảnh thành dạng bitmap cho Windows. Các file này 247 thường có phần mở rộng là BMP. Chương trình dùng chuyển một ảnh màu thành file BMP được cung cấp trên đĩa dưới tên BIN2BMP.EXE. Một ảnh đã được chuyển đổi có thể được xem bằng chương trình Paintbrush của Windows. Chú ý rằng Windows phải ở chế độ hiển thị 256 màu. Thuộc tính này xuất hiện khi bạn nhắp đúp vào nhóm chương trình "Main" và sau đó nhắp đúp vào "Window Setup". Kích "Options", sau khi đã kích vào "Change System Settíng". Bạn cần đĩa Windows' video driver cho phép máy tính và vỉ mạch video chuyển sang chế độ mà bạn mong muốn. Một số chương trình dùng để hiển thị ảnh màu dưới DOS dùng vỉ mạch VGA cũng đã có sẵn trên đĩa. Đọc file README.DOC để hiểu thêm về các chức năng này. Chương trình hiển thị DOS sẽ hiển thị ảnh PIB ATI. Bạn sẽ cần chia hoặc biến đổi chúng theo dạng thích hợp cho window. Chương trình hiển thị DOS sẽ làm việc trên hệ thống của bạn nếu vỉ mạch video của bạn tuân theo tiêu chuẩn VESA. Nếu bạn có khó khăn trong hiện thị dưới môi trường DOS, bạn hãy dùng trong môi trường Windows được giải thích ở trên. Sẽ có một sự thay đổi rõ ràng chất lượng của ảnh hiện lên trên hệ thống có khả năng thể hiện 32,768 màu so với ảnh hiện lên trên hệ thống có khả năng thể hiện 256 màu. Để thấy rõ sự khác nhau này bạn cần chạy chương trình 11.4 để lấy và hiện lên các điểm ảnh trên vỉ mạch PIB, nếu vỉ mạch này đã được cung cấp sẵn cho hệ thống của bạn, hoặc bạn có thể thay đổi chương trình để thích hợp với vỉ mạch ảnh màu, nếu bạn có một sẵn một loại vỉ mạch khác. Bạn có thể dùng ảnh "IHABCOL.IMG" đã có sẵn trên đĩa với kích thước 512 512 điểm ảnh. Chương trình 11.4 "LOADPIB.C". Loading a Colored image on the PIB board. The image is assumed to be of size 512 x 256 pixels. /*This program is for loading a colored image stored in a file onto the PIB board.*/ #include <stdio.h> #include <custom.h> #include <stdlib.h> #include <conio.h> void main() { int i ; char buff[1024], file_name[30]; FILE *fptri; clrscr(); InitPIB(); SetScreen(0); SetInDispMode(); SetInterlace(1); . '-': k2; if(k2<0) k2 =25 5; } SetContrast(k2); gotoxy(30,14); cprintf("Key pressed %c",a); gotoxy(30,9); cprintf("Contrast %4d",k2); } textattr(WHITE+(RED<<4));. là 25 6 điểm. Ảnh sẽ chỉ hiện lên cân xứng chỉ khi ta dùng vỉ mạch PIB ATI. Khi hiển thị ảnh dùng bộ chuyển đổi đồ hoạ video, để cho ảnh có tỷ lệ hợp lý, bạn cần chuyển ảnh có kích thước 25 6. Windows. Các file n y 24 7 thường có phần mở rộng là BMP. Chương trình dùng chuyển một ảnh màu thành file BMP được cung cấp trên đĩa dưới tên BIN2BMP.EXE. Một ảnh đã được chuyển đổi có thể được