Ⅰ 跪求計算機大神幫助
什麼系統啊
xp:
桌面右擊,點擊屬性,如下圖所示:
步驟閱讀
2
點擊屬性後進入下圖所示對話框:
3
點擊設這,進入如下圖所示對話框,此對話框即我們的目的地,在這里可以設置屏幕解析度:
END
二、具體設置及注意事項
注意事項:window系統會自動檢測你的屏幕給你選擇合適的解析度,只有你確實需要了再調整,不然屏幕會很別扭,不是很清晰。如下圖所示,解析度過小:
分辨路過小圖標及字都不清晰
具體設置為:移動「屏幕解析度」下面的滑塊,往左是解析度減小,往右是大解析度。
如果你的屏幕解析度比最小分比率大,調整為最小解析度後會出現上面圖標的情況,如果最大解析度比你的屏幕解析度達,設置為最大解析度後,會出現下面的情況:
圖標變的非常小,而且你的屏幕上不能容下所有內容,一部分內容在屏幕之外,把滑鼠放在屏幕邊緣,屏幕會自動移動到屏幕之外的區域。
win7:
在桌面空白處,點擊右鍵。
選擇屏幕解析度,會出現一個窗口。
點擊解析度下拉菜單,後會出現一個菜單,滑動改變解析度。
wi8:
1.把滑鼠移動到屏幕右上角,選擇設置菜單。
win8.1怎麼更改屏幕解析度
2.然後選擇右下角的更改電腦設置。
win8.1怎麼更改屏幕解析度
3.在左側選擇電腦和設置。
win8.1怎麼更改屏幕解析度
4.在顯示中,我們就可以滑鼠拖動來調節屏幕解析度了。
請採納答案,支持我一下。
Ⅱ 用c語言編寫程序處理圖片bmp文件 1.讀取圖片的寬度,高度,每個像素所需的位數,水平解析度,垂直
#include<windows.h>
//讀bmp圖片需要兩個結構
#pragmapack(push,enter_defBM,1)//指定內存對齊單位為1。
typedefstructtagBmpFileHeader
{
WORDbfType;//文件類型BM
DWORDbfSize;//文件大小
WORDbfReserved1;//保留字
WORDbfReserved2;//保留字
DWORDbfOffBits;//點陣圖的數據信息離文件頭的偏移量
}BFH;
typedefstructtagBmpImgHeader
{
DWORDbiSize;//表示本結構的大小,0X28
LONGbiWidth;//點陣圖的寬度
LONGbiHeight;//點陣圖的高度
WORDbiPlanes;//位面數永遠為1
WORDbiBitCount;//點陣圖的位數
DWORDbiCompression;//壓縮類型
DWORDbiSizeImage;//表示點陣圖數據區域的大小
LONGbiXPelsPerMeter;//表示顯示設備的水平解析度
LONGbiYPelsPerMeter;//表示顯示設備的垂直解析度
DWORDbiClrUsed;//實際使用的顏色數目
DWORDbiClrImportant;//重要的顏色數量
}BIH;
#pragmapack(pop,enter_defBM)//恢復默認內存對齊單位。
#defineHDIBHANDLE//點陣圖句柄
DWORDWINAPIDIBNumColors(BYTE*data)
{
WORDwBitCount;
DWORDdwClrUsed=((BIH*)data)->biClrUsed;
if(dwClrUsed!=0)return(WORD)dwClrUsed;
wBitCount=((BIH*)data)->biBitCount;
return1<<wBitCount;
}
WORDWINAPIPaletteSize(BYTE*data)
{
return(WORD)(::DIBNumColors(data)*sizeof(RGBQUAD));
}
BYTE*WINAPIFindDIBBits(BYTE*data)
{
return(data+*(DWORD*)data+::PaletteSize(data));
}
//獲取Bmp的寬度
DWORDFARDIBWidth(constBYTE*data)
{
BIH*pbmi;
pbmi=(BIH*)data;
if(pbmi->biSize==sizeof(BIH))returnpbmi->biWidth;
elsereturn-1;
}
//獲取Bmp的高度
DWORDFARDIBHeight(constBYTE*data)
{
BIH*pbmi;
pbmi=(BIH*)data;
if(pbmi->biSize==sizeof(BIH))returnpbmi->biHeight;
elsereturn-1;
}
//從文件讀取Bmp圖像數據
HDIBWINAPIReadDIBFile(FILE*fp)
{
BFHbmf;
HDIBhDIB;
BYTE*pData;
rewind(fp);
if(fread(&bmf,sizeof(BFH),1,fp)!=1)returnNULL;//文件讀取錯誤
if(bmf.bfType!=19778)returnNULL;//文件類型錯誤
hDIB=(HDIB)::GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,bmf.bfSize);//為DIB分配內存
if(hDIB==0)returnNULL;//內存分配失敗。
pData=(BYTE*)::GlobalLock((HGLOBAL)hDIB);//鎖定
if(fread(pData,1,bmf.bfSize-sizeof(BFH),fp)!=(bmf.bfSize-sizeof(BFH)))//文件讀取錯誤
{
::GlobalUnlock((HGLOBAL)hDIB);//解除鎖定
::GlobalFree((HGLOBAL)hDIB);//釋放內存
returnNULL;
}
::GlobalUnlock((HGLOBAL)hDIB);//解除鎖定
returnhDIB;//返回DIB句柄
}
BOOLWINAPIPaintDIB(HDChDC,intposX,intposY,HDIBhDIB)
{
BYTE*pDIBHd;//BITMAPINFOHEADER指針
BYTE*pDIBBits;//DIB象素指針
BOOLbSuccess=FALSE;//成功標志
HPALETTEhPal=NULL;//DIB調色板
//HPALETTEhOldPal=NULL;//以前的調色板
if(hDIB==NULL)returnFALSE;//判斷DIB對象是否為空
pDIBHd=(BYTE*)::GlobalLock((HGLOBAL)hDIB);//鎖定DIB
pDIBBits=::FindDIBBits(pDIBHd);//找到DIB圖像象素起始位置
::SetStretchBltMode(hDC,COLORONCOLOR);//設置顯示模式
//調用SetDIBitsToDevice()來繪制DIB對象
bSuccess=::SetDIBitsToDevice(hDC,//hDC
posX,posY,
((BIH*)pDIBHd)->biWidth,//nDestWidth
((BIH*)pDIBHd)->biHeight,//nDestHeight
0,//SrcX
0,//SrcY
0,//nStartScan
(WORD)DIBHeight(pDIBHd),//nNumScans
pDIBBits,//lpBits
(LPBITMAPINFO)pDIBHd,//lpBitsInfo
DIB_RGB_COLORS);//wUsage
::GlobalUnlock((HGLOBAL)hDIB);//解除鎖定
returnbSuccess;
}
//列印點陣圖信息
VOIDWINAPIPrintDIBInfo(HDIBhDIB)
{
BYTE*pDIBHd=(BYTE*)::GlobalLock((HGLOBAL)hDIB);
BIH*pbmi=(BIH*)pDIBHd;
constchar*lp[]=
{
"點陣圖信息長度:%d ",
"點陣圖圖像大小:%dx%d ",
"位面數:%d ",
"點陣圖顏色深度:%d ",
"點陣圖數據壓縮類型:%d ",
"點陣圖數據區域大小:%d ",
"點陣圖解析度:水平%ddpi,垂直%ddpi ",
};
printf("WindowsV3cBitmapInfoHeader信息 ");
printf(lp[0],pbmi->biSize);
printf(lp[1],pbmi->biWidth,pbmi->biHeight);
printf(lp[2],pbmi->biPlanes);
printf(lp[3],pbmi->biBitCount);
printf(lp[4],pbmi->biCompression);
printf(lp[5],pbmi->biSizeImage);
printf(lp[6],(LONG)(pbmi->biXPelsPerMeter*0.0254f+0.5f),(LONG)(pbmi->biYPelsPerMeter*0.0254f+0.5f));
::GlobalUnlock((HGLOBAL)hDIB);//解除鎖定
}intmain(intargc,char*argv[])
{
HDIBx;
FILE*fp=fopen("1.bmp","rb");
if(fp==NULL)return-1;
x=ReadDIBFile(fp);
printf("DIBhandle%u",x);
PaintDIB(GetDC(NULL),0,0,x);
PrintDIBInfo(x);
return0;
}
Ⅲ c語言屏幕解析度代碼
單是C 庫的話好象最大才是640x480.
Ⅳ C語言中VGAHI什麼意思
driver=VGA; //適配器類型
mode=VGAHI; //適配器工作模式
他們用來決定屏幕的象素多少和色彩的種類,
相當與windows下的顯示模式
VGAHI 將屏幕調整為VGA模式下的16色,解析度為640*480。
以下資料僅供參考:
Turbo C提供了非常豐富的圖形函數, 所有圖形函數的原型均在graphics. h中, 本節主要介紹圖形模式的初始化、獨立圖形程序的建立。另外, 使用圖形函數時要確保有顯示器圖形驅動程序*BGI, 同時將集成開發環境Options/Linker中的Graphics lib選為on, 只有這樣才能保證正確使用圖形函數。
1. 圖形模式的初始化
不同的顯示器適配器有不同的圖形解析度。即是同一顯示器適配器, 在不同模式下也有不同解析度。因此, 在屏幕作圖之前, 必須根據顯示器適配器種類將顯示器設置成為某種圖形模式, 在未設置圖形模式之前, 微機系統默認屏幕為文本模式(80列, 25行字元模式), 此時所有圖形函數均不能工作。設置屏幕為圖形模式, 可用下列圖形初始化函數:
void far initgraph(int far *gdriver, int far *gmode, char *path);
其中gdriver和gmode分別表示圖形驅動器和模式, path是指圖形驅動程序所在的目錄路徑。有關圖形驅動器、圖形模式的符號常數及對應的解析度見表2。
圖形驅動程序由Turbo C出版商提供, 文件擴展名為.BGI。根據不同的圖形適配器有不同的圖形驅動程序。例如對於EGA、 VGA 圖形適配器就調用驅動程序EGAVGA.BGI。
表2. 圖形驅動器、模式的符號常數及數值
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
圖形驅動器(gdriver) 圖形模式(gmode)
——————————— ——————————— 色調 解析度
符號常數 數值 符號常數 數值
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
CGA 1 CGAC0 0 C0 320*200
CGAC1 1 C1 320*200
CGAC2 2 C2 320*200
CGAC3 3 C3 320*200
CGAHI 4 2色 640*200
———————————————————————————————————
MCGA 2 MCGAC0 0 C0 320*200
MCGAC1 1 C1 320*200
MCGAC2 2 C2 320*200
MCGAC3 3 C3 320*200
MCGAMED 4 2色 640*200
MCGAHI 5 2色 640*480
———————————————————————————————————
EGA 3 EGALO 0 16色 640*200
EGAHI 1 16色 640*350
———————————————————————————————————
EGA64 4 EGA64LO 0 16色 640*200
EGA64HI 1 4色 640*350
———————————————————————————————————
EGAMON 5 EGAMONHI 0 2色 640*350
———————————————————————————————————
IBM8514 6 IBM8514LO 0 256色 640*480
IBM8514HI 1 256色 1024*768
———————————————————————————————————
HERC 7 HERCMONOHI 0 2色 720*348
———————————————————————————————————
ATT400 8 ATT400C0 0 C0 320*200
ATT400C1 1 C1 320*200
ATT400C2 2 C2 320*200
ATT400C3 3 C3 320*200
ATT400MED 4 2色 320*200
ATT400HI 5 2色 320*200
———————————————————————————————————
VGA 9 VGALO 0 16色 640*200
VGAMED 1 16色 640*350
VGAHI 2 16色 640*480
———————————————————————————————————
PC3270 10 PC3270HI 0 2色 720*350
———————————————————————————————————
DETECT 0 用於硬體測試
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
例4. 使用圖形初始化函數設置VGA高解析度圖形模式
#include <graphics.h>
int main()
{
int gdriver, gmode;
gdriver=VGA;
gmode=VGAHI;
initgraph(&gdriver, &gmode, "c:\\tc");
bar3d(100, 100, 300, 250, 50, 1); /*畫一長方體*/
getch();
closegraph();
return 0;
}
有時編程者並不知道所用的圖形顯示器適配器種類, 或者需要將編寫的程序用於不同圖形驅動器, Turbo C提供了一個自動檢測顯示器硬體的函數, 其調用格式為:
void far detectgraph(int *gdriver, *gmode);
其中gdriver和gmode的意義與上面相同。
例5. 自動進行硬體測試後進行圖形初始化
#include <graphics.h>
int main()
{
int gdriver, gmode;
detectgraph(&gdriver, &gmode); /*自動測試硬體*/
printf("the graphics driver is %d, mode is %d\n", gdriver,
gmode); /*輸出測試結果*/
getch();
initgraph(&gdriver, &gmode, "c:\\tc");
/* 根據測試結果初始化圖形*/
bar3d(10, 10, 130, 250, 20, 1);
getch();
closegraph();
return 0;
}
上常式序中先對圖形顯示器自動檢測, 然後再用圖形初始化函數進行初始化設置, 但Turbo C提供了一種更簡單的方法, 即用gdriver= DETECT 語句後再跟initgraph()函數就行了。採用這種方法後, 上例可改為:
例6.
#include <graphics.h>
int main()
{
int gdriver=DETECT, gmode;
initgraph(&gdriver, &gmode, "c:\\tc");
bar3d(50, 50, 150, 30, 1);
getch();
closegraph();
return 0;
}
另外, Turbo C提供了退出圖形狀態的函數closegraph(), 其調用格式為:
void far closegraph(void);
調用該函數後可退出圖形狀態而進入文本方式(Turbo C 默認方式), 並釋放用於保存圖形驅動程序和字體的系統內存。
2. 獨立圖形運行程序的建立
Turbo C對於用initgraph()函數直接進行的圖形初始化程序, 在編譯和鏈接時並沒有將相應的驅動程序(*.BGI)裝入到執行程序, 當程序進行到intitgraph() 語句時, 再從該函數中第三個形式參數char *path中所規定的路徑中去找相應的驅動程序。若沒有驅動程序, 則在C:\TC中去找, 如C:\TC中仍沒有或TC不存在, 將會出現錯誤:
BGI Error: Graphics not initialized (use 'initgraph')
因此, 為了使用方便, 應該建立一個不需要驅動程序就能獨立運行的可執行圖形程序,Turbo C中規定用下述步驟(這里以EGA、VGA顯示器為例):
1. 在C:\TC子目錄下輸入命令:BGIOBJ EGAVGA
此命令將驅動程序EGAVGA.BGI轉換成EGAVGA.OBJ的目標文件。
2. 在C:\TC子目錄下輸入命令:TLIB LIB\GRAPHICS.LIB+EGAVGA
此命令的意思是將EGAVGA.OBJ的目標模塊裝到GRAPHICS.LIB庫文件中。
3. 在程序中initgraph()函數調用之前加上一句:
registerbgidriver(EGAVGA_driver):
該函數告訴連接程序在連接時把EGAVGA的驅動程序裝入到用戶的執行程序中。
經過上面處理,編譯鏈接後的執行程序可在任何目錄或其它兼容機上運行。
假設已作了前兩個步驟,若再向例6中加 registerbgidriver()函數則變成:
例7:
#include<stdio.h>
#include<graphics.h>
int main()
{
int gdriver=DETECT,gmode;
registerbgidriver(EGAVGA_driver): / *建立獨立圖形運行程序 */
initgraph( gdriver, gmode,"c:\\tc");
bar3d(50,50,250,150,20,1);
getch();
closegraph();
return 0;
}
上例編譯鏈接後產生的執行程序可獨立運行。
如不初始化成EGA或CGA解析度, 而想初始化為CGA解析度, 則只需要將上述步驟中有EGAVGA的地方用CGA代替即可。
Ⅳ C語言打開圖像文件後讀取像素
C語言打開圖像文件後運用以下代碼就可以讀取像素,具體如下:
#ifndef IMAGE_H
#define IMAGE_H
void image_info(FILE* file);
void image_save(FILE *file);
void image_gray();
void image_binarization();
void image_opposite();
void image_channel(); //抽取RGB通道
void image_bright();//改變圖像亮度
typedef struct BMP
{
//14位元組
unsigned short bfType; //文件標識 2位元組 必須為BM
unsigned int bfSize; //文件大小 4位元組
unsigned short bfReserved1; //保留,每位元組以"00"填寫 2位元組
unsigned short bfReserved2; //同上 2位元組
unsigned int bfOffBits; //記錄圖像數據區的起始位置(圖象數據相對於文件頭位元組的偏移量)。 4位元組
//40位元組
unsigned int biSize; //表示本結構的大小 4位元組
int biWidth; //點陣圖的寬度 4位元組
int biHeight; //點陣圖的高度 4位元組
unsigned short biPlanes; //永遠為1 , 2位元組
unsigned short biBitCount; //點陣圖的位數 分為1 4 8 16 24 32 2位元組
unsigned int biCompression; //壓縮說明 4位元組
unsigned int biSizeImage; //表示點陣圖數據區域的大小以位元組為單位 4位元組
int biXPelsPerMeter; //用象素/米表示的水平解析度 4位元組
int biYPelsPerMeter; //用象素/米表示的垂直解析度 4位元組
unsigned int biClrUsed; //點陣圖使用的顏色索引數 4位元組
unsigned int biClrImportant; //對圖象顯示有重要影響的顏色索引的數目 4位元組
} BMP;
int line_byte;
unsigned char *imagedata;
extern BMP bmp;
extern int line_byte;
extern unsigned char *imagedata;
#endif
//image_rw.c文件
#include<stdio.h>
#include<stdlib.h>
#include"image.h"
void image_info(FILE *file)
{
int times=3; //輸入文件名次數。
char bmp_name[10]; //文件名
printf("\nplease enter a file name for reading:");
do
{
if (times<3)
{
printf("\nplease enter a file name for reading again:");
}
fflush(stdin);
gets(bmp_name);
//printf("\n%s",bmp_name);
file=fopen(bmp_name,"rb+"); //打開一個文件進行讀寫操作。
--times;
if (file==NULL)
{
printf("\nerror opening %s for reading! ",bmp_name);
}
else
{
break;
}
}
while(times!=0);
if (times==0)
{
printf("\nsorry, shutdown!");
exit(1);
}
//讀取圖像信息
fseek(file,0L,0); //讀取圖像文件類型
fread(&bmp,sizeof(BMP),1,file);
printf("\n bmp tpye: %u",bmp.bfType);
printf("\n bmp size: %u",bmp.bfSize);
printf("\n bmp reserved1: %u",bmp.bfReserved1);
printf("\n bmp reserved2: %u",bmp.bfReserved2);
printf("\n bmp offBits: %u",bmp.bfOffBits);
printf("\n bmp bisize: %u",bmp.biSize);
printf("\n bmp biWidth: %d",bmp.biWidth);
printf("\n bmp biHeight: %d",bmp.biHeight);
printf("\n bmp biplans: %u",bmp.biPlanes);
printf("\n bmp biBitCount: %u",bmp.biBitCount);
printf("\n bmp biCompression: %u",bmp.biCompression);
printf("\n bmp biSizeImage: %u",bmp.biSizeImage);
printf("\n bmp biXPelsPerMeter: %d",bmp.biXPelsPerMeter);
printf("\n bmp biYPelsPerMeter: %d",bmp.biYPelsPerMeter);
printf("\n bmp biClrUsed: %u",bmp.biClrUsed);
printf("\n bmp biClrImportant: %u\n",bmp.biClrImportant);
line_byte=(bmp.biWidth*bmp.biBitCount/8+3)/4*4; //獲得圖像數據每行的數據個數
//printf("dfsa%u",bmp.line_byte);
//bmp.imagedata=NULL;
imagedata=(unsigned char*)malloc(bmp.biSizeImage);
fseek(file,(long)bmp.bfOffBits,0);
fread(imagedata,sizeof(unsigned char),bmp.biSizeImage,file);
fclose(file);
}
//保存圖像
void image_save(FILE *file)
{
int times=3; //輸入文件名次數。
char bmp_name[10]; //文件名
//int i; //記錄數據區個數
printf("\nplease enter a file name for writeing:");
do
{
if (times<3)
{
printf("\nplease enter a file name for writeing again:");
}
fflush(stdin);
gets(bmp_name);
printf("\n%s",bmp_name);
file=fopen(bmp_name,"wb+"); //打開一個文件進行讀寫操作。
--times;
if (file==NULL)
{
printf("\nerror opening %s for writing",bmp_name);
}
else
{
break;
}
}
while(times!=0);
if (times==0)
{
printf("\nsorry, shutdown!");
exit(1);
}
//寫文件頭
printf("\n%s",bmp_name);
fseek(file,0L,0); //圖像文件類型
fwrite(&(bmp.bfType),sizeof(short),1,file);
printf("\n bmp tpye: %d",bmp.bfType);
fseek(file,2L,0); //圖像文件大小
fwrite(&(bmp.bfSize),sizeof(int),1,file);
printf("\n bmp size: %d",bmp.bfSize);
fseek(file,6L,0); //圖像文件保留字1
fwrite(&(bmp.bfReserved1),sizeof(short),1,file);
printf("\n bmp reserved1: %d",bmp.bfReserved1);
fseek(file,8L,0); //圖像文件保留字2
fwrite(&(bmp.bfReserved2),sizeof(short),1,file);
printf("\n bmp reserved2: %d",bmp.bfReserved2);
fseek(file,10L,0);//數據區的偏移量
fwrite(&(bmp.bfOffBits),sizeof(short),1,file);
printf("\n bmp offBits: %d",bmp.bfOffBits);
fseek(file,14L,0);//文件頭結構大小
fwrite(&(bmp.biSize),sizeof(int),1,file);
printf("\n bmp bisize: %d",bmp.biSize);
fseek(file,18L,0);//圖像的寬度
fwrite(&(bmp.biWidth),sizeof(int),1,file);
printf("\n bmp biWidth: %d",bmp.biWidth);
fseek(file,22L,0);//圖像的高度
fwrite(&(bmp.biHeight),sizeof(int),1,file);
printf("\n bmp biHeight: %d",bmp.biHeight);
fseek(file,24L,0);//圖像的面數
fwrite(&(bmp.biPlanes),sizeof(short),1,file);
printf("\n bmp biplans: %d",bmp.biPlanes);
fseek(file,28L,0);//圖像一個像素的位元組數
fwrite(&(bmp.biBitCount),sizeof(short),1,file);
printf("\n bmp biBitCount: %d",bmp.biBitCount);
fseek(file,30L,0);//圖像壓縮信息
fwrite(&(bmp.biCompression),sizeof(short),1,file);
printf("\n bmp biCompression: %d",bmp.biCompression);
fseek(file,34L,0);//圖像數據區的大小
fwrite(&(bmp.biSizeImage),sizeof(int),1,file);
printf("\n bmp biSizeImage: %d",bmp.biSizeImage);
fseek(file,38L,0);//水平解析度
fwrite(&(bmp.biXPelsPerMeter),sizeof(int),1,file);
printf("\n bmp biXPelsPerMeter: %d",bmp.biXPelsPerMeter);
fseek(file,42L,0);//垂直解析度
fwrite(&(bmp.biYPelsPerMeter),sizeof(int),1,file);
printf("\n bmp biYPelsPerMeter: %d",bmp.biYPelsPerMeter);
fseek(file,46L,0);//顏色索引數
fwrite(&(bmp.biClrUsed),sizeof(int),1,file);
printf("\n bmp biClrUsed: %d",bmp.biClrUsed);
fseek(file,50L,0);//重要顏色索引數
fwrite(&(bmp.biClrImportant),sizeof(int),1,file);
printf("\n bmp biClrImportant: %d\n",bmp.biClrImportant);
fseek(file,(long)(bmp.bfOffBits),0);
fwrite(imagedata,sizeof(unsigned char),bmp.biSizeImage,file);
fclose(file);
}
//pixProcess.c文件
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include"image.h"
//灰度化
void image_gray()
{
int i,j;
unsigned char tmp;
for (i=0;i<bmp.biHeight;i++)
{
for (j=0;j<line_byte/3;j++)
{
tmp=0.11*(*(imagedata+i*line_byte+j*3+0))+0.59*(*(imagedata+i*line_byte+j*3+1))+0.3*(*(imagedata+i*line_byte+j*3+2));
imagedata[i*line_byte+j*3+0]=tmp;
imagedata[i*line_byte+j*3+1]=tmp;
imagedata[i*line_byte+j*3+2]=tmp;
//printf("\nnidsfh%d %d",i,j);
}
}
}
//二值化
void image_binarization()
{
int i,j;
for (i=0;i<bmp.biHeight;i++)
{
for (j=0;j<line_byte;j++)
{
if ((*(imagedata+i*line_byte+j))<128)
{
imagedata[i*line_byte+j]=0;
}
else
{
imagedata[i*line_byte+j]=255;
}
}
}
}
void image_opposite() //反相
{
int i,j;
for (i=0;i<bmp.biHeight;i++)
{
for (j=0;j<line_byte;j++)
{
imagedata[i*line_byte+j]=abs(255-imagedata[i*line_byte+j]);
}
}
}
void image_channel() //抽取RGB通道
{
int i,j;
char rgb;
printf("\nplease enter a char(r/g/b): ");
fflush(stdin);
scanf("%c",&rgb);
if (rgb=='b')
{
for (i=0;i<bmp.biHeight;i++)
{
for (j=0;j<line_byte/3;j++)
{
imagedata[i*line_byte+3*j+1]=0;
imagedata[i*line_byte+3*j+2]=0;
}
}
}
else if(rgb=='g')
{
for (i=0;i<bmp.biHeight;i++)
{
for (j=0;j<line_byte/3;j++)
{
imagedata[i*line_byte+3*j]=0;
imagedata[i*line_byte+3*j+2]=0;
}
}
}
else
{
for (i=0;i<bmp.biHeight;i++)
{
for (j=0;j<line_byte/3;j++)
{
imagedata[i*line_byte+3*j]=0;
imagedata[i*line_byte+3*j+1]=0;
}
}
}
}
void image_bright()//改變圖像亮度
{
int level;
int i,j;
printf("\n please enter the level of brightness[-255 to 255] :");
fflush(stdin);
scanf("%d",&level);
for (i=0;i<bmp.biHeight;i++)
{
for (j=0;j<line_byte;j++)
{
if (level>=0)
{
if ((imagedata[i*line_byte+j]+level)>255)
imagedata[i*line_byte+j]=255;
else
imagedata[i*line_byte+j]+=level;
}
else
{
if ((imagedata[i*line_byte+j]-abs(level))<0)
imagedata[i*line_byte+j]=0;
else
imagedata[i*line_byte+j]+=level;
}
}
}
}
//void image_create() //創建一幅24位BMP圖像文件。
//{
//main.c文件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include"image.h"
BMP bmp;
int main()
{
FILE *file=NULL;
int choose;
char gono;
do
{
image_info(file); //imagedata已經分配了動態內存,但是沒有釋放
printf("\n 1.image_opposite");
printf("\n 2.image_gray");
printf("\n 3.image_binarization");
printf("\n 4.image_channel");
printf("\n 5.image_brightness");
//printf("6.image_opposite");
//printf("7.image_opposite");
printf("\nchoose your options:");
fflush(stdin);
scanf("%d",&choose);
switch(choose)
{
case 1:
image_opposite();
image_save(file);
free(imagedata);
break;
case 2:
image_gray();
image_save(file);
free(imagedata);
break;
case 3:
image_binarization();
image_save(file);
free(imagedata);
break;
case 4:
image_channel();
image_save(file);
free(imagedata);
break;
case 5:
image_bright();
image_save(file);
free(imagedata);
break;
default:
printf("\n wrong choose!");
}
printf("\nlet's go on?(y/n):");
fflush(stdin);
scanf("%c",&gono);
if (gono=='n')
{
printf("\nbye bye!");
break;
}
}
while(1);
return 0;
}
Ⅵ Windows下用C語言如何獲取屏幕當前的解析度
#include<windows.h>
直接調用windows API函數GetSysTemMetrics()
參數參考MSDN,可以獲得屏幕H方向和V方向的像素
Ⅶ 如何用c語言編寫圖形操作的軟體呢
學MFC吧~~你的困惑一下子就會解除的~~~
用純C語言編帶界面的也不是不可能~~就是要用到WINDOWS API~~給你一段代碼試試吧~~是我做的一個OPENGL的程序~~~在VISUAL STUDIO.NET 2003下編譯通過~~代碼如下~~
#define WM_TOGGLEFULLSCREEN (WM_USER+1) // 定義全屏/窗口切換消息
#define TIMER1 101 // 定義時鍾代號,設置為101號
#define TITLE "5DG'S Color Shading" // 定義窗口標題
#define CLASSNAME "5DG_OPENGL" // 定義窗口類名
#define WIDTH 640 // 定義窗口寬度
#define HEIGHT 480 // 定義窗口高度
#define BPP 16 // 定義每象素的位數
#define NUM 200 // 定義繪制圓時用的頂點數(用頂點組成的線段逼近圓)
// 在此處引用程序要求的頭文件:
#include <windows.h> // Windows的頭文件
#include <gl\gl.h> // OpenGL32庫的頭文件
#include <gl\glu.h> // Glu32庫的頭文件
#include <math.h> // 數學函數庫的頭文件
// 在此處加入程序要求的庫到鏈接器中:
#pragma comment(lib, "opengl32.lib") // 鏈接時查找OpenGL32.lib
#pragma comment(lib, "glu32.lib") // 鏈接時查找glu32.lib
// 在此處定義與窗口相關的結構體:
typedef struct { // 定義處理鍵盤的結構體
BOOL keyDown [256]; // 存儲鍵盤按鍵狀態的數組
} Keys;
typedef struct { // 定義存儲應用程序實例的結構體
HINSTANCE hInstance; // 應用程序實例
const char* className; // 應用程序類名
} Application;
typedef struct { // 定義初始化窗口所需信息
Application* application; // 所屬的應用程序
char* title; // 窗口標題
int width; // 窗口寬度
int height; // 窗口高度
int bitsPerPixel; // 每像素的位數
BOOL isFullScreen; // 是否全屏
} GL_WindowInit;
typedef struct { // 定義窗口結構體
Keys* keys; // 鍵盤
HWND hWnd; // 窗口句柄
HDC hDC; // 設備描述表
HGLRC hRC; // 繪制描述表
GL_WindowInit init; // 提供Window初始化信息的結構體
} GL_Window;
// 此代碼模塊中包含的函數的前向聲明:
BOOL Initialize(GL_Window* window, Keys* keys); // 設置你繪制前的初始化值
void DrawSceneGL(void); // 在這里完成場景的繪制
void Update(void); // 在此處更新對消息的動作
void Deinitialize(void); // 在此處做退出前掃尾工作
// 在此處定義全局變數:
GL_Window* OGL_window; // 存儲窗口信息
Keys* OGL_keys; // 存儲按鍵信息
// 在此處定義用戶變數:
void ResizeWindowGL(int width, int height) // 重新設置窗口大小
{
glViewport(0, 0, (GLsizei)(width), (GLsizei)(height)); // 重置當前視口大小
glMatrixMode(GL_PROJECTION); // 切換到投影矩陣模式
glLoadIdentity(); // 重置投影矩陣
gluPerspective(45, (float)width/(float)height, 0.1, 100); // 設置透視投影
glMatrixMode(GL_MODELVIEW); // 切換到模型視圖矩陣
glLoadIdentity(); // 重置模型視圖矩陣
}
BOOL ChangeScreenResolution(int width, int height, int bitsPerPixel) // 修改屏幕解析度
{
DEVMODE dmScreenSettings; // 設備設置模式
ZeroMemory(&dmScreenSettings, sizeof(DEVMODE)); // 清空
dmScreenSettings.dmSize = sizeof(DEVMODE); // Devmode結構的大小
dmScreenSettings.dmPelsWidth = width; // 設置為屏幕寬度
dmScreenSettings.dmPelsHeight = height; // 設置為屏幕高度
dmScreenSettings.dmBitsPerPel = bitsPerPixel; // 設為指定位長;
dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
// 嘗試設置顯示模式並返回結果。注: CDS_FULLSCREEN 移去了狀態欄
if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
{
return FALSE; // 解析度修改失敗,返回 False
}
return TRUE; // 解析度修改成功,返回 True;
}
BOOL CreateWindowGL(GL_Window* window) // 建立OpenGL窗口
{
DWORD windowStyle = WS_OVERLAPPEDWINDOW; // 設置窗口樣式
DWORD windowExtendedStyle = WS_EX_APPWINDOW; // 設置窗口擴展樣式
PIXELFORMATDESCRIPTOR pfd = // 像素格式描述符(pfd)的設置
{
sizeof(PIXELFORMATDESCRIPTOR), // 像素的尺寸
1, // 版本號
PFD_DRAW_TO_WINDOW | // pfd必須支持窗口繪制
PFD_SUPPORT_OPENGL | // pfd必須支持OpenGL
PFD_DOUBLEBUFFER, // pfd必須支持雙緩存
PFD_TYPE_RGBA, // 像素格式為RGBA
window->init.bitsPerPixel, // 設置顏色深度
0, 0, 0, 0, 0, 0, // 忽略顏色位數
0, // 無Alpha緩存
0, // 忽略偏移位
0, // 無累積緩存
0, 0, 0, 0, // 忽略累積緩存位
16, // 深度緩存為16位
0, // 無模板緩存
0, // 無輔助緩存
PFD_MAIN_PLANE, // 主要繪制層
0, // 保留位
0, 0, 0 // 忽略層遮罩
};
RECT windowRect = {0, 0, window->init.width, window->init.height}; // 定義窗口大小
GLuint PixelFormat; // 保存像素格式
if (window->init.isFullScreen == TRUE) // 切換全屏
{
if (ChangeScreenResolution(window->init.width, window->init.height, window->init.bitsPerPixel) == FALSE)
{
// 全屏切換失敗
MessageBox(HWND_DESKTOP, "無法切換到全屏模式,在窗口模式下運行.\nMode Switch Failed,Running In Windowed Mode.", "Error", MB_OK | MB_ICONEXCLAMATION);
window->init.isFullScreen = FALSE; // 設置 isFullscreen 為False
}
else // 全屏切換成功
{
ShowCursor (FALSE); // 隱藏滑鼠
windowStyle = WS_POPUP; // 設置窗口樣式
windowExtendedStyle |= WS_EX_TOPMOST; // 設置窗口擴展樣式
}
}
else
{
// 調整窗口大小,包括窗口邊界
AdjustWindowRectEx(&windowRect, windowStyle, 0, windowExtendedStyle);
}
// 開始創建 OpenGL 窗口
window->hWnd = CreateWindowEx(windowExtendedStyle, // 窗口擴展樣式
window->init.application->className,// 應用程序類名
window->init.title, // 窗口標題
windowStyle, // 窗口樣式
0, 0, // 窗口的 X,Y 坐標位置
windowRect.right - windowRect.left, // 窗口寬度
windowRect.bottom - windowRect.top, // 窗口高度
HWND_DESKTOP, // 父窗口為桌面
0, // 無菜單
window->init.application->hInstance,// 傳入應用程序實例
window);
if (window->hWnd == 0) // 窗口是否成功創建
{
return FALSE; // 若失敗,則返回FALSE
}
window->hDC = GetDC(window->hWnd); // 取得當前窗口的設備描述表
if (window->hDC == 0) // 若未得到設備描述表
{
DestroyWindow(window->hWnd); // 銷毀該窗口
window->hWnd = 0; // 窗口句柄清零
return FALSE; // 返回FALSE
}
PixelFormat = ChoosePixelFormat(window->hDC, &pfd); // 選擇兼容的像素格式
if (PixelFormat == 0) // 若選擇失敗
{
ReleaseDC(window->hWnd, window->hDC); // 釋放設備描述表
window->hDC = 0; // 將設備描述表清零
DestroyWindow(window->hWnd); // 銷毀窗口
window->hWnd = 0; // 窗口句柄清零
return FALSE; // 返回FALSE
}
if (SetPixelFormat(window->hDC, PixelFormat, &pfd) == FALSE) // 設置像素格式並判斷是否失敗
{
ReleaseDC(window->hWnd, window->hDC); // 釋放設備描述表
window->hDC = 0; // 將設備描述表清零
DestroyWindow(window->hWnd); // 銷毀窗口
window->hWnd = 0; // 窗口句柄清零
return FALSE; // 返回FALSE
}
window->hRC = wglCreateContext(window->hDC); // 取得繪制描述表
if (window->hRC == 0) // 若未得到繪制描述表
{
ReleaseDC(window->hWnd, window->hDC); // 釋放設備描述表
window->hDC = 0; // 將設備描述表清零
DestroyWindow(window->hWnd); // 銷毀窗口
window->hWnd = 0; // 窗口句柄清零
return FALSE; // 返回FALSE
}
if (wglMakeCurrent(window->hDC, window->hRC) == FALSE) // 設置繪制描述表並判斷是否失敗
{
wglDeleteContext(window->hRC); // 刪除繪制描述表
window->hRC = 0; // 將繪制描述表清零
ReleaseDC(window->hWnd, window->hDC); // 釋放設備描述表
window->hDC = 0; // 將設備描述表清零
DestroyWindow(window->hWnd); // 銷毀窗口
window->hWnd = 0; // 窗口句柄清零
return FALSE; // 返回FALSE
}
ShowWindow(window->hWnd, SW_NORMAL); // 顯示窗口
ResizeWindowGL(window->init.width, window->init.height); // 重設窗口
ZeroMemory(window->keys, sizeof (Keys)); // 清空鍵盤緩沖區
return TRUE; // 窗口創建成功
}
BOOL DestroyWindowGL(GL_Window* window) // 銷毀窗口並釋放程序所用的資源
{
if (window->hWnd != 0) // 窗口釋放有句柄?
{
if (window->hDC != 0) // 窗口是否有得到繪制描述表?
{
wglMakeCurrent(window->hDC, 0); // 將當前描述表指針置為0
if (window->hRC != 0) // 該窗口是否有繪制描述表
{
wglDeleteContext(window->hRC); // 釋放繪制描述表
window->hRC = 0; // 將繪制描述表清零
}
ReleaseDC(window->hWnd, window->hDC); // 釋放設備描述表
window->hDC = 0; // 將設備描述表清零
}
DestroyWindow(window->hWnd); // 銷毀窗口
window->hWnd = 0; // 將窗口句柄清零
}
if (window->init.isFullScreen) // 若窗口在全屏模式下
{
ChangeDisplaySettings(NULL ,0); // 切換為桌面解析度
ShowCursor(TRUE); // 顯示滑鼠
}
return TRUE; // 返回TRUE
}
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)// 窗口消息處理
{
GL_Window* window = (GL_Window*)(GetWindowLong(hWnd, GWL_USERDATA));// 取得窗口信息
switch (uMsg) // 取得Window的消息
{
case WM_SYSCOMMAND: // 截取系統命令
{
switch (wParam) // 監聽系統調用
{
case SC_SCREENSAVE: // 要運行屏保?
case SC_MONITORPOWER: // 顯示器進入節電模式?
return 0; // 提前返回0,防止系統調用執行
}
break; // 退出
}
case WM_CREATE: // 創建窗口
{
CREATESTRUCT* creation = (CREATESTRUCT*)(lParam); // 保存窗口結構指針
window = (GL_Window*)(creation->lpCreateParams);
SetWindowLong(hWnd, GWL_USERDATA, (LONG)(window)); // 改變窗口屬性
return 0; // 返回
}
case WM_TIMER: // TIMER事件
{
InvalidateRect(window->hWnd, NULL, FALSE); // 使窗口失效
break;
}
case WM_PAINT: // PAINT消息處理,在此處繪圖
{
DrawSceneGL(); // 在此處繪圖
SwapBuffers(window->hDC); // 交換緩存
ValidateRect(window->hWnd, NULL); // 使窗口有效
break;
}
case WM_CLOSE: // 關閉窗口
{
PostMessage(window->hWnd, WM_QUIT, 0, 0); // 結束程序
return 0;
}
case WM_SIZE: // 窗口大小變化
{
ResizeWindowGL(LOWORD(lParam), HIWORD(lParam)); // 修改窗口大小為 Width = LoWord, Height = HiWord
return 0; // 返回
}
case WM_KEYDOWN: // 按鍵按下時更新鍵盤緩沖
if ((wParam >= 0) && (wParam <= 255)) // 按鍵是否合法?
{
window->keys->keyDown[wParam] = TRUE; // 設相應鍵為 True
return 0; // 返回
}
break; // 退出
case WM_KEYUP: // 按鍵松開時更新鍵盤緩沖
if ((wParam >= 0) && (wParam <= 255)) // 按鍵是否合法?
{
window->keys->keyDown[wParam] = FALSE; // 設相應鍵為為 FALSE
return 0; // 返回
}
break; // 退出
case WM_TOGGLEFULLSCREEN: // 開關全屏模式
{
Deinitialize(); // 做掃尾工作
DestroyWindowGL(window); // 銷毀窗口
window->init.isFullScreen = !window->init.isFullScreen; // 改變窗口模式
CreateWindowGL(window); // 重新創建窗口
Initialize(window, window->keys); // 初始化OpenGL繪製程序
break; // 退出
}
default:
break;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam); // 將本程序不處理的消息傳給 DefWindowProc
}
BOOL RegisterWindowClass(Application* application) // 為本應用程序注冊一個類
{
WNDCLASSEX windowClass; // 窗口類
ZeroMemory (&windowClass, sizeof(WNDCLASSEX)); // 清空內存
windowClass.cbSize = sizeof(WNDCLASSEX); // 窗口類的大小
windowClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // 在窗口移動,改變大小的時候重繪
windowClass.lpfnWndProc = (WNDPROC)(WindowProc); // 用WindowProc函數處理消息
windowClass.hInstance = application->hInstance; // 設置實例
windowClass.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE); // 類背景的畫刷顏色
windowClass.hCursor = LoadCursor(NULL, IDC_ARROW); // 載入滑鼠指針
windowClass.lpszClassName = application->className; // 設置應用程序的類名
if (RegisterClassEx(&windowClass) == 0) // 注冊類失敗?
{
MessageBox(HWND_DESKTOP, "應用程序類注冊失敗!\nRegisterClassEx Failed!", "Error", MB_OK | MB_ICONEXCLAMATION);
return FALSE; // 返回False (注冊失敗)
}
return TRUE; // 返回True (注冊成功)
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
Application application; // 應用程序
GL_Window window; // 窗口
Keys keys; // 鍵盤按鍵
MSG msg; // Window消息
BOOL bRet; // 保存消息獲得是否成功
// 給應用程序賦值
application.className = CLASSNAME; // 程序類名字
application.hInstance = hInstance; // 程序入口
// 窗口相關信息設置
ZeroMemory(&window, sizeof(GL_Window)); // 清零窗口變數的內存空間
window.keys = &keys; // 設置按鍵
window.init.application = &application; // 設置窗口程序
window.init.title = TITLE; // 設置標題
window.init.width = WIDTH; // 設置窗口寬度
window.init.height = HEIGHT; // 設置窗口高度
window.init.bitsPerPixel = BPP; // 設置每像素的位數
window.init.isFullScreen = FALSE; // 設置初始窗口是否全屏否(FALSE)
ZeroMemory(&keys, sizeof(Keys)); // 鍵盤緩沖清零
if (RegisterWindowClass(&application) == FALSE) // 注冊類是否失敗
{
MessageBox(HWND_DESKTOP, "窗口類注冊失敗!\nError Registering Window Class!", "Error", MB_OK | MB_ICONEXCLAMATION);
return -1; // 結束程序
}
if (CreateWindowGL(&window) == TRUE) // 創建窗口是否成功
{
if (Initialize(&window, &keys) == FALSE) // 初始化OpenGL繪製程序
{
PostMessage(window.hWnd, WM_QUIT, 0, 0); // 拋出消息WM_QUIT
}
}
else
{
return 0; // 退出程序
}
while ((bRet = GetMessage(&msg, NULL, 0, 0) != 0)) // 循環直到收到消息為WM_QUIT
{
if (bRet != -1)
{
Update(); // 更新處理消息事件
TranslateMessage(&msg); // 傳遞消息
DispatchMessage(&msg); // 分派消息
}
else
{
break; // 退出循環
}
}
// 退出消息循環,准備退出程序
Deinitialize(); // 做退出前的掃尾工作
DestroyWindowGL(&window); // 銷毀窗口
UnregisterClass(application.className, application.hInstance); // 注銷窗口類
return 0; // 退出程序
}
BOOL Initialize(GL_Window* window, Keys* keys) // 用戶繪制場景相關的函數在此處定義
{
// 設置全局變數
OGL_window = window;
OGL_keys = keys;
// 建立時鍾
SetTimer(window->hWnd, TIMER1, 33, NULL);
// 在此處初始化繪制場景
glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // 清屏為黑色
glClearDepth(1.0f); // 設置深度緩存
glDepthFunc(GL_LEQUAL); // 選擇深度測試方式
glEnable(GL_DEPTH_TEST); // 開啟深度測試
glShadeModel(GL_SMOOTH); // 陰暗處理採用平滑方式
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 最精細的透視計算
return TRUE; // 初始化成功返回TRUE
}
void DrawSceneGL(void) // 繪制場景
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除顏色和深度緩存
glLoadIdentity(); // 重置當前矩陣
//在此處添加代碼進行繪制:
glShadeModel(GL_SMOOTH); // 陰暗處理採用平滑方式(Smooth Shading)
glTranslatef(-1.5f, 1.0f, -6.0f); // 坐標原點往左移1.5f,往上移1.0f,往內移6.0f
glBegin(GL_TRIANGLES); // 開始繪制一個三角形
glColor3ub(255, 0, 0); // 定義上頂點為紅色
glVertex3f(0.0f, 1.0f, 0.0f); // 繪制上頂點
glColor3ub(0, 255, 0); // 定義左下頂點為綠色
glVertex3f( -1.0f, -1.0f, 0.0f); // 繪制左下頂點
glColor3ub(255, 255, 0); // 定義右下頂點為黃色
glVertex3f(1.0f, -1.0f, 0.0f); // 繪制右下頂點
glEnd();
glTranslatef(3.0f, 0.0f, 0.0f); // 向右平移3.0f
glColor3ub(0, 255, 255); // 定義正方形的顏色
glBegin(GL_QUADS); // 開始繪制一個正方形
glVertex3f(-1.0f, 1.0f, 0.0f); // 繪制左上角頂點
glVertex3f(-1.0f,-1.0f, 0.0f); // 繪制左下角頂點
glVertex3f( 1.0f,-1.0f, 0.0f); // 繪制右下角頂點
glVertex3f( 1.0f, 1.0f, 0.0f); // 繪制右上角頂點
glEnd();
glTranslatef(-1.5f, -2.0f, 0.0f); // 向左移1.5f,向下移2.0f
glColor3f(0.0f, 0.8f, 0.2f); // 綠色
glBegin(GL_LINE_LOOP); // 繪制圓
for (int i=0; i<NUM; i++)
{
glVertex3f(1.5f*(float)sin(2.0f*3.14f*i/NUM), 0.0f, 1.5f*(float)cos(2.0f*3.14f*i/NUM));
}
glEnd();
glFlush(); // 刷新GL命令隊列
}
void Update(void) // 在此處更新對消息的動作
{
if (OGL_keys->keyDown[VK_ESCAPE] == TRUE) // 判斷ESC鍵是否按下
{
PostMessage(OGL_window->hWnd, WM_QUIT, 0, 0); // 結束程序
}
if (OGL_keys->keyDown[VK_F1] == TRUE) // 判斷F1是否按下
{
PostMessage(OGL_window->hWnd, WM_TOGGLEFULLSCREEN, 0, 0); // 在全屏/窗口模式間切換
}
}
void Deinitialize(void) // 在此處做退出前掃尾工作
{
KillTimer(OGL_window->hWnd, TIMER1); // 釋放時鍾
}
Ⅷ c語言 圖形函數
圖形函數 1. 圖形模式的初始化
不同的顯示器適配器有不同的圖形解析度。即是同一顯示器適配器, 在不同
模式下也有不同解析度。因此, 在屏幕作圖之前, 必須根據顯示器適配器種類將
顯示器設置成為某種圖形模式, 在未設置圖形模式之前, 微機系統默認屏幕為文
本模式(80列, 25行字元模式), 此時所有圖形函數均不能工作。設置屏幕為圖形
模式, 可用下列圖形初始化函數:
void far initgraph(int far *gdriver, int far *gmode, char *path);
其中gdriver和gmode分別表示圖形驅動器和模式, path是指圖形驅動程序所
在的目錄路徑。有關圖形驅動器、圖形模式的符號常數及對應的解析度見表2。
圖形驅動程序由Turbo C出版商提供, 文件擴展名為.BGI。根據不同的圖形
適配器有不同的圖形驅動程序。例如對於EGA、 VGA 圖形適配器就調用驅動程序
EGAVGA.BGI。 例4. 使用圖形初始化函數設置VGA高解析度圖形模式
#include <graphics.h>
int main()
{
int gdriver, gmode;
gdriver=VGA;
gmode=VGAHI;
initgraph(&gdriver, &gmode, "c:\\tc");
bar3d(100, 100, 300, 250, 50, 1); /*畫一長方體*/
getch();
closegraph();
return 0;
}
有時編程者並不知道所用的圖形顯示器適配器種類, 或者需要將編寫的程序
用於不同圖形驅動器, Turbo C提供了一個自動檢測顯示器硬體的函數, 其調用
格式為:
void far detectgraph(int *gdriver, *gmode);
其中gdriver和gmode的意義與上面相同。
例5. 自動進行硬體測試後進行圖形初始化
#include <graphics.h>
int main()
{
int gdriver, gmode;
detectgraph(&gdriver, &gmode); /*自動測試硬體*/
printf("the graphics driver is %d, mode is %d\n", gdriver,
gmode); /*輸出測試結果*/
getch();
initgraph(&gdriver, &gmode, "c:\\tc");
/* 根據測試結果初始化圖形*/
bar3d(10, 10, 130, 250, 20, 1);
getch();
closegraph();
return 0;
}
上常式序中先對圖形顯示器自動檢測, 然後再用圖形初始化函數進行初始化
設置, 但Turbo C提供了一種更簡單的方法, 即用gdriver= DETECT 語句後再跟
initgraph()函數就行了。採用這種方法後, 上例可改為:
例6.
#include <graphics.h>
int main()
{
int gdriver=DETECT, gmode;
initgraph(&gdriver, &gmode, "c:\\tc");
bar3d(50, 50, 150, 30, 1);
getch();
closegraph();
return 0;
}
另外, Turbo C提供了退出圖形狀態的函數closegraph(), 其調用格式為:
void far closegraph(void);
調用該函數後可退出圖形狀態而進入文本方式(Turbo C 默認方式), 並釋放
用於保存圖形驅動程序和字體的系統內存。
2. 獨立圖形運行程序的建立
Turbo C對於用initgraph()函數直接進行的圖形初始化程序, 在編譯和鏈接
時並沒有將相應的驅動程序(*.BGI)裝入到執行程序, 當程序進行到intitgraph()
語句時, 再從該函數中第三個形式參數char *path中所規定的路徑中去找相應的
驅動程序。若沒有驅動程序, 則在C:\TC中去找, 如C:\TC中仍沒有或TC不存在,
將會出現錯誤:
BGI Error: Graphics not initialized (use 'initgraph')
因此, 為了使用方便, 應該建立一個不需要驅動程序就能獨立運行的可執行
圖形程序,Turbo C中規定用下述步驟(這里以EGA、VGA顯示器為例):
1. 在C:\TC子目錄下輸入命令:BGIOBJ EGAVGA
此命令將驅動程序EGAVGA.BGI轉換成EGAVGA.OBJ的目標文件。
2. 在C:\TC子目錄下輸入命令:TLIB LIB\GRAPHICS.LIB+EGAVGA
此命令的意思是將EGAVGA.OBJ的目標模塊裝到GRAPHICS.LIB庫文件中。
3. 在程序中initgraph()函數調用之前加上一句:
registerbgidriver(EGAVGA_driver):
該函數告訴連接程序在連接時把EGAVGA的驅動程序裝入到用戶的執行程序中。
經過上面處理,編譯鏈接後的執行程序可在任何目錄或其它兼容機上運行。
假設已作了前兩個步驟,若再向例6中加 registerbgidriver()函數則變成:
例7:
#include<stdio.h>
#include<graphics.h>
int main()
{
int gdriver=DETECT,gmode;
registerbgidriver(EGAVGA_driver): / *建立獨立圖形運行程序 */
initgraph( gdriver, gmode,"c:\\tc");
bar3d(50,50,250,150,20,1);
getch();
closegraph();
return 0;
}
上例編譯鏈接後產生的執行程序可獨立運行。
如不初始化成EGA或CGA解析度, 而想初始化為CGA解析度, 則只需要將上述
步驟中有EGAVGA的地方用CGA代替即可。
3.屏幕顏色的設置和清屏函數
對於圖形模式的屏幕顏色設置, 同樣分為背景色的設置和前景色的設置。在
Turbo C中分別用下面兩個函數。
設置背景色: void far setbkcolor( int color);
設置作圖色: void far setcolor(int color);
其中color 為圖形方式下顏色的規定數值, 對EGA, VGA顯示器適配器, 有關
顏色的符號常數及數值見下表所示。
表3 有關屏幕顏色的符號常數表
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
符號常數 數值 含義 符號常數 數值 含義
———————————————————————————————————
BLACK 0 黑色 DARKGRAY 8 深灰
BLUE 1 蘭色 LIGHTBLUE 9 深蘭
GREEN 2 綠色 LIGHTGREEN 10 淡綠
CYAN 3 青色 LIGHTCYAN 11 淡青
RED 4 紅色 LIGHTRED 12 淡紅
MAGENTA 5 洋紅 LIGHTMAGENTA 13 淡洋紅
BROWN 6 棕色 YELLOW 14 黃色
LIGHTGRAY 7 淡灰 WHITE 15 白色
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
對於CGA適配器, 背景色可以為表3中16種顏色的一種, 但前景色依賴於不同
的調色板。共有四種調色板, 每種調色板上有四種顏色可供選擇。不同調色板所
對應的原色見表4。
表4 CGA調色板與顏色值表
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
調色板 顏色值
——————————— ——————————————————
符號常數 數值 0 1 2 3
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
C0 0 背景 綠 紅 黃
C1 1 背景 青 洋紅 白
C2 2 背景 淡綠 淡紅 黃
C3 3 背景 淡青 淡洋紅 白
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
清除圖形屏幕內容使用清屏函數, 其調用格式如下:
voide far cleardevice(void);
另外, TURBO C也提供了幾個獲得現行顏色設置情況的函數。
int far getbkcolor(void); 返回現行背景顏色值。
int far getcolor(void); 返回現行作圖顏色值。
int far getmaxcolor(void); 返回最高可用的顏色值。
4. 基本圖形函數
基本圖形函數包括畫點, 線以及其它一些基本圖形的函數。本節對這些函數
作一全面的介紹。
一、畫點
1. 畫點函數
void far putpixel(int x, int y, int color);
該函數表示有指定的象元畫一個按color所確定顏色的點。對於顏色color的
值可從表3中獲得而對x, y是指圖形象元的坐標。
在圖形模式下, 是按象元來定義坐標的。對VGA適配器, 它的最高解析度為
640x480, 其中640為整個屏幕從左到右所有象元的個數, 480 為整個屏幕從上到
下所有象元的個數。屏幕的左上角坐標為(0, 0), 右下角坐標為(639, 479), 水
平方向從左到右為x軸正向, 垂直方向從上到下為y軸正向。TURBO C 的圖形函數
都是相對於圖形屏幕坐標, 即象元來說的。
關於點的另外一個函數是:
int far getpixel(int x, int y);
它獲得當前點(x, y)的顏色值。
2. 有關坐標位置的函數
int far getmaxx(void);
返回x軸的最大值。
int far getmaxy(void);
返回y軸的最大值。
int far getx(void);
返回遊標在x軸的位置。
void far gety(void);
返回遊標有y軸的位置。
void far moveto(int x, int y);
移動游標到(x, y)點, 不是畫點, 在移動過程中亦畫點。
void far moverel(int dx, int dy);
移動游標從現行位置(x, y)移動到(x+dx, y+dy)的位置, 移動過程中不畫點。
二、畫線
1. 畫線函數
TURBO C提供了一系列畫線函數, 下面分別敘述:
void far line(int x0, int y0, int x1, int y1);
畫一條從點(x0, y0)到(x1, y1)的直線。
void far lineto(int x, int y);
畫一作從現行游標到點(x, y)的直線。
void far linerel(int dx, int dy);
畫一條從現行游標(x, y)到按相對增量確定的點(x+dx, y+dy)的直線。
void far circle(int x, int y, int radius);
以(x, y)為圓心, radius為半徑, 畫一個圓。
void far arc(int x, int y, int stangle, int endangle, int radius);
以(x, y)為圓心, radius為半徑, 從stangle開始到endangle結束(用度表示)
畫一段圓弧線。在TURBO C中規定x軸正向為0度, 逆時針方向旋轉一周, 依次為
90, 180, 270和360度(其它有關函數也按此規定, 不再重述)。
void ellipse(int x, int y, int stangle, int endangle, int xradius,
int yradius);
以(x, y)為中心, xradius, yradius為x軸和y軸半徑, 從角stangle 開始到
endangle結束畫一段橢圓線, 當stangle=0, endangle=360時, 畫出一個完整的
橢圓。
void far rectangle(int x1, int y1, int x2, inty2);
以(x1, y1)為左上角, (x2, y2)為右下角畫一個矩形框。
void far drawpoly(int numpoints, int far *polypoints);
畫一個頂點數為numpoints, 各頂點坐標由polypoints 給出的多邊形。
polypoints整型數組必須至少有2倍頂點數個無素。每一個頂點的坐標都定義為x,
y, 並且x在前。值得注意的是當畫一個封閉的多邊形時, numpoints 的值取實際
多邊形的頂點數加一, 並且數組polypoints中第一個和最後一個點的坐標相同。
下面舉一個用drawpoly()函數畫箭頭的例子。
例9:
#include<stdlib.h>
#include<graphics.h>
int main()
{
int gdriver, gmode, i;
int arw[16]={200, 102, 300, 102, 300, 107, 330,
100, 300, 93, 300, 98, 200, 98, 200, 102};
gdriver=DETECT;
registerbgidriver(EGAVGA_driver);
initgraph(&gdriver, &gmode, "");
setbkcolor(BLUE);
cleardevice();
setcolor(12); /*設置作圖顏色*/
drawpoly(8, arw); /*畫一箭頭*/
getch();
closegraph();
return 0;
}
2. 設定線型函數
在沒有對線的特性進行設定之前, TURBO C用其默認值, 即一點寬的實線,
但TURBO C也提供了可以改變線型的函數。線型包括:寬度和形狀。其中寬度只有
兩種選擇: 一點寬和三點寬。而線的形狀則有五種。下面介紹有關線型的設置函
數。
void far setlinestyle(int linestyle, unsigned upattern, int
thickness);
該函數用來設置線的有關信息, 其中linestyle是線形狀的規定, 見表5。
表5. 有關線的形狀(linestyle)
━━━━━━━━━━━━━━━━━━━━━━━━━
符號常數 數值 含義
—————————————————————————
SOLID_LINE 0 實線
DOTTED_LINE 1 點線
CENTER_LINE 2 中心線
DASHED_LINE 3 點畫線
USERBIT_LINE 4 用戶定義線
━━━━━━━━━━━━━━━━━━━━━━━━━
thickness是線的寬度, 見表6。
表6. 有關線寬(thickness)
━━━━━━━━━━━━━━━━━━━━━━━━━
符號常數 數值 含義
—————————————————————————
NORM_WIDTH 1 一點寬
THIC_WIDTH 3 三點寬
━━━━━━━━━━━━━━━━━━━━━━━━━
對於upattern, 只有linestyle選USERBIT_LINE 時才有意義( 選其它線型,
uppattern取0即可)。此進uppattern的16位二進制數的每一位代表一個象元, 如
果那位為1, 則該象元打開, 否則該象元關閉。
void far getlinesettings(struct linesettingstype far *lineinfo);
該函數將有關線的信息存放到由lineinfo 指向的結構中, 表中
linesettingstype的結構如下:
struct linesettingstype{
int linestyle;
unsigned upattern;
int thickness;
}
例如下面兩句程序可以讀出當前線的特性
struct linesettingstype *info;
getlinesettings(info);
void far setwritemode(int mode);
該函數規定畫線的方式。如果mode=0, 則表示畫線時將所畫位置的原來信息
覆蓋了(這是TURBO C的默認方式)。如果mode=1, 則表示畫線時用現在特性的線
與所畫之處原有的線進行異或(XOR)操作, 實際上畫出的線是原有線與現在規定
的線進行異或後的結果。因此, 當線的特性不變, 進行兩次畫線操作相當於沒有
畫線。
有關線型設定和畫線函數的例子如下所示。
例10.
#include<stdlib.h>
#include<graphics.h>
int main()
{
int gdriver, gmode, i;
gdriver=DETECT;
registerbgidriver(EGAVGA_driver);
initgraph(&gdriver, &gmode, "");
setbkcolor(BLUE);
cleardevice();
setcolor(GREEN);
circle(320, 240, 98);
setlinestyle(0, 0, 3); /*設置三點寬實線*/
setcolor(2);
rectangle(220, 140, 420, 340);
setcolor(WHITE);
setlinestyle(4, 0xaaaa, 1); /*設置一點寬用戶定義線*/
line(220, 240, 420, 240);
line(320, 140, 320, 340);
getch();
closegraph();
return 0;
}
5. 封閉圖形的填充
填充就是用規定的顏色和圖模填滿一個封閉圖形。
一、先畫輪廓再填充
TURBO C提供了一些先畫出基本圖形輪廓, 再按規定圖模和顏色填充整個封
閉圖形的函數。在沒有改變填充方式時, TURBO C以默認方式填充。 下面介紹這
些函數。
void far bar(int x1, int y1, int x2, int y2);
確定一個以(x1, y1)為左上角, (x2, y2)為右下角的矩形窗口, 再按規定圖
模和顏色填充。
說明: 此函數不畫出邊框, 所以填充色為邊框。
void far bar3d(int x1, int y1, int x2, int y2, int depth, int
topflag);
當topflag為非0時, 畫出一個三維的長方體。當topflag為0時, 三維圖形不
封頂, 實際上很少這樣使用。
說明: bar3d()函數中, 長方體第三維的方向不隨任何參數而變, 即始終為
45度的方向。
void far pieslice(int x, int y, int stangle, int endangle, int
radius);
畫一個以(x, y)為圓心, radius為半徑, stangle為起始角度, endangle 為
終止角度的扇形, 再按規定方式填充。當stangle=0, endangle=360 時變成一個
實心圓, 並在圓內從圓點沿X軸正向畫一條半徑。
void far sector(int x, int y, int stanle, intendangle, int
xradius, int yradius);
畫一個以(x, y)為圓心分別以xradius, yradius為x軸和y軸半徑, stangle
為起始角, endangle為終止角的橢圓扇形, 再按規定方式填充。
二、設定填充方式
TURBO C有四個與填充方式有關的函數。下面分別介紹:
void far setfillstyle(int pattern, int color);
color的值是當前屏幕圖形模式時顏色的有效值。pattern的值及與其等價的
符號常數 除USER_FILL(用戶定義填充式樣)以外, 其它填充式樣均可由setfillstyle()
函數設置。當選用USER_FILL時, 該函數對填充圖模和顏色不作任何改變。 之所
以定義USER_FILL主要因為在獲得有關填充信息時用到此項。
void far setfillpattern(char * upattern,int color);
設置用戶定義的填充圖模的顏色以供對封閉圖形填充。
其中upattern是一個指向8個位元組的指針。這8個位元組定義了8x8點陣的圖形。
每個位元組的8位二進制數表示水平8點, 8個位元組表示8行, 然後以此為模型向個封
閉區域填充。
void far getfillpattern(char * upattern);
該函數將用戶定義的填充圖模存入upattern指針指向的內存區域。
void far getfillsetings(struct fillsettingstype far * fillinfo);
獲得現行圖模的顏色並將存入結構指針變數fillinfo中。其中fillsettingstype
結構定義如下:
struct fillsettingstype{
int pattern; /* 現行填充模式 * /
int color; /* 現行填充模式 * /
};
三、任意封閉圖形的填充
截止目前為止, 我們只能對一些特定形狀的封閉圖形進行填充, 但還不能對
任意封閉圖形進行填充。為此, TURBO C 提供了一個可對任意封閉圖形填充的函
數, 其調用格式如下:
void far floodfill(int x, int y, int border);
其中: x, y為封閉圖形內的任意一點。border為邊界的顏色, 也就是封閉圖
形輪廓的顏色。調用了該函數後, 將用規定的顏色和圖模填滿整個封閉圖形。例12:
#include<stdlib.h>
#include<graphics.h>
main()
{
int gdriver, gmode;
strct fillsettingstype save;
gdriver=DETECT;
initgraph(&gdriver, &gmode, "");
setbkcolor(BLUE);
cleardevice();
setcolor(LIGHTRED);
setlinestyle(0,0,3);
setfillstyle(1,14); /*設置填充方式*/
bar3d(100,200,400,350,200,1); /*畫長方體並填充*/
floodfill(450,300,LIGHTRED); /*填充長方體另外兩個面*/
floodfill(250,150, LIGHTRED);
rectanle(450,400,500,450); /*畫一矩形*/
floodfill(470,420, LIGHTRED); /*填充矩形*/
getch();
closegraph();
}
6. 有關圖形窗口和圖形屏幕操作函數
一、圖形窗口操作
象文本方式下可以設定屏幕窗口一樣, 圖形方式下也可以在屏幕上某一區域
設定窗口, 只是設定的為圖形窗口而已, 其後的有關圖形操作都將以這個窗口的
左上角(0,0)作為坐標原點, 而且可為通過設置使窗口之外的區域為不可接觸。
這樣, 所有的圖形操作就被限定在窗口內進行。
void far setviewport(int xl,int yl,int x2, int y2,int clipflag);
設定一個以(xl,yl)象元點為左上角, (x2,y2)象元為右下角的圖形窗口, 其
中x1,y1,x2,y2是相對於整個屏幕的坐標。若clipflag為非0, 則設定的圖形以外
部分不可接觸, 若clipflag為0, 則圖形窗口以外可以接觸。
void far clearviewport(void);
清除現行圖形窗口的內容。
void far getviewsettings(struct viewporttype far * viewport);
獲得關於現行窗口的信息,並將其存於viewporttype定義的結構變數viewport
中, 其中viewporttype的結構說明如下:
struct viewporttype{
int left, top, right, bottom;
int cliplag;
};
二、屏幕操作
除了清屏函數以外, 關於屏幕操作還有以下函數:
void far setactivepage(int pagenum);
void far setvisualpage(int pagenum);
這兩個函數只用於EGA,VGA 以及HERCULES圖形適配器。setctivepage() 函數
是為圖形輸出選擇激活頁。 所謂激活頁是指後續圖形的輸出被寫到函數選定的
pagenum頁面, 該頁面並不一定可見。setvisualpage()函數才使pagenum 所指定
的頁面變成可見頁。頁面從0開始(Turbo C默認頁)。如果先用setactivepage()
函數在不同頁面上畫出一幅幅圖像,再用setvisualpage()函數交替顯示, 就可以
實現一些動畫的效果。
void far getimage(int xl,int yl, int x2,int y2, void far *mapbuf);
void far putimge(int x,int,y,void * mapbuf, int op);
unsined far imagesize(int xl,int yl,int x2,int y2);
這三個函數用於將屏幕上的圖像復制到內存,然後再將內存中的圖像送回到
屏幕上。首先通過函數imagesize()測試要保存左上角為(xl,yl), 右上角為(x2,
y2)的圖形屏幕區域內的全部內容需多少個位元組, 然後再給mapbuf 分配一個所測
數位元組內存空間的指針。通過調用getimage()函數就可將該區域內的圖像保存在
內存中, 需要時可用putimage()函數將該圖像輸出到左上角為點(x, y)的位置上,
其中getimage()函數中的參數op規定如何釋放內存中圖像。
對於imagesize()函數, 只能返回位元組數小於64K位元組的圖像區域, 否則將會
出錯, 出錯時返回-1。
本節介紹的函數在圖像動畫處理、菜單設計技巧中非常有用。
例13: 下面程序模擬兩個小球動態碰撞過程。
7. 圖形模式下的文本輸出
在圖形模式下, 只能用標准輸出函數, 如printf(), puts(), putchar() 函
數輸出文本到屏幕。除此之外, 其它輸出函數(如窗口輸出函數)不能使用, 即是
可以輸出的標准函數, 也只以前景色為白色, 按80列, 25行的文本方式輸出。
Turbo C2.0也提供了一些專門用於在圖形顯示模式下的文本輸出函數。下面
將分別進行介紹。
一、文本輸出函數
void far outtext(char far *textstring);
該函數輸出字元串指針textstring所指的文本在現行位置。
void far outtextxy(int x, int y, char far *textstring);
該函數輸出字元串指針textstring所指的文本在規定的(x, y)位置。 其中x
和y為象元坐標。
說明:
這兩個函數都是輸出字元串, 但經常會遇到輸出數值或其它類型的數據,
此時就必須使用格式化輸出函數sprintf()。
sprintf()函數的調用格式為:
int sprintf(char *str, char *format, variable-list);
它與printf()函數不同之處是將按格式化規定的內容寫入str 指向的字元串
中, 返回值等於寫入的字元個數。
例如:
sprintf(s, "your TOEFL score is %d", mark);
這里s應是字元串指針或數組, mark為整型變數。
Ⅸ 小弟是C語言新手,有個問題,就是當程序運行時窗口的大小怎麼調整
在彈出的命令行窗口標題欄上右擊,選屬性,選布局選項卡,調整窗口大小的數值,點確定。
如果有提示在哪些窗口使用這些設置,就選所有窗口