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. \n”);
exit(EXIT_FAILURE);
printf(“xres: %d\n”, info.xres);
printf(“yres: %d\n”, info.yres);
printf(“bits_per_pixel: %d\n”, 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. \n”);
怎样用C语言显示一张jpg的图片呢
可以用函数OleLoadPicture从包含有图像数据的流中装载图像。
具体实现代码如下:
//在显示图像之前,首先要获取到图像文件的存放路径,这里采用标准的文件打开对话框来选取图像文件,文件名存放在CString型的变量m_sPath中:
CFileDialog dlg(TRUE,”jpg”,”*.jpg”,
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
“JPEG文件(*.jpg)|*.jpg|GIF文件(*.gif)|*.gif||”,NULL);
if(dlg.DoModal()==IDOK)
{
m_sPath=dlg.GetPathName();
Invalidate();
}
//为简单计,图形显示的代码直接在视类中的OnDraw中编写,首先打开文件并判断文件的可用性,并把文件内容放到流接口IStream的对象pStm中:
IStream *pStm;
CFileStatus fstatus;
CFile file;
LONG cb;
……
if (file.Open(m_Path,CFile::modeRead)file.GetStatus(m_Path,fstatus) ((cb = fstatus.m_size) != -1))
{
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
LPVOID pvData = NULL;
if (hGlobal != NULL)
{
if ((pvData = GlobalLock(hGlobal)) != NULL)
{
file.ReadHuge(pvData, cb);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, pStm);
}
}
}
//然后,就直接调用OleLoadPicture函数从流中装载图像:
IPicture *pPic;
……
OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)pPic));
//由于该函数有时会导致失败,所以应当用SUCCEEDED宏来做一些适当的保护工作,只有在数据装载成功的前提下才能继续下面的图像显示工作:
if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)pPic)))
{
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
pPic->get_Width(hmWidth);
pPic->get_Height(hmHeight);
double fX,fY;
……
fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);
fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);
if(FAILED(pPic->Render(*pDC,0,0,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))
AfxMessageBox(“渲染图像失败!”);
pPic->Release();
}
else
AfxMessageBox(“从流中装载图像失败!”);
//其中,显示工作主要是由IPicture接口对象的Render函数来完成的,该函数主要用来将图片的指定部分画到指定的设备环境的指定位置。
原型如下:
HRESULT Render( HDC hdc, //渲染图像用的设备环境句柄
long x, //在hdc上的水平坐标
long y, //在hdc上的垂直坐标
long cx, //图像宽度
long cy, //图像高度
OLE_XPOS_HIMETRIC xSrc, //在源图像上的水平偏移
OLE_YPOS_HIMETRIC ySrc, //在源图像上的垂直偏移
OLE_XSIZE_HIMETRIC cxSrc,//在源图像上水平拷贝的数量
OLE_YSIZE_HIMETRIC cySrc,//在源图像上垂直拷贝的数量
LPCRECT prcWBounds //指向目标图元设备环境句柄的指针);
C语言编程 图的创建与遍历
在C语言编程中,图的创建和遍历:
#includestdio.h
#define N 20
#define TRUE 1
#define FALSE 0
int visited[N];
typedef struct /*队列的定义*/
{
int data[N];
int front,rear;
}queue;
typedef struct /*图的邻接矩阵*/
{
int vexnum,arcnum;
char vexs[N];
int arcs[N][N];
}
graph;
void createGraph(graph *g); /*建立一个无向图的邻接矩阵*/
void dfs(int i,graph *g); /*从第i个顶点出发深度优先搜索*/
void tdfs(graph *g); /*深度优先搜索整个图*/
void bfs(int k,graph *g); /*从第k个顶点广度优先搜索*/
void tbfs(graph *g); /*广度优先搜索整个图*/
void init_visit(); /*初始化访问标识数组*/
void createGraph(graph *g) /*建立一个无向图的邻接矩阵*/
{ int i,j;
char v;
g-vexnum=0;
g-arcnum=0;
i=0;
printf(“输入顶点序列(以#结束):
“);
while((v=getchar())!=’#’)
{
g-vexs[i]=v; /*读入顶点信息*/
i++;
}
g-vexnum=i; /*顶点数目*/
for(i=0;ig-vexnum;i++) /*邻接矩阵初始化*/
for(j=0;jg-vexnum;j++)
g-arcs[i][j]=0;
printf(“输入边的信息:
“);
scanf(“%d,%d”,i,j); /*读入边i,j*/
while(i!=-1) /*读入i,j为-1时结束*/
{
g-arcs[i][j]=1;
g-arcs[j][i]=1;
scanf(“%d,%d”,i,j);
}
}
void dfs(int i,graph *g) /*从第i个顶点出发深度优先搜索*/
{
int j;
printf(“%c”,g-vexs[i]);
visited[i]=TRUE;
for(j=0;jg-vexnum;j++)
if((g-arcs[i][j]==1)(!visited[j]))
dfs(j,g);
}
void tdfs(graph *g) /*深度优先搜索整个图*/
{
int i;
printf(“
从顶点%C开始深度优先搜索序列:”,g-vexs[0]);
for(i=0;ig-vexnum;i++)
if(visited[i]!=TRUE)
dfs(i,g);
}
void bfs(int k,graph *g) /*从第k个顶点广度优先搜索*/
{
int i,j;
queue qlist,*q;
q=qlist;
q-rear=0;
q-front=0;
printf(“%c”,g-vexs[k]);
visited[k]=TRUE;
q-data[q-rear]=k;
q-rear=(q-rear+1)%N;
while(q-rear!=q-front)
{
i=q-data[q-front];
q-front=(q-front+1)%N;
for(j=0;jg-vexnum;j++)
if((g-arcs[i][j]==1)(!visited[j]))
{
printf(“%c”,g-vexs[j]);
visited[j]=TRUE;
q-data[q-rear]=j;
q-rear=(q-rear+1)%N;
}
}
}
void tbfs(graph *g) /*广度优先搜索整个图*/
{
int i;
printf(“
从顶点%C开始广度优先搜索序列:”,g-vexs[0]);
for(i=0;ig-vexnum;i++)
if(visited[i]!=TRUE)
bfs(i,g);
printf(“
“);
}
void init_visit() /*初始化访问标识数组*/
{
int i;
for(i=0;iN;i++)
visited[i]=FALSE;
}
int main()
{
graph ga;
int i,j;
createGraph(ga);
printf(“无向图的邻接矩阵:
“);
for(i=0;iga.vexnum;i++)
{
for(j=0;jga.vexnum;j++)
printf(“%3d”,ga.arcs[i][j]);
printf(“
“);
}
init_visit();
tdfs(ga);
init_visit();
tbfs(ga);
return 0;
}
C语言编程,顾名思义,就是用C语言来进行计算机编程工作。
C语言是国际上广泛流行的,很有发展前途的计算机高级语言.它适合作为系统描述语言,即可用来编写系统软件,也可用来编写应用软件.
C语言是一种引用广泛,并且实现灵活的一种计算机编程语言,用C语言编出来的程序,可以在很多平台上运行,可移植性强。具体的C语言编程内容请参加C或者C++等。
图 (c语言)
我来做,等等
/*编写无向图的邻接矩阵类AdjMWGraph,实现无向图的广度遍历和深度遍历。
其中,图中顶点数据类型为字符。Input第一行图中顶点的个数n(4=n=26)
第二行是图中边的条数m(3=m=351) 第三行是顶点信息(全为大写字母)
后面的输入数据是依附于一条边的两个顶点,有多少条边,就输入多少组信息。
注意:根结点都为A;并且所给字符连续,也就是说A B C D ……。
Output广度优先搜索序列。 深度优先搜索序列。
Sample Input
7
6
A B C D E F G
A B
A C
B D
B E
C F
C G
Sample Output
A B C D E F G
A B D E C F G
*/
#include stdio.h#include stdlib.h
unsigned char arrMap[26][26] = {0};
int nV = 0;
void deep_prior_scan(int j);
void spread_prior_scan(int j);
void GetResult()
{
int nL = 0;//存储边数
int i;
char arrV[26] = {0};
char temp, pairV[2];
//输入过程
printf(“\n请输入顶点数:”);
scanf(“%d”, nV);
printf(“\n请输入边数:”);
scanf(“%d”, nL);
printf(“\n请依次输入顶点:\n”);
for (i = 0, temp = ‘A’; i nV; )
{
temp = getchar();
if (temp = ‘A’ temp = ‘Z’)
{
arrV[i++] = temp;
}
}
printf(“\n请依次输入边:\n”);
for (i = 0; i nL*2; )
{
temp = getchar();
if (temp = ‘A’ temp = ‘Z’)
{
pairV[i%2] = temp;
if (i%2 == 1)
{
arrMap[pairV[0] – ‘A’][pairV[1] – ‘A’] = 1;
}
++i;
}
}
//printf(“\n广度优先遍历:\n”);
//spread_prior_scan(0);
//printf(“\n”);
printf(“\n深度优先遍历:\n”);
deep_prior_scan(0);
printf(“\n”);
}
int main()
{
GetResult();
system(“pause”);
return 0;
}
void deep_prior_scan(int j)
{
int i;
printf(“%c “, j + ‘A’);
for (i = 0; i nV; i++)
{
if (arrMap[j][i] != 0)
{
arrMap[j][i] = 0;
deep_prior_scan(i);
}
}
}
void spread_prior_scan(int j)
{
int i;
if (j == 0)
{
printf(“\nA “);
}
if (j = 26)
{
printf(“\nj=%d\n”, j);
}
for (i = 0; i nV; i++)
{
if (arrMap[j][i] != 0)
{
printf(“%c “, i + ‘A’);
}
}
for (i = 0; i nV; i++)
{
if (arrMap[j][i] != 0)
{
arrMap[j][i] = 0;
spread_prior_scan(i);
}
}
}
因为懒得复制数组,所以两种遍历方法要分开运行,你可以通过打开和关闭对相应函数的注释来得到两次的结果
如何用c语言读取图片
#include
using namespace std;
#define Twoto1(i,j,w) i*w+j
void createimage(unsigned char *img, int w, int h)
{img = new unsigned char[w*h];}
void delateimage(unsigned char*img)
{delete []img;}
void readimage(unsigned char*img, int w, int h, char *fname)
{
FILE *fp;
fopen_s(fp,fname, “rb”);
if (fp == NULL){ cout “error” endl; return; }
size_t result;
result=fread(img , sizeof(unsigned char), w*h, fp);
if (result != w*h)
{
cout “Reading error” endl;
return;
}
else
cout “Reading Ok!” endl;
fclose(fp);
}
void mobanjuanji(unsigned char image, unsigned char*image1, int w, int h, float moban[5][5])
{
for (int i = 0; i for (int j = 0; j if (iw – 3 || jh – 3)
image1[Twoto1(i,j,w)] = 0;
else
{
float temp = 0;
for (int m = 0; m5; m++)
for (int n = 0; n5; n++)
{
temp += (image[Twoto1(i-2+m,j-2+n,w)] moban[m][n]);
}
if (temp255) image1[Twoto1(i, j, w)] = 255;
else if (temp0) image1[Twoto1(i, j, w)] = 0;
else image1[Twoto1(i, j, w)] = temp;
}
}
void saveimage(unsigned char *img, int w, int h, char *fname)
{
FILE *fp;
fopen_s(fp, fname, “wb”);
if (fp == NULL) { cout “error” endl; return; }
size_t result;
result = fwrite(img, sizeof(unsigned char), w*h, fp);
if (result != w*h)
{
cout “Write error” endl;
return;
}
else
cout “Write Ok!” endl;
fclose(fp);
}
void main()
{
unsigned char *img;
unsigned char *img1;
float moban[5][5] = { {0,0,0,0,0},{0, -1, 0, 1, 0 }, { 0, -2, 0, 2, 0 }, { 0, -1, 0, 1, 0 }, { 0,0,0,0,0 } };
//float moban[5][5] = { 0 };
int w = 512, h = 512;
createimage(img, w, h);
createimage(img1, w, h);
readimage(img, w, h, “E:\ss.raw”);
mobanjuanji(img, img1,w, h, moban);
saveimage(img, w, h, “E:\ss_1.raw”);
saveimage(img1, w, h, “E:\ss_2.raw”);
delateimage(img);
delateimage(img1);
}
扩展资料
C语言实现一个图片的读出和写入
#include stdlib.h
#include windows.h
int file_size(char* filename)//获取文件名为filename的文件大小。
{
FILE *fp = fopen(filename, “rb”);//打开文件。
int size;
if(fp == NULL) // 打开文件失败
return -1;
fseek(fp, 0, SEEK_END);//定位文件指针到文件尾。
size=ftell(fp);//获取文件指针偏移量,即文件大小。
fclose(fp);//关闭文件。
return size;
}
int main ()
{
int size=0;
size=file_size(“qw”);
printf(“%d\n”,size);
FILE * pFile,*qw;
char *buffer=(char*)malloc(sizeof(char)*size);
qw =fopen(“qw”,”r”);
pFile = fopen ( “qwe” , “wb” );
printf(“%d==\n”,pFile);
printf(“%d\n”,size);
fread(buffer,1,size,qw);
fwrite (buffer , sizeof(byte), size , pFile );
fclose (pFile);
rename(“qwe”,”Groot.jpg”);
return 0;
}