c语言像素
⑴ c语言数字图像处理怎么显示一张照片的像素值
#include <stdio.h>
#include <windows.h>
int main()
{
	//变量
	char title[255];//用于存放控制台窗口标题
	HWND hwnd;//窗口的句柄,H:Handle
	HDC	hdc, hmemdc;//设备上下文句柄,DC:driver context
	HBITMAP hbm;//图片的句柄 
	BITMAP bm;//图片结构体
	RECT rect;//矩形 rectangle 
	//把控制台窗口调成100字符宽度,40行
	system("mode con cols=100 lines=40");
	
	//1.取得窗口的句柄
	GetConsoleTitleA(title, 255);//获取控制台窗口的标题
	hwnd = FindWindowA(NULL, title);//通过窗口标题取得该窗口的句柄
	//获取窗口的高度和宽度
	GetWindowRect(hwnd, &rect);
	//2. 获取画笔
	hdc = GetDC(hwnd);
/*	if(!hdc)
		printf("No val\n");
	else
		printf("have\n");
	TextOutA(hdc, 300, 400, "Hello world", strlen("Hello world"));*/
	hmemdc = CreateCompatibleDC(hdc);//创建一个兼容的DC
	//3.加载图片
	hbm = (HBITMAP)LoadImageA(NULL, "123.bmp", IMAGE_BITMAP, 0, 0, 
			LR_LOADFROMFILE);
	GetObject(hbm, sizeof(BITMAP), &bm);//得到图片信息
	//4.把图片放入兼容DC中
	SelectObject(hmemdc, hbm);
	
	//5.在窗口上画出图片
	BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hmemdc, 0, 0, SRCCOPY);
	
	DeleteObject(hbm);
	DeleteObject(hmemdc);
	ReleaseDC(hwnd, hdc);	
	return 0;
}
⑵ C语言中如何用I(x,y)表示图像某点的像素值
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、可以变成灰度图也可以不变。这里假设你的图像都是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语言得到jpeg格式或BMP格式的图像的像素的rgb值
原型:
int WINAPI icePub_getImgfilePColor(char *strImgFilename,int x,int y,char *strR,char *strG,char *strB,int flag)
输入:strImgFilename 待处理的图片文件名
      x x坐标
      y y坐标
      flag 输出RGB值的格式,0 10进制,1 16进制
输出:strR R值
      strG G值
      strB B值
返回码:0 OK;-2 x,y值超出图片长宽
int retCode=-1;
char strR[128],strG[128],strB[128];
Cstring m_mem;
typedef int (WINAPI ICEPUB_GETIMGFILEPCOLOR)(char *strImgFilename,int x,int y,char *strR,char *strG,char *strB,int flag);
ICEPUB_GETIMGFILEPCOLOR *icePub_getImgfilePColor = 0;
HINSTANCE hDLLDrv = LoadLibrary("icePubDll.dll");
if(hDLLDrv)
	icePub_getImgfilePColor = (ICEPUB_GETIMGFILEPCOLOR *)GetProcAddress(hDLLDrv, "icePub_getImgfilePColor");
if(icePub_getImgfilePColor)
	retCode=icePub_getImgfilePColor("a.jpg",100,55,strR,strG,strB,0);
if(hDLLDrv)
	FreeLibrary(hDLLDrv);
if(retCode == 0)
	m_mem.Format("(x,y):%d,%d\r\nR:%s\r\nG:%s\r\nB:%s",point.x,point.y,strR,strG,strB);
AfxMessageBox(m_mem);
原型:
int WINAPI icePub_imgToFileTextdata(char *strImgFilename,char *strFilename,char *strFenge,int flag)
输入:strImgFilename 待处理图像文件 (会被强制256级灰度化)
      strFilename 待生成BMP文本数据文件名
