當前位置:首頁 » 編程語言 » c語言圖的實現

c語言圖的實現

發布時間: 2022-07-14 23:03:05

❶ 如何利用c語言實現像素圖形的輸出

1、可以變成灰度圖也可以不變。這里假設你的圖像都是IPL_DEPTH_8U類型。

2、如果變成灰度圖,就是單通道圖像,獲取的就是每一個像素點的灰度值。
IplImage* img = cvLoadImage("test.bmp", 0);
for (int i = 0; i < img->height; i++)
{
for (int j = 0; j < img->width; j++)
{
//方法一:使用cvGet2D()函數間接訪問
CvScalar s = cvGet2D(img, i, j); //其中i代表y軸(第i行),即height;j代表x軸(第j列),即width。
printf("gray value=%f\n",s.val[0]);

//方法二:使用直接訪問
uchar val = ((uchar *)(img->imageData + i*img->widthStep))[j]; //i和j的意義同上
printf("gray value=%d\n",val);
}
}

3、如果不變成灰度圖,就是3通道圖像,獲取的就是每一個像素點的BGR值,然後分別獲取B值,G值和R值。
IplImage* img = cvLoadImage("test.bmp", 1);
for (int i = 0; i < img->height; i++)
{
for (int j = 0; j < img->width; j++)
{
//方法一:使用cvGet2D()函數間接訪問
CvScalar s=cvGet2D(img,i,j); //其中i代表y軸(第i行),即height;j代表x軸(第j列),即width。
printf("B=%f, G=%f, R=%f\n",s.val[0],s.val[1],s.val[2]); //注意是BGR順序

//方法二:使用直接訪問
int bVal = ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]; // B
int gVal = ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]; // G
int rVal = ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]; // R
printf("B=%d, G=%d, R=%d\n",bVal,gVal,rVal); //注意是BGR順序
}
}

❷ 請問下c語言如何實現插入圖片功能

  1. C語言寫控制台程序是無法加圖片的,只能用命令行輸出,最多就是設置下背景和字體,顏色之類的。如果開發API窗口程序,完全依賴於操作系統的函數庫。C語言本身並不提供這類函數。

  2. 下面是windows系統下實現的函數代碼,第一個參數是圖片的存放的位置,第二個參數是窗口句柄。

  3. HRESULTShowPic(char*lpstrFile,HWNDhWnd)
    {
    HDChDC_Temp=GetDC(hWnd);
    IPicture*pPic;
    IStream*pStm;
    BOOLbResult;
    HANDLEhFile=NULL;
    DWORDdwFileSize,dwByteRead;
    //打開圖形文件
    hFile=CreateFile(lpstrFile,GENERIC_READ,
    FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    if(hFile!=INVALID_HANDLE_VALUE)
    {
    dwFileSize=GetFileSize(hFile,NULL);//獲取文件位元組數
    if(dwFileSize==0xFFFFFFFF)
    returnE_FAIL;
    }
    else
    {
    returnE_FAIL;
    }
    //分配全局存儲空間
    HGLOBALhGlobal=GlobalAlloc(GMEM_MOVEABLE,dwFileSize);
    LPVOIDpvData=NULL;
    if(hGlobal==NULL)
    returnE_FAIL;
    if((pvData=GlobalLock(hGlobal))==NULL)//鎖定分配內存塊
    returnE_FAIL;
    ReadFile(hFile,pvData,dwFileSize,&dwByteRead,NULL);//把文件讀入內存緩沖區
    GlobalUnlock(hGlobal);
    CreateStreamOnHGlobal(hGlobal,TRUE,&pStm);
    //裝入圖形文件
    bResult=OleLoadPicture(pStm,dwFileSize,TRUE,IID_IPicture,(LPVOID*)&pPic);
    if(FAILED(bResult))
    returnE_FAIL;
    OLE_XSIZE_HIMETRIChmWidth;//圖片的真實寬度,單位為英寸
    OLE_YSIZE_HIMETRIChmHeight;//圖片的真實高度,單位為英寸
    pPic->get_Width(&hmWidth);
    pPic->get_Height(&hmHeight);
    //轉換hmWidth和hmHeight為pixels距離,1英寸=25.4毫米
    intnWidth=MulDiv(hmWidth,GetDeviceCaps(hDC_Temp,LOGPIXELSX),2540);
    intnHeight=MulDiv(hmHeight,GetDeviceCaps(hDC_Temp,LOGPIXELSY),2540);
    //將圖形輸出到屏幕上(有點像BitBlt)
    bResult=pPic->Render(hDC_Temp,0,0,nWidth,nHeight,0,hmHeight,hmWidth,-hmHeight,NULL);
    hmHeight,NULL);
    pPic->Release();
    CloseHandle(hFile);//關閉打開的文件
    if(SUCCEEDED(bResult))
    {
    returnS_OK;
    }
    else
    {
    returnE_FAIL;
    }
    }

