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个部分, 算出像素数据的偏移量。然后二进制读文件,保存到数组即可。