当前位置:首页 » 编程语言 » c语言像素

c语言像素

发布时间: 2022-11-05 11:26:40

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

热点内容
财务信息服务器搭建 发布:2025-01-11 04:48:09 浏览:875
算法实现过程 发布:2025-01-11 04:43:45 浏览:457
瞄准下载ftp 发布:2025-01-11 04:43:44 浏览:573
校园电影脚本 发布:2025-01-11 04:32:08 浏览:437
现在手机配置最高是什么 发布:2025-01-11 04:30:37 浏览:549
学信网默认密码是多少 发布:2025-01-11 04:25:45 浏览:530
jdbctemplate调用存储过程 发布:2025-01-11 04:25:41 浏览:256
我的世界怎么不用钱创建服务器 发布:2025-01-11 04:25:39 浏览:283
打卡机数据库 发布:2025-01-11 04:18:36 浏览:916
制作产业项目视频脚本 发布:2025-01-11 04:10:14 浏览:186