当前位置:首页 » 编程语言 » 图像操作c语言
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

图像操作c语言

发布时间: 2022-07-02 06:56:47

1. 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);
}

2. 在图像处理中c语言哪部分比较重要

C语言比只是一门工具,图像处理算法比较重要。C语言你只要明白指针还有各种地址推算就好了,其他都是浮云。图像处理也大部分都是指针操作,比如加载位图、对图像进行卷积等等,都是拿到图像的内存块起始地址的指针,然后再到具体的图像某个像素点在内存上的位置,做运算的。

3. 利用c语言怎样对bmp图像进行平移的操作

位图平移没有这方面的库函数,必须自己来实现,下面是位图平移的参考代码:


#include "stdafx.h"

#include<windows.h>

#include<stdio.h>

#include<math.h>

int _tmain(int argc, _TCHAR* argv[])

{

int width;

int height;

RGBQUAD *pTableColor;

unsigned char *pBmpBuf1,*pBmpBuf2;

BITMAPFILEHEADER bfhead;

BITMAPINFOHEADER bihead;

//读出源图像的信息

FILE *fpr=fopen("E:\picture\dog.bmp","rb");

if(fpr==0)

return 0;

fread(&bfhead,14,1,fpr);

fread(&bihead,40,1,fpr);

width=bihead.biWidth;

height=bihead.biHeight;

int LineByte=(width*8/8+3)/4*4;

pTableColor=new RGBQUAD[256];

fread(pTableColor,sizeof(RGBQUAD),256,fpr);

pBmpBuf1=new unsigned char[LineByte*height];

fread(pBmpBuf1,LineByte*height,1,fpr);

fclose(fpr);

//将处理后的图像赋值为白色

pBmpBuf2=new unsigned char[LineByte*height];

for(int i=0;i<height;i++)

for(int j=0;j<width;j++)

{

unsigned char *p;

p=(unsigned char*)(pBmpBuf2+LineByte*i+j);

(*p)=255;

}

//左右平移功能的实现

int t;

printf("请输入左平移或右平移的大小t(左移t<0,右移t>0):");

scanf("%d",&t);

int k=abs(t);

printf("%d",k);

if(t<0)

{

if(t>=(-width))

{

for(int i=0;i<height;i++)

for(int j=0;j<(width-k);j++)

{

unsigned char *p1,*p2;

p1=pBmpBuf1+LineByte*i+j+k;

p2=pBmpBuf2+LineByte*i+j;

(*p2)=(*p1);

}

}

}

else

{

if(t<=width)

{

for(int i=0;i<height;i++)

for(int j=k;j<width;j++)

{

unsigned char *p1,*p2;

p1=pBmpBuf1+LineByte*i+j-k;

p2=pBmpBuf2+LineByte*i+j;

(*p2)=(*p1);

}

}

}

//保存处理后的图像

FILE *fpw=fopen("dog.bmp","wb");

fwrite(&bfhead,14,1,fpw);

fwrite(&bihead,40,1,fpw);

fwrite(pTableColor,sizeof(RGBQUAD),256,fpw);

fwrite(pBmpBuf2,LineByte*height,1,fpw);

fclose(fpw);

return 0;

}

4. c语言,简易图像编程处理

看工具是什么。甚至具体需求是什么。
GDI/DX/OPENGL都可以在像素RGB值上直接处理。
等于做离屏渲染。
也可以利用游戏引擎现有的工具库直接实现这些逗比效果。

5. 如何用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 || j>h - 3)

image1[Twoto1(i,j,w)] = 0;

else

{

float temp = 0;

for (int m = 0; m<5; m++)

for (int n = 0; n<5; n++)

{

temp += (image[Twoto1(i-2+m,j-2+n,w)] moban[m][n]);

}

if (temp>255) image1[Twoto1(i, j, w)] = 255;

else if (temp<0) 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);

}

(5)图像操作c语言扩展阅读

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 ",size);

FILE * pFile,*qw;

char *buffer=(char*)malloc(sizeof(char)*size);

qw =fopen("qw","r");

pFile = fopen ( "qwe" , "wb" );

printf("%d== ",pFile);

printf("%d ",size);

fread(buffer,1,size,qw);

fwrite (buffer , sizeof(byte), size , pFile );

fclose (pFile);

rename("qwe","Groot.jpg");

return 0;

}

6. 怎样用c语言对bmp图像进行线性拉伸

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>

usingnamespacestd;
usingnamespacecv;