strFenge 列之间分隔符
flag 文本数据格式标志:0 10进制; 1 16进制; 10 RGB16进制
输出:
extern "C"
{
__declspec(dllexport)
int WINAPI icePub_imgToFileTextdata(char *strImgFilename,char *strFilename,char *strFenge,int flag);
}
#pragma comment(lib,"icePubDll.lib")
icePub_imgToFileTextdata("a.jpg","bmpdata.txt",",",0);
原型:
char * WINAPI icePub_getBufferFromImg2(char *strImgFilename,int *width,int *height,int huiGrade)
输入:strImgFilename 图片文件名
      huiGrade 图像灰度化标志,0 no; >1 and <=256 灰度级
输出:width 图像宽度
	  height 图像高度
返回值:图像的点阵数据(按照24位BMP格式)
extern "C"
{
__declspec(dllexport)
char * WINAPI icePub_getBufferFromImg2(char *strImgFilename,int *width,int *height,int huiGrade);
}
#pragma comment(lib,"icePubDll.lib")
char *bmpBuffer=NULL;
int imgWidth, imgHeight;
bmpBuffer = icePub_getBufferFromImg2 ("e:\\a.jpg",&imgWidth,&imgHeight,0);
//然后对bmpBuffer数据处理即可
if(bmpBuffer != NULL)
free(bmpBuffer);
⑸ C语言中,怎么让像素闪烁达到像星星的效果
周期性(定时)用两种不同的颜色在同一个点写象素,就有闪烁效果,星星的效果比较麻烦
while(1)
{
putpixel(x,y,BLACK);//黑色
wait(200);//等200ms
putpixel(x,y,color1);//需要的颜色
}
文本模式的话直接修改文本显示属性,字符就会闪烁
⑹ 怎么用c语言把bmp文件里的白色像素转换为红色
代码如下:
#include<stdio.h>
#include<math.h>
#include<Windows.h>
#defineWIDTHBYTES(bits)(((bits)+31)/32*4)
//保存位图
voidSaveBitmap(
PBITMAPFILEHEADERpFileHdr,
PBITMAPINFOHEADERpInfoHdr,
LPRGBQUADpRGBQUAD,
size_tpaletteNum,
constunsignedchar*bmpData,
size_tbmpDataSize,
constchar*file)
{
FILE*pf=fopen(file,"wb");
fwrite(pFileHdr,sizeof(BITMAPFILEHEADER),1,pf);
fwrite(pInfoHdr,sizeof(BITMAPINFOHEADER),1,pf);
if(pRGBQUAD!=NULL){
fwrite(pRGBQUAD,paletteNum*sizeof(RGBQUAD),1,pf);
}
fwrite(bmpData,bmpDataSize,1,pf);
fclose(pf);
}
//转换位图,将白色像素转换为红色
voidConvertBitmap(constchar*file,constchar*new_file)
{
FILE*pf=fopen(file,"rb");
//读取文件头
BITMAPFILEHEADERfileHeader;
memset(&fileHeader,0,sizeof(fileHeader));
fread(&fileHeader,sizeof(fileHeader),1,pf);
//读取信息头
BITMAPINFOHEADERinfoHeader;
memset(&infoHeader,0,sizeof(infoHeader));
fread(&infoHeader,sizeof(infoHeader),1,pf);
switch(infoHeader.biBitCount){
//处理24位位图
case24:{
//读取位图数据
fseek(pf,fileHeader.bfOffBits,SEEK_SET);
unsignedchar*bmpData=(unsignedchar*)malloc(infoHeader.biSizeImage);
fread(bmpData,infoHeader.biSizeImage,1,pf);
//修改位图,将白色像素转换为红色像素,这里只是简单的替换
intwidthBytes=WIDTHBYTES(infoHeader.biWidth*infoHeader.biBitCount);
for(inti=0;i<infoHeader.biHeight;i++){
unsignedchar*line=bmpData+widthBytes*i;
for(intj=0;j<infoHeader.biWidth;j++){
intoffset=j*(infoHeader.biBitCount/8);
if(line[offset]==0xff&&
line[offset+1]==0xff&&
line[offset+2]==0xff){
line[offset]=0x00;
line[offset+1]=0x00;
line[offset+2]=0xff;
}
}
}
//保存
SaveBitmap(&fileHeader,&infoHeader,NULL,0,bmpData,infoHeader.biSizeImage,new_file);
free(bmpData);
break;
}
//处理8位,4位位图
case8:
case4:{
//读取调色板数据
longpaletteNum=(long)pow(2.0,infoHeader.biBitCount);
RGBQUAD*pRGBQUAD=(RGBQUAD*)malloc(paletteNum*sizeof(RGBQUAD));
fread(pRGBQUAD,paletteNum*sizeof(RGBQUAD),1,pf);
//读取位图数据
fseek(pf,fileHeader.bfOffBits,SEEK_SET);
unsignedchar*bmpData=(unsignedchar*)malloc(infoHeader.biSizeImage);
fread(bmpData,infoHeader.biSizeImage,1,pf);
//查找颜色索引
BYTEwhiteIdx=0;
BYTEredIdx=0;
for(longi=0;i<paletteNum;i++){
if(pRGBQUAD[i].rgbRed==0xff&&
pRGBQUAD[i].rgbGreen==0xff&&
pRGBQUAD[i].rgbBlue==0xff){
whiteIdx=i;
}
if(pRGBQUAD[i].rgbRed==0xff&&
pRGBQUAD[i].rgbGreen==0x00&&
pRGBQUAD[i].rgbBlue==0x00){
redIdx=i;
}
}
//修改位图,将白色像素转换为红色像素,这里只是简单的替换
intwidthBytes=WIDTHBYTES(infoHeader.biWidth*infoHeader.biBitCount);
for(inti=0;i<infoHeader.biHeight;i++){
unsignedchar*line=bmpData+widthBytes*i;
for(intj=0;j<widthBytes;j++){
if(infoHeader.biBitCount==8){
if(line[j]==whiteIdx){
line[j]=redIdx;
}
}
elseif(infoHeader.biBitCount==4){
if((line[j]&0x0f)==whiteIdx){
line[j]=line[j]&0xf0|redIdx;
}
if(((line[j]>>4)&0x0f)==whiteIdx){
line[j]=(line[j]&0x0f)|((redIdx<<4)&0xf0);
}
}
}
}
//保存
SaveBitmap(&fileHeader,&infoHeader,pRGBQUAD,paletteNum,bmpData,infoHeader.biSizeImage,new_file);
free(bmpData);
free(pRGBQUAD);
break;
}
}//endofswitch
fclose(pf);
}
intmain()
{
ConvertBitmap("images/test24.bmp","images/test24_new.bmp");
ConvertBitmap("images/test16.bmp","images/test16_new.bmp");
ConvertBitmap("images/test256.bmp","images/test256_new.bmp");
ConvertBitmap("images/test_bin.bmp","images/test_bin_new.bmp");
system("pause");
return0;
}
运行结果:

