⑴ 純c語言實現圖像處理
這個不難吧?雖然我不用c,可是說下怎麼做,首先打開一個BMP文件,然後按照bmp格式解析到一個數組中,接著進行二值化(這個有很多方法),最後將數組中的數據寫入一個新的BMP文件就可以了。
⑵ 基於圖像處理程序設計
下面程序模擬兩個小球動態碰撞過程。
#include<conio.h>
#include<stdio.h>
#include<graphics.h>
int main()
{
int i, gdriver, gmode, size;
void *buf;
gdriver=DETECT;
initgraph(&gdriver, &gmode, "");/*初始化圖形驅動*/
setbkcolor(BLUE);/*設置背景為藍色*/
cleardevice();
setcolor(LIGHTRED);/*設置作圖色為洋紅*/
setlinestyle(0,0,1);/*設置線型*/
setfillstyle(1, 10); /*設置填充類型*/
circle(100, 200, 30);/*畫圓*/
floodfill(100, 200, 12); /*填充*/
size=imagesize(69, 169, 131, 231);
buf=malloc(size);
getimage(69, 169, 131, 231,buf);
putimage(500, 269, buf, COPY_PUT);
for(i=0; i<185; i++){
putimage(70+i, 170, buf, COPY_PUT);
putimage(500-i, 170, buf, COPY_PUT);
}
for(i=0;i<185; i++){
putimage(255-i, 170, buf, COPY_PUT);
putimage(315+i, 170, buf, COPY_PUT);
}
getch();
closegraph();
}
⑶ C語言圖像處理方法
1.圖像平移
圖像平移只是改變圖像在屏幕上的位置,圖像本身並不發生變化。
假設原圖像區域左上角坐標為(x0,y0),右下角坐標為(x1,y1),將圖像分別沿x和y軸平移dx和dy,則新圖像的左上角坐標為(x0+dx,y0+dy),右下角坐標為(x1+dx,y1+dy)。
在屏幕上實現圖像的移動分為四個步驟:
⑴保存原圖像到緩沖區。
⑵擦除原圖像。
⑶計算平移後的新坐標。
⑷在新的坐標位置重新顯示原圖像。
2.圖像顛倒
圖像顛倒是指把定義好的圖像區域上下翻轉地顯示在屏幕上。分析圖像顛倒的過程,可發現每行的圖像信息都保持不變,而只是改變了行的順序,將第一行與最後的第n行相互交換,第二行與第n-1行交換??,依此類推,從而實現了圖像的顛倒。只需採用按行交換的方式,即可方便地修改緩沖區內容,實現圖像的顛倒。
3.圖像鏡像變換
鏡像變換是指將指定區域的圖像左右翻轉地顯示在屏幕。分析鏡像變換過程可以發現:每行圖像信息的處理方式是相同的,而且行順序不發生變化,只是每一行的像素信息按從左到右的順序進行了左右顛倒,從而實現了鏡像變換。因此,採用按行逐點變換的方式實現圖像的鏡像。
4.圖像旋轉
圖像旋轉是指把定義的圖像繞某一點以逆時針或順時針方向旋轉一定的角度,雲南電腦培訓http://www.kmbdqn.cn/認為通常是指繞圖像的中心以逆時針方向旋轉。
⑷ c語言簡單圖像處理,補全程序 謝謝大家
天哪、輸入我的程序要干什麼?
⑸ c語言圖像處理
c語言不自帶圖形處理方面的東西。TC特有的頭文件graphics.h,其他編譯環境都用不了,可移植性是零。而且TC實在太老,與現在c語言標准差距非常大。基本是無法運行現在的代碼。所以不太建議你用它。
非要用純c,可以自己寫函數調用WindowsAP和GUI介面。而且需要包含windows.h頭文件。
網上有個大神用c—free寫的代碼在附件里。
/*
純C通過WindowsAPI編寫的基本Windows圖形界面
整理加原創,基本上每一句代碼都有注釋
通過C-Free3.5編譯
*/
#include<string.h>//這個頭文件在擴展名為.c時是不需要加的
#include<windows.h>//windowsapi必須包含的頭文件
LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);//窗口函數的前向聲明
//參數說明:
//HINSTANCEhInstance當前實例句柄
//HINSTANCEhPrevInstance以前版本的遺留產物,現在總是置為NULL
//LPSTRlpCmdLine命令行的產生,可以從開始->獲得程序運行的參數,由此傳入
//intnCmdShow程序最初的顯示模式,正常,最大化或最小化
//主函數的入口是WinMain,類型為int
//WINAPI標志是一種特定的調用,它定義了一種生成機器代碼和放置函數參數的方式
intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpcmdLine,intnCmdShow)
{
//TCHAR,TEXT都是統一單位元組和雙位元組字元的類型,建議使用
staticTCHARszAppName[]=TEXT("MyFirstWindows");
staticTCHARszClassName[]=TEXT("MFWClass");
HWNDhwnd;//一定一個窗口句柄
MSGmsg;//定義一個消息結構體
WNDCLASSwndclass;//定義一個WNDCLASS結構用於注冊窗口
wndclass.style=CS_HREDRAW|CS_VREDRAW;//窗口類的類風格,每當水平和垂直大小改變時完全刷新窗口
wndclass.lpfnWndProc=WndProc;//此窗口類所使用的窗口函數的入口地址
wndclass.cbClsExtra=0;//用於在類結構中預留一些額外的空間
wndclass.cbWndExtra=0;//用於在windows內部保存的窗口結構中預留一些額外的空間
wndclass.hInstance=hInstance;//指定所在程序的實例句柄
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//定製圖標
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);//定製滑鼠圖形
wndclass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);//定義背景顏色
wndclass.lpszMenuName=NULL;//指定窗口類的菜單
wndclass.lpszClassName=szClassName;//指定窗口類的類名
//注冊窗口,參數為指向WNDCLASS結構的指針
//如果注冊不成功,則彈出一個對話框說明情況
//MessageBox是僅有的可以在舊版本和新版本windows都可以運行的對話框
if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("!"),szAppName,MB_ICONERROR);
return0;
}
//創建窗口
hwnd=CreateWindow(
szClassName,//窗口類的名稱
TEXT("Title:MyFirstWindowsProgram.這里是標題"),//窗口標題
//WS_OVERLAPPEDWINDOW,//窗口顯示風格,這行實際是一個預定義,相當於下面的集合,可以單獨設置
WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX|WS_MAXIMIZEBOX,
CW_USEDEFAULT,//初始x方向的位置
CW_USEDEFAULT,//初始y方向的位置
CW_USEDEFAULT,//初始x方向的大小
CW_USEDEFAULT,//初始y方向的大小
NULL,//父窗口句柄
NULL,//菜單句柄
hInstance,//程序實例句柄
NULL);//創建參數
//顯示窗口,第一個參數hwnd是CreateWindow所創建的窗口的句柄
//第二個參數nCmdShow是主函數給的,由快捷方式獲得
ShowWindow(hwnd,nCmdShow);
//刷新窗口,給窗口函數,在本程序中即WndProc發送一個WM_PAINT
UpdateWindow(hwnd);
//消息循環
while(GetMessage(&msg,NULL,0,0))//接受自己創建的所有窗口的所有消息
{
TranslateMessage(&msg);//將msg結構體傳給windows以進行一些鍵盤轉換,即將擊鍵消息轉換為字元消息
DispatchMessage(&msg);//再次將msg結構體傳給windows,由windows將該消息發送給適當的窗口函數
}
return(int)msg.wParam;
}
//窗口函數
//參數說明:
//HWNDhwnd,接受消息的窗口句柄,由CreateWindow函數返回
//UINTmessage,消息標志符,用以標識消息,每個消息均有一個唯一對應的消息標識符
//WPARAMwParam,是WORDPARAM的意思,一個32位的消息參數,其含義和數值根據消息的不同而不同
//LPARAMlParam,是LONGPARAM的意思,一個32位的消息參數,其值和消息有關
//CALLBACK函數指由程序員定義,編程實現,而由windows系統調用的函數
LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam)
{
HDChdc;//定義一個設備描述表句柄結構體
//定義一個PAINTSTRUCT的繪制信息結構體,
//其包含了包含了當前無效矩形區域的坐標和其他信息,用於刷新用戶區的內容
PAINTSTRUCTps;
RECTrect;//定義一個RECT結構體,其有left,top,right,bottom四個域
//處理傳進的各種消息
switch(message)
{
//窗口創建
caseWM_CREATE:MessageBox(NULL,"MessageContent:ThisisWM_CREATE,這是WM_CREATE。",
"MessageTiTle這是對話框的標題",MB_OK);
return0;
//窗口繪制
caseWM_PAINT:hdc=BeginPaint(hwnd,&ps);//由BeginPaint開始,返回設備描述表以開始繪圖
GetClientRect(hwnd,&rect);//獲取用戶區域的大小
//格式話文本輸出
DrawText(hdc,TEXT("WindowsContent:Iamadeveloper.我為計算機而生。"),
-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
EndPaint(hwnd,&ps);//以EndPaint結束,釋放設備描述表句柄
return0;
//窗口消亡
caseWM_DESTROY:MessageBox(NULL,"MessageContent:ThisisWM_DESTROY,這是WM_DESTROY。",
"MessageTiTle這是對話框的標題",MB_OK);
PostQuitMessage(0);
return0;
}
//凡是窗口函數不予處理的消息應交由windows默認消息處理函數DefWindowProc處理
returnDefWindowProc(hwnd,message,wParam,lParam);
}
⑹ c語言處理圖像文件
opencv做圖像處理比較專業,用純C語言的話處理bmp圖像比較方便,因為信息是直接按位元組存儲的,其他格式因為有壓縮的問題,比較麻煩,我以前寫過一個處理bmp的程序,如果你要的話可以網路hi聯系我,或者留下郵箱發給你。
⑺ 用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語言圖像處理方法
1.圖像平移
圖像平移只是改變圖像在屏幕上的位置,圖像本身並不發生變化。
假設原圖像區域左上角坐標為(x0, y0),右下角坐標為(x1, y1),將圖像分別沿x和y軸平移dx和dy,則新圖像的左上角坐標為(x0 +dx, y0+dy),右下角坐標為(x1+dx, y1+dy)。
在屏幕上實現圖像的移動分為四個步驟:
⑴ 保存原圖像到緩沖區。
⑵ 擦除原圖像。
⑶ 計算平移後的新坐標。
⑷ 在新的坐標位置重新顯示原圖像。
2.圖像顛倒
圖像顛倒是指把定義好的圖像區域上下翻轉地顯示在屏幕上。分析圖像顛倒的過程,可發現每行的圖像信息都保持不變,而只是改變了行的順序,將第一行與最後的第n行相互交換,第二行與第n-1行交換,依此類推,從而實現了圖像的顛倒。只需採用按行交換的方式,即可方便地修改緩沖區內容,實現圖像的顛倒。
3.圖像鏡像變換
鏡像變換是指將指定區域的圖像左右翻轉地顯示在屏幕。分析鏡像變換過程可以發現:每行圖像信息的處理方式是相同的,而且行順序不發生變化,只是每一行的像素信息按從左到右的順序進行了左右顛倒,從而實現了鏡像變換。因此,採用按行逐點變換的方式實現圖像的鏡像。
4.圖像旋轉
圖像旋轉是指把定義的圖像繞某一點以逆時針或順時針方向旋轉一定的角度,雲南電腦培訓http://www.kmbdqn.com/認為 通常是指繞圖像的中心以逆時針方向旋轉。
⑼ 求一個有關圖像處理的C語言程序
int blacknum=0;
char str1[128];
typedef int (WINAPI ICEPUB_GETIMGBLACKS)(char *strImgFilename);
ICEPUB_GETIMGBLACKS *icePub_getImgfileBlacks = 0;
HINSTANCE hDLLDrv = LoadLibrary("icePubDll.dll");
if(hDLLDrv)
{
icePub_getImgfileBlacks=(ICEPUB_GETIMGBLACKS *)GetProcAddress(hDLLDrv,"icePub_getImgfileBlacks");
}
if(icePub_getImgfileBlacks)
{
blacknum = icePub_getImgfileBlacks("e:\a.jpg");
}
if(hDLLDrv)
FreeLibrary(hDLLDrv);
sprintf(str1,"blacknum=%d",blacknum);
AfxMessageBox(str1);
http://dl.icese.net/dev.php?f=icePubDll.rar 下載