❸ c語言編程實現如下圖形

#include <stdio.h>

#include <stdlib.h>

#define N (6)

int main()

{

int i;

for(i=-N+1;i<N;++i)

printf("%*.*s ",N+abs(i),N-abs(i),"****************************");

return 0;

}

❹ 用C語言編程實現圖的遍歷演算法

圖的遍歷是指按某條搜索路徑訪問圖中每個結點,使得每個結點均被訪問一次,而且僅被訪問一次。圖的遍歷有深度遍歷演算法和廣度遍歷演算法,最近阿傑做了關於圖的遍歷的演算法,下面是圖的遍歷深度優先的演算法(C語言程序):
#include<stdio.h>
#include<malloc.h>
#define MaxVertexNum 5
#define m 5
#define TRUE 1
#define NULL 0
typedef struct node
{
int adjvex;
struct node *next;
}JD;
typedef struct EdgeNode
{
int vexdata;
JD *firstarc;
}TD;
typedef struct
{
TD ag[m];
int n;
}ALGRAPH;
void DFS(ALGRAPH *G,int i)
{
JD *p;
int visited[80];
printf("visit vertex:%d->",G->ag[i].vexdata);
visited[i]=1;
p=G->ag[i].firstarc;
while(p)
{
if (!visited[p->adjvex])
DFS(G,p->adjvex);
p=p->next;
}
}
void creat(ALGRAPH *G)
{
int i,m1,j;
JD *p,*p1;
printf("please input the number of graph\n");
scanf("%d",&G->n);
for(i=0;i<G->n;i++)
{
printf("please input the info of node %d",i);
scanf("%d",&G->ag[i].vexdata);
printf("please input the number of arcs which adj to %d",i);
scanf("%d",&m1);
printf("please input the adjvex position of the first arc\n");
p=(JD *)malloc(sizeof(JD));
scanf("%d",&p->adjvex);
p->next=NULL;
G->ag[i].firstarc=p;
p1=p;
for(j=2 ;j<=m1;j++)
{
printf("please input the position of the next arc vexdata\n");
p=(JD *)malloc(sizeof(JD));
scanf("%d",&p->adjvex);
p->next=NULL;
p1->next=p;
p1=p;
}
}
}
int visited[MaxVertexNum];
void DFSTraverse(ALGRAPH *G)
{
int i;
for(i=0;i<G->n;i++)
visited[i]=0;
for(i=0;i<G->n;i++)
if(!visited[i])
DFS(G,i);
}
int main()
{
ALGRAPH *G;
printf("下面以臨接表存儲一個圖;\n");
creat(G);
printf("下面以深度優先遍歷該圖 \n");
DFSTraverse(G);
getchar();
}

❺ C語言圖形界面怎麼做出來

這是最簡單的界面程序://c++.cpp:定義應用程序的入口點。

//

#include"stdafx.h"

#include"c++.h"

#defineMAX_LOADSTRING100

//全局變數:

HINSTANCEhInst; //當前實例

TCHARszTitle[MAX_LOADSTRING]; //標題欄文本

TCHARszWindowClass[MAX_LOADSTRING]; //主窗口類名

//此代碼模塊中包含的函數的前向聲明:

ATOM MyRegisterClass(HINSTANCEhInstance);

BOOL InitInstance(HINSTANCE,int);

LRESULTCALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

INT_PTRCALLBACK About(HWND,UINT,WPARAM,LPARAM);

intAPIENTRY_tWinMain(HINSTANCEhInstance,

HINSTANCEhPrevInstance,

LPTSTRlpCmdLine,

intnCmdShow)