⑺ 用c语言怎样实现像素的复制
一般要画鼠标用一个8*16的像素位置,你可以自己先定义好数组,然后步骤如下:while(1){如果不是第一次绘制鼠标,则用已保存的图像覆盖曾经鼠标位置.bios中断获取鼠标位置,如果鼠标发生移动(和以前的位置不一样),保存此位置下8*16的图像,保存鼠标位置,绘制鼠标.如果发生CLK事件,则跳出循环,处理你的程序.}
⑻ 如何用C语言(C++)读取位图的像素点RGB信息
pData里面保存的就是一个一个的COLORREF结构,你只需要通过BITMAPINFOHEADER中的宽高等信息,计算位移,就可以读取某个点的RGB值了。
还有一个简单的办法,你之前已经有memBitmap这个CBitmap了,通过这个做更方便。通过SelectObject将memBitmap放到一个CDC中,直接使用函数GetPixel函数就可以获取指定某个点的RGB值了,这个不需要计算和位移。
⑼ 我想用c语言将一个黑白bmp图像的像素值存入一个数组中该怎么做求各位大神帮忙啊~~
先解析bmp图像的格式, windows 下面有 API和bmp头结构,bmp头貌似有3个部分, 算出像素数据的偏移量。然后二进制读文件,保存到数组即可。