MatXianChange(Mat&img,doublealt,intbase)//灰度线性变化、
{
CV_Assert(img.depth()!=sizeof(uchar));//声明只对深度8bit的图像操作
Mattemp=img.clone();

intchannels=img.channels();//获取图像channel
intnrows=img.rows;//矩阵的行数
intncols=img.cols*channels;//矩阵的总列数=列数*channel分量数
if(img.isContinuous())//判断矩阵是否连续,若连续,我们相当于只需要遍历一个一维数组
{
ncols*=nrows;
nrows=1;//一维数组
}
//遍历像素点灰度值
for(inti=0;i<nrows;i++)
{
uchar*p=temp.ptr<uchar>(i);//获取行地址
for(intj=0;j<ncols;j++)
{
p[j]=alt*p[j]+base;//修改灰度值

if(p[j]>255)
p[j]=255;
if(p[j]<0)
p[j]=0;
}
}
returntemp;
}

MatXianStretch(Mat&img,inta,intb,intc,intd)//线性灰度拉伸,将[a,b]拉伸到[c,d]
{
CV_Assert(img.depth()!=sizeof(uchar));//声明只对深度8bit的图像操作
Mattemp=img.clone();

intchannels=img.channels();//获取图像channel
intnrows=img.rows;//矩阵的行数
intncols=img.cols*channels;//矩阵的总列数=列数*channel分量数
if(img.isContinuous())//判断矩阵是否连续,若连续,我们相当于只需要遍历一个一维数组
{
ncols*=nrows;
nrows=1;//一维数组
}
//遍历像素点灰度值
for(inti=0;i<nrows;i++)
{
uchar*p=temp.ptr<uchar>(i);//获取行地址
for(intj=0;j<ncols;j++)
{
if(p[j]<a)
p[j]=c/b*p[j];
elseif(p[j]>a&&p[j]<b)
p[j]=(d-c)/(b-a)*(p[j]-a)+c;
else
p[j]=(255-d)/(255-b)*(p[j]-b)+d;
}
}
returntemp;
}

MatHistogramEqu(Mat&img)//直方均衡
{
CV_Assert(img.depth()!=sizeof(uchar));//声明只对深度8bit的图像操作
Mattemp=img.clone();
intgrayNum[260]={0};
intgrayMap[260]={0};

intchannels=img.channels();//获取图像channel
intnrows=img.rows;//矩阵的行数
intncols=img.cols*channels;//矩阵的总列数=列数*channel分量数
intallPixel=nrows*ncols;//图像的像素总数
intc;//用于计算累积分布概率

if(img.isContinuous())//判断矩阵是否连续,若连续,我们相当于只需要遍历一个一维数组
{
ncols*=nrows;
nrows=1;//一维数组
}
//遍历像素点灰度值
for(inti=0;i<nrows;i++)
{
uchar*p=temp.ptr<uchar>(i);//获取行地址
for(intj=0;j<ncols;j++)
{
grayNum[p[j]]++;//原图像的直方图
}
}

for(inti=0;i<256;i++)//重新定义新的直方图
{
c=0;
for(intj=0;j<=i;j++)
{
c+=grayNum[j];
grayMap[i]=int(255*c/allPixel);

}
//printf("%d%d ",i,grayMap[i]);
} for(inti=0;i<nrows;i++)//重新定义新的直方图
{
uchar*p=temp.ptr<uchar>(i);//获取行地址
for(intj=0;j<ncols;j++)
{
p[j]=grayMap[p[j]];
}
}
returntemp;
}

intmain()
{
stringpicName="lena256.jpg";
MatA=imread(picName,CV_LOAD_IMAGE_GRAYSCALE);//读入灰度图像

imshow("变换前",A);

MatB=XianChange(A,1,20);//根据需要设置不同的参数
imshow("线性变换后",B);

MatC=XianStretch(A,10,100,20,50);//根据需要设置不同的参数
imshow("线性拉伸后",C);

MatD=HistogramEqu(A);
imshow("直方均衡后",D);

waitKey();
return0;
}

7. 请教C语言处理图像的问题

C语言处理图像主要还是数学问题,比如滤波、傅立叶变换等都是在数学理论的基础上对图像的像素进行操作的。当然你操作之前还要知道你处理的图像是什么格式的,这种图片的存储特点,头部信息等

8. 纯C语言实现图像处理

这个不难吧?虽然我不用c,可是说下怎么做,首先打开一个BMP文件,然后按照bmp格式解析到一个数组中,接着进行二值化(这个有很多方法),最后将数组中的数据写入一个新的BMP文件就可以了。

9. c语言处理图像文件

opencv做图像处理比较专业,用纯C语言的话处理bmp图像比较方便,因为信息是直接按字节存储的,其他格式因为有压缩的问题,比较麻烦,我以前写过一个处理bmp的程序,如果你要的话可以网络hi联系我,或者留下邮箱发给你。

10. 怎样用c语言编写图像程序

看看《
计算机图形学
》,
在c语言的
函数库
里能看到编写图象程序使用的函数,好象在Graphics.h里。