{

UNREFERENCED_PARAMETER(hPrevInstance);

UNREFERENCED_PARAMETER(lpCmdLine);

//TODO:在此放置代碼。

MSGmsg;

HACCELhAccelTable;

//初始化全局字元串

LoadString(hInstance,IDS_APP_TITLE,szTitle,MAX_LOADSTRING);

LoadString(hInstance,IDC_C,szWindowClass,MAX_LOADSTRING);

MyRegisterClass(hInstance);

//執行應用程序初始化:

if(!InitInstance(hInstance,nCmdShow))

{

returnFALSE;

}

hAccelTable=LoadAccelerators(hInstance,MAKEINTRESOURCE(IDC_C));

//主消息循環:

while(GetMessage(&msg,NULL,0,0))

{

if(!TranslateAccelerator(msg.hwnd,hAccelTable,&msg))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

return(int)msg.wParam;

}

//

//函數:MyRegisterClass()

//

//目的:注冊窗口類。

//

//注釋:

//

//僅當希望

//此代碼與添加到Windows95中的「RegisterClassEx」

//函數之前的Win32系統兼容時,才需要此函數及其用法。調用此函數十分重要,

//這樣應用程序就可以獲得關聯的

//「格式正確的」小圖標。

//

ATOMMyRegisterClass(HINSTANCEhInstance)

{

WNDCLASSEXwcex;

wcex.cbSize=sizeof(WNDCLASSEX);

wcex.style =CS_HREDRAW|CS_VREDRAW;

wcex.lpfnWndProc =WndProc;

wcex.cbClsExtra =0;

wcex.cbWndExtra =0;

wcex.hInstance =hInstance;

wcex.hIcon =LoadIcon(hInstance,MAKEINTRESOURCE(IDI_C));

wcex.hCursor =LoadCursor(NULL,IDC_ARROW);

wcex.hbrBackground =(HBRUSH)(COLOR_WINDOW+1);

wcex.lpszMenuName =MAKEINTRESOURCE(IDC_C);

wcex.lpszClassName =szWindowClass;

wcex.hIconSm =LoadIcon(wcex.hInstance,MAKEINTRESOURCE(IDI_SMALL));

returnRegisterClassEx(&wcex);

}

//

//函數:InitInstance(HINSTANCE,int)

//

//目的:保存實例句柄並創建主窗口

//

//注釋:

//

//在此函數中,我們在全局變數中保存實例句柄並

//創建和顯示主程序窗口。

//

BOOLInitInstance(HINSTANCEhInstance,intnCmdShow)

{

HWNDhWnd;

hInst=hInstance;//將實例句柄存儲在全局變數中

hWnd=CreateWindow(szWindowClass,szTitle,WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL);

if(!hWnd)

{

returnFALSE;

}

ShowWindow(hWnd,nCmdShow);

UpdateWindow(hWnd);

returnTRUE;

}

//

//函數:WndProc(HWND,UINT,WPARAM,LPARAM)

//

//目的:處理主窗口的消息。

//

//WM_COMMAND -處理應用程序菜單

//WM_PAINT -繪制主窗口

//WM_DESTROY -發送退出消息並返回

//

//

LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)

{

intwmId,wmEvent;

PAINTSTRUCTps;

HDChdc;

switch(message)

{

caseWM_COMMAND:

wmId=LOWORD(wParam);

wmEvent=HIWORD(wParam);

//分析菜單選擇:

switch(wmId)

{

caseIDM_ABOUT:

DialogBox(hInst,MAKEINTRESOURCE(IDD_ABOUTBOX),hWnd,About);

break;

caseIDM_EXIT:

DestroyWindow(hWnd);

break;

default:

returnDefWindowProc(hWnd,message,wParam,lParam);

}

break;

caseWM_PAINT:

hdc=BeginPaint(hWnd,&ps);

//TODO:在此添加任意繪圖代碼...

EndPaint(hWnd,&ps);

break;

caseWM_DESTROY:

PostQuitMessage(0);

break;

default:

returnDefWindowProc(hWnd,message,wParam,lParam);

}

return0;

}

//「關於」框的消息處理程序。

INT_PTRCALLBACKAbout(HWNDhDlg,UINTmessage,WPARAMwParam,LPARAMlParam)

{

UNREFERENCED_PARAMETER(lParam);

switch(message)

{

caseWM_INITDIALOG:

return(INT_PTR)TRUE;

caseWM_COMMAND:

if(LOWORD(wParam)==IDOK||LOWORD(wParam)==IDCANCEL)

{

EndDialog(hDlg,LOWORD(wParam));

return(INT_PTR)TRUE;

}

break;

}

return(INT_PTR)FALSE;

}

❻ C語言怎樣實現圖中的功能,按任意鍵到第二張圖

在主函數中先調用函數繪制第一個界面,然後在該函數後面加上getch();語句,再在getch()語句後調用繪制第二個界面的函數即可。實現的原理是:getch()語句將屏幕停留在當前的視圖,並等待用戶按鍵,一旦按鍵之後,系統就會執行getch()語句之後的一條語句,此時,系統會執行第二個繪制界面的函數,即可完成所需功能

❼ c語言編程如何實現圖形化

這要看你所使用的系統平台,圖形化編程與系統平台息息相關

對於C語言來說,有許多成熟的框架。比如Windows上可使用Windows的系統API,linux下有GTK,嵌入式環境下有miniGUI等。

C語言是一門比較特殊的語言,雖然也是高級編程語言的一種,但是為了和其他語言區分開來,部分人也會將C語言稱作中級語言,主要是因為C語言不是面向對象的語言,並且有指針這樣的利器可以直接對底層以及硬體進行操作。

正是因為C語言不是面向對象的語言,在圖形化這樣更偏上層的應用中,一般會使用C++替代C語言,這樣能極大的降低開發的工作量。
比如,Windows下可使用MFC,WPF也支持C++。Linux下一般用跨平台的QT(可在Windows/MAC等多種平台運行)。嵌入式環境下有嵌入式的QT版本。

❽ C語言如何畫圖

framebuffer(幀緩沖)。
幀的最低數量為24(人肉眼可見)(低於24則感覺到畫面不流暢)。
顯卡與幀的關系:由cpu調節其數據傳輸速率來輸出其三基色的配比。
三基色:RGB(紅綠藍)。

在沒有桌面和圖形文件的系統界面,可以通過C語言的編程來實現在黑色背景上畫圖!

用下面的代碼,在需要的地方(有注釋)適當修改,就能畫出自己喜歡的圖形!

PS:同樣要編譯運行後才能出效果。

  • #include <stdio.h>

  • #include <sys/mman.h>

  • #include <fcntl.h>

  • #include <linux/fb.h>

  • #include <stdlib.h>

  • #define RGB888(r,g,b) ((r & 0xff) <<16 | (g & 0xff) << 8 | (b & 0xff))

  • #define RGB565(r,g,b) ((r & 0x1f) <<11 | (g & 0x3f) << 5 | (b & 0x1f))

  • int main()

  • {

  • int fd = open("/dev/fb0", O_RDWR);

  • if(fd < 0){

  • perror("open err. ");

  • exit(EXIT_FAILURE);

printf("xres: %d ", info.xres);

printf("yres: %d ", info.yres);

printf("bits_per_pixel: %d ", info.bits_per_pixel);

size_t len = info.xres*info.yres*info.bits_per_pixel >> 3;

unsigned long* addr = NULL;

addr = mmap(NULL, len, PROT_WRITE|PROT_READ, MAP_SHARED, fd, 0);

if(addr == (void*)-1){

perror("mmap err. ");

熱點內容
ubuntupython文件 發布:2024-05-21 09:41:01 瀏覽:160
java後端介面 發布:2024-05-21 09:40:59 瀏覽:930
豪華尊貴分別對應哪些配置 發布:2024-05-21 09:40:56 瀏覽:620
逗號幫手體驗密碼是多少 發布:2024-05-21 09:31:44 瀏覽:130
vb資料庫excel 發布:2024-05-21 09:18:57 瀏覽:319
資本論第一卷中央編譯局 發布:2024-05-21 09:06:21 瀏覽:67
我的世界多人游戲伺服器有哪些 發布:2024-05-21 09:02:48 瀏覽:590
社保計算編程 發布:2024-05-21 08:52:49 瀏覽:530
船用空氣壓縮機 發布:2024-05-21 08:49:11 瀏覽:186
oppo怎麼查密碼是多少 發布:2024-05-21 08:48:28 瀏覽:140