c圖像處理編程
❶ C語言中,圖像處理函數的使用
Tc中用initgraph()函數可以切換到圖形模式,用closegraph()可以從圖形模式切換回字元模式。
initgraph()和closegraph()都是圖形函數,使用圖形函數必須包括頭文件"graphics.h"。
void far i nitgraph(int far *graphdriver, int far *graphmode,char far *pathtodriver);
graphdriver是指向圖形驅動序號變數的指針,
graphmode是在graphdriver選定後,指向圖形顯示模式序號變數的指針,
pathtodriver表示存放圖形驅動文件的路徑。
圖形驅動序號不同,圖形驅動文件也不同。序號為VGA圖形驅動對應"egavga.bgi"這個圖形驅動文件。
"egavga.bgi"一般在 Tc目錄下
例如:
-------
#include <graphics.h>
int Drive,Mode=DETECT;
initgraph(&Drive,&Mode,""); //圖形顯示器、顯示模式、路徑自動檢測
運行時需要在當前目錄下存在 EGAVGA.BGI文件
在TC\BGI目錄底下
-------
如果編譯後的.exe文件在另外一個目錄(如編譯後的.exe文件在D:\MyTc 目錄下,而編譯器的程序和.BGI文件在C:\Turboc\bin 目錄下,則需要填上BGI文件的路徑
例如:
initgraph(&Drive,&Mode,"C:\\Turboc\\bgi");
❷ 如何編寫C語言圖形程序
一、打開C程序的方法
方法1.在Turbo C for Windows 集成實驗與學習環境中,依次用滑鼠單擊「文件/打開」菜單(用滑鼠單擊「工具欄」中的「打開」按鈕,打開「打開」對話框,選者你要打開的文件,然後單擊「打開」即可。
圖 1 打開文件
方法2 在Turbo C for Windows 集成實驗與學習環境中的「我的程序」下用滑鼠雙擊你要打開的C程序即可(此處列出最近使用的8個文件)
圖 2 在「我的程序」中打開程序
方法3在Turbo C for Windows 集成實驗與學習環境中,依次用滑鼠單擊「文件/我的程序」菜單,打開「我的程序」對話框,選者你要打開的文件,然後單擊「打開」即可
圖 3
方法 4 在「我的電腦」中打開C程序。在我的電腦」中找到你的程序所在的文件夾,用滑鼠雙擊你要打開圖標中帶「C」的程序即可。
在「我的電腦」中打開C程序
二、新建C程序的方法
注意:C語言的初學者往往在一個C程序文件中輸入幾個C程序,這是錯誤的。一個C程序只能保存在一個文件中。輸入第二程序時必須再新建一個文件來輸入保存。
方法1 Turbo C for Windows 集成實驗與學習環境中,依次用滑鼠單擊「文件/新建」菜單,即可新建一個空白C文件。
❸ 用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,可是說下怎麼做,首先打開一個BMP文件,然後按照bmp格式解析到一個數組中,接著進行二值化(這個有很多方法),最後將數組中的數據寫入一個新的BMP文件就可以了。