當前位置:首頁 » 編程語言 » 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個部分, 算出像素數據的偏移量。然後二進制讀文件,保存到數組即可。

熱點內容
怎麼在手機上更改wifi密碼 發布:2025-01-11 07:37:26 瀏覽:335
開機啟動serviceandroid 發布:2025-01-11 07:35:24 瀏覽:523
天龍八部腳本設置自動喊話 發布:2025-01-11 07:31:37 瀏覽:309
硒標准溶液配置為什麼要加鹽酸 發布:2025-01-11 07:27:51 瀏覽:253
怎麼做電腦編程 發布:2025-01-11 07:14:36 瀏覽:481
壓縮圓環 發布:2025-01-11 06:41:37 瀏覽:512
安卓背面是什麼字母 發布:2025-01-11 06:37:55 瀏覽:215
個人小程序怎麼購買雲伺服器 發布:2025-01-11 06:33:08 瀏覽:912
手機mc怎麼玩伺服器國際服 發布:2025-01-11 06:18:33 瀏覽:160
win2008ftp中文亂碼 發布:2025-01-11 06:10:03 瀏覽